⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smacdig.c

📁 A staff Module ListA staff Module ListA staff Module ListA staff Module ListA staff Module ListA sta
💻 C
字号:
/* *************************************************************************

   Smart Card Digging Utilities. 
   Objects detection tool

   Written by Ilya O. Levin, http://www.literatecode.com    

   This source code released for free "as is" under the whatever ABC 
   license without warranty or liability of any kind. Use it at your 
   own risk any way you like for legitimate purposes only. 

   ************************************************************************* 
*/

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include "pcscwrap.h"

static unsigned short dir[256] = {0};
static unsigned short startid = 1;
static unsigned int  idr = 0;

long scan_dir(sc_context *);

int main(int argc, char* argv[])
{
  sc_context ctx = {0}; 
  long rc, i;
  char *c, *a; 

  printf("SMACDIG. Smart Card Digging Utilities. Version 0.50720 by "
         "Ilya O. Levin\nRaw and uncondition detection of DF/EF objects "
         "within smart cards\n\n");

  if (argc>1) c = argv[1]; else
  {
    printf("Usage: smacdig reader [target [initial id]]\n\n"
           "Examples:\n\t smacdig axalto\n"
           "\t smacdig \"AKS ifdh\" 3f00/6666 1FFE\n" );
    c=sc_listreaders();
    if (c)
    {
      printf("\nAvailable readers:\n");
      a = strtok(c, "\n"); 
      while (a != NULL) { printf("* %s\n", a); a = strtok(NULL, "\n");}
    }
    else printf("Unable to list smart card readers\n");
    free (c);
    return 0;
  }

  if (argc>2)
  {
    a = strtok(argv[2], "/\\");
    while (a != NULL)
    {
      dir[idr++] = (unsigned short) strtoul(a, NULL, 16); 
      if (idr == 255) break;
      a = strtok(NULL, "/\\");
    }
  }
  if (idr<1) dir[idr++] = 0x3f00;

  if (argc>3) startid = (unsigned short) strtoul(argv[3], NULL, 16); 
 
  printf("* connecting to \"%s\" - ", c);
  rc = sc_init(&ctx, c); 
  if (rc == SC_OK)
  {
    printf("ok\n* Active reader: \"%s\"\n* Target: ", ctx.rdr);
    for (rc=0;rc<(int)idr;rc++) printf("/%04x", dir[rc]); printf("\n");

    printf("* probing for commands class - ");
    rc = sc_selectfile(&ctx, 0x3f00);
    for (i=0; (rc==SC_OK)&&(ctx.sw[0]!=0x61)&&(ctx.sw[0]!=0x90)&&(i<256) ;i++)
    {
       ctx.CLA = (unsigned char) i; rc = sc_selectfile(&ctx, 0x3f00);
    }
    if ( (ctx.sw[0]!=0x61) && (ctx.sw[0]!=0x90) ) printf("failed\n"); else
    {
       printf("ok [CLA:%02x]\n* enumerating from %04x\n", ctx.CLA, startid);
       rc=scan_dir(&ctx);
       printf("* enumeration %s\n", (rc==SC_OK)?"done":"failed");
    }
    sc_finish(&ctx);
  } 
  else printf("failed (%s)\n", rc_symb(rc));

  return 0;
} /* main */

/* -------------------------------------------------------------------------- */
long scan_dir(sc_context *ctx)
{
  long rc = SC_BAD;
  unsigned long ff, sz;
  register unsigned char i;

  if (idr==0) return SC_BAD; 

  for (ff = startid; ff<0xFFFF; ff++)
  {
     if (kbhit()) break;
     if ( (ff==0x3F00) || (ff==0x3fff) ) continue;
     for (i=0;i<idr; i++) if ((rc = sc_selectfile(ctx, dir[i]))!=SC_OK) break;
     if (ff % 128 == 0 ) printf("%04x\r", ff); 
     if (rc == SC_OK) rc = sc_selectfile(ctx, ff); 
     if (rc != SC_OK) { printf(" failed (%s)\n", rc_symb(rc)); break;}
     if ( (ctx->sw[0] == 0x90) || (ctx->sw[0] == 0x61) )  /* object selected */
     {
        printf("+ %04x", ff);
        sz = ctx->sw[1];
        if (ctx->sw[0] == 0x61) if (sc_getresponse(ctx) == SC_OK) 
        { 
           printf(": "); for (i=0;i<sz;i++) printf("%02x", ctx->sw[i]);
        }
        rc = sc_readdata(ctx, 8, 0);
        if ( (rc == SC_OK) && (ctx->sw[0] == 0x69) && (ctx->sw[1] == 0x86) 
           ) printf(": DIR");
        printf("\n");
     }
     else if (ctx->sw[0] != 0x6A) 
             printf("%04x [SW=%02x%02x]\n", ff, ctx->sw[0], ctx->sw[1]);
  }

  while (kbhit()) getch();

  return rc;
} /* scan_dir */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -