]>
git.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 (known)
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
36 int idx
= HIDdemodFSK(BitStream
,&BitLen
,&hi2
,&hi
,&lo
, &waveIdx
);
40 PrintAndLog("DEBUG: Just Noise Detected");
41 } else if (idx
== -2) {
42 PrintAndLog("DEBUG: Error demoding fsk");
43 } else if (idx
== -3) {
44 PrintAndLog("DEBUG: Preamble not found");
45 } else if (idx
== -4) {
46 PrintAndLog("DEBUG: Error in Manchester data, SIZE: %d", BitLen
);
48 PrintAndLog("DEBUG: Error demoding fsk %d", idx
);
53 if (hi2
==0 && hi
==0 && lo
==0) {
54 if (g_debugMode
) PrintAndLog("DEBUG: Error - no values found");
57 if (hi2
!= 0){ //extra large HID tags
58 PrintAndLog("HID Prox TAG ID: %x%08x%08x (%d)",
59 (unsigned int) hi2
, (unsigned int) hi
, (unsigned int) lo
, (unsigned int) (lo
>>1) & 0xFFFF);
61 else { //standard HID tags <38 bits
65 if (((hi
>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
67 lo2
=(((hi
& 31) << 12) | (lo
>>20)); //get bits 21-37 to check for format len bit
69 while(lo2
>1){ //find last bit set to 1 (format len bit)
77 cardnum
= (lo
>>1)&0xFFFF;
81 cardnum
= (lo
>>1)&0xFFFF;
82 fc
= ((hi
&1)<<15)|(lo
>>17);
85 cardnum
= (lo
>>1)&0xFFFFF;
86 fc
= ((hi
&1)<<11)|(lo
>>21);
89 else { //if bit 38 is not set then 37 bit format is used
94 cardnum
= (lo
>>1)&0x7FFFF;
95 fc
= ((hi
&0xF)<<12)|(lo
>>20);
98 PrintAndLog("HID Prox TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
99 (unsigned int) hi
, (unsigned int) lo
, (unsigned int) (lo
>>1) & 0xFFFF,
100 (unsigned int) fmtLen
, (unsigned int) fc
, (unsigned int) cardnum
);
102 setDemodBuf(BitStream
,BitLen
,idx
);
103 setClockGrid(50, waveIdx
+ (idx
*50));
105 PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx
, BitLen
);
111 int CmdHIDReadFSK(const char *Cmd
)
114 if(Cmd
[0]=='1') findone
=1;
115 UsbCommand c
={CMD_HID_DEMOD_FSK
};
121 int CmdHIDSim(const char *Cmd
)
123 uint32_t hi
= 0, lo
= 0;
126 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
127 hi
= (hi
<< 4) | (lo
>> 28);
128 lo
= (lo
<< 4) | (n
& 0xf);
131 PrintAndLog("Emulating tag with ID %x%08x", hi
, lo
);
132 PrintAndLog("Press pm3-button to abort simulation");
134 UsbCommand c
= {CMD_HID_SIM_TAG
, {hi
, lo
, 0}};
139 int CmdHIDClone(const char *Cmd
)
141 unsigned int hi2
= 0, hi
= 0, lo
= 0;
145 if (strchr(Cmd
,'l') != 0) {
146 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
147 hi2
= (hi2
<< 4) | (hi
>> 28);
148 hi
= (hi
<< 4) | (lo
>> 28);
149 lo
= (lo
<< 4) | (n
& 0xf);
152 PrintAndLog("Cloning tag with long ID %x%08x%08x", hi2
, hi
, lo
);
157 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
158 hi
= (hi
<< 4) | (lo
>> 28);
159 lo
= (lo
<< 4) | (n
& 0xf);
162 PrintAndLog("Cloning tag with ID %x%08x", hi
, lo
);
168 c
.cmd
= CMD_HID_CLONE_TAG
;
177 static command_t CommandTable
[] =
179 {"help", CmdHelp
, 1, "This help"},
180 {"demod", CmdFSKdemodHID
, 1, "Demodulate HID Prox from GraphBuffer"},
181 {"read", CmdHIDReadFSK
, 0, "['1'] Realtime HID FSK Read from antenna (option '1' for one tag only)"},
182 {"sim", CmdHIDSim
, 0, "<ID> -- HID tag simulator"},
183 {"clone", CmdHIDClone
, 0, "<ID> ['l'] -- Clone HID to T55x7 (tag must be in antenna)(option 'l' for 84bit ID)"},
184 {NULL
, NULL
, 0, NULL
}
187 int CmdLFHID(const char *Cmd
)
189 CmdsParse(CommandTable
, Cmd
);
193 int CmdHelp(const char *Cmd
)
195 CmdsHelp(CommandTable
);