]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfhid.c
   1 //----------------------------------------------------------------------------- 
   2 // Copyright (C) 2010 iZsh <izsh at fail0verflow.com> 
   4 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   5 // at your option, any later version. See the LICENSE.txt file for the text of 
   7 //----------------------------------------------------------------------------- 
   8 // Low frequency HID commands 
   9 //----------------------------------------------------------------------------- 
  14 #include "proxmark3.h" 
  17 #include "cmdparser.h" 
  18 #include "cmddata.h"  //for g_debugMode, demodbuff cmds 
  19 #include "lfdemod.h" // for HIDdemodFSK 
  21 static int CmdHelp(const char *Cmd
); 
  23 //by marshmellow (based on existing demod + holiman's refactor) 
  24 //HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded) 
  25 //print full HID Prox ID and some bit format details if found 
  26 int CmdFSKdemodHID(const char *Cmd
) 
  28   //raw fsk demod no manchester decoding no start bit finding just get binary from wave 
  29   uint32_t hi2
=0, hi
=0, lo
=0; 
  31   uint8_t BitStream
[MAX_GRAPH_TRACE_LEN
]={0}; 
  32   size_t BitLen 
= getFromGraphBuf(BitStream
); 
  33   if (BitLen
==0) return 0; 
  34   //get binary from fsk wave 
  35   int idx 
= HIDdemodFSK(BitStream
,&BitLen
,&hi2
,&hi
,&lo
); 
  39         PrintAndLog("DEBUG: Just Noise Detected"); 
  40       } else if (idx 
== -2) { 
  41         PrintAndLog("DEBUG: Error demoding fsk"); 
  42       } else if (idx 
== -3) { 
  43         PrintAndLog("DEBUG: Preamble not found"); 
  44       } else if (idx 
== -4) { 
  45         PrintAndLog("DEBUG: Error in Manchester data, SIZE: %d", BitLen
); 
  47         PrintAndLog("DEBUG: Error demoding fsk %d", idx
); 
  52   if (hi2
==0 && hi
==0 && lo
==0) { 
  53     if (g_debugMode
) PrintAndLog("DEBUG: Error - no values found"); 
  56   if (hi2 
!= 0){ //extra large HID tags 
  57     PrintAndLog("HID Prox TAG ID: %x%08x%08x (%d)", 
  58        (unsigned int) hi2
, (unsigned int) hi
, (unsigned int) lo
, (unsigned int) (lo
>>1) & 0xFFFF); 
  60   else {  //standard HID tags <38 bits 
  64     if (((hi
>>5)&1)==1){//if bit 38 is set then < 37 bit format is used 
  66       lo2
=(((hi 
& 31) << 12) | (lo
>>20)); //get bits 21-37 to check for format len bit 
  68       while(lo2
>1){ //find last bit set to 1 (format len bit) 
  76         cardnum 
= (lo
>>1)&0xFFFF; 
  80         cardnum 
= (lo
>>1)&0xFFFF; 
  81         fc
= ((hi
&1)<<15)|(lo
>>17); 
  84         cardnum 
= (lo
>>1)&0xFFFFF; 
  85         fc 
= ((hi
&1)<<11)|(lo
>>21); 
  88     else { //if bit 38 is not set then 37 bit format is used 
  93         cardnum 
= (lo
>>1)&0x7FFFF; 
  94         fc 
= ((hi
&0xF)<<12)|(lo
>>20); 
  97     PrintAndLog("HID Prox TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d", 
  98       (unsigned int) hi
, (unsigned int) lo
, (unsigned int) (lo
>>1) & 0xFFFF, 
  99       (unsigned int) fmtLen
, (unsigned int) fc
, (unsigned int) cardnum
); 
 101   setDemodBuf(BitStream
,BitLen
,idx
); 
 103     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx
, BitLen
); 
 109 int CmdHIDReadFSK(const char *Cmd
) 
 112         if(Cmd
[0]=='1') findone
=1; 
 113   UsbCommand c
={CMD_HID_DEMOD_FSK
}; 
 119 int CmdHIDSim(const char *Cmd
) 
 121   unsigned int hi 
= 0, lo 
= 0; 
 124   while (sscanf(&Cmd
[i
++], "%1x", &n 
) == 1) { 
 125     hi 
= (hi 
<< 4) | (lo 
>> 28); 
 126     lo 
= (lo 
<< 4) | (n 
& 0xf); 
 129   PrintAndLog("Emulating tag with ID %x%16x", hi
, lo
); 
 130   PrintAndLog("Press pm3-button to abort simulation"); 
 132   UsbCommand c 
= {CMD_HID_SIM_TAG
, {hi
, lo
, 0}}; 
 137 int CmdHIDClone(const char *Cmd
) 
 139   unsigned int hi2 
= 0, hi 
= 0, lo 
= 0; 
 143   if (strchr(Cmd
,'l') != 0) { 
 144         while (sscanf(&Cmd
[i
++], "%1x", &n 
) == 1) { 
 145       hi2 
= (hi2 
<< 4) | (hi 
>> 28); 
 146       hi 
= (hi 
<< 4) | (lo 
>> 28); 
 147       lo 
= (lo 
<< 4) | (n 
& 0xf); 
 150     PrintAndLog("Cloning tag with long ID %x%08x%08x", hi2
, hi
, lo
); 
 155         while (sscanf(&Cmd
[i
++], "%1x", &n 
) == 1) { 
 156       hi 
= (hi 
<< 4) | (lo 
>> 28); 
 157       lo 
= (lo 
<< 4) | (n 
& 0xf); 
 160     PrintAndLog("Cloning tag with ID %x%08x", hi
, lo
); 
 166   c
.cmd 
= CMD_HID_CLONE_TAG
; 
 175 static command_t CommandTable
[] =  
 177   {"help",      CmdHelp
,        1, "This help"}, 
 178   {"demod",     CmdFSKdemodHID
, 1, "Demodulate HID Prox from GraphBuffer"}, 
 179   {"read",      CmdHIDReadFSK
,  0, "['1'] Realtime HID FSK Read from antenna (option '1' for one tag only)"}, 
 180   {"sim",       CmdHIDSim
,      0, "<ID> -- HID tag simulator"}, 
 181   {"clone",     CmdHIDClone
,    0, "<ID> ['l'] -- Clone HID to T55x7 (tag must be in antenna)(option 'l' for 84bit ID)"}, 
 182   {NULL
, NULL
, 0, NULL
} 
 185 int CmdLFHID(const char *Cmd
) 
 187   CmdsParse(CommandTable
, Cmd
); 
 191 int CmdHelp(const char *Cmd
) 
 193   CmdsHelp(CommandTable
);