]>
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 (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
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
);
102 setClockGrid(g_DemodClock
, g_DemodStartIdx
+ (idx
*g_DemodClock
));
104 PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx
, BitLen
);
110 int CmdHIDReadFSK(const char *Cmd
)
113 if(Cmd
[0]=='1') findone
=1;
114 UsbCommand c
={CMD_HID_DEMOD_FSK
};
120 int CmdHIDSim(const char *Cmd
)
122 unsigned int hi
= 0, lo
= 0;
125 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
126 hi
= (hi
<< 4) | (lo
>> 28);
127 lo
= (lo
<< 4) | (n
& 0xf);
130 PrintAndLog("Emulating tag with ID %x%16x", hi
, lo
);
131 PrintAndLog("Press pm3-button to abort simulation");
133 UsbCommand c
= {CMD_HID_SIM_TAG
, {hi
, lo
, 0}};
138 int CmdHIDClone(const char *Cmd
)
140 unsigned int hi2
= 0, hi
= 0, lo
= 0;
144 if (strchr(Cmd
,'l') != 0) {
145 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
146 hi2
= (hi2
<< 4) | (hi
>> 28);
147 hi
= (hi
<< 4) | (lo
>> 28);
148 lo
= (lo
<< 4) | (n
& 0xf);
151 PrintAndLog("Cloning tag with long ID %x%08x%08x", hi2
, hi
, lo
);
156 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
157 hi
= (hi
<< 4) | (lo
>> 28);
158 lo
= (lo
<< 4) | (n
& 0xf);
161 PrintAndLog("Cloning tag with ID %x%08x", hi
, lo
);
167 c
.cmd
= CMD_HID_CLONE_TAG
;
176 static command_t CommandTable
[] =
178 {"help", CmdHelp
, 1, "This help"},
179 {"demod", CmdFSKdemodHID
, 1, "Demodulate HID Prox from GraphBuffer"},
180 {"read", CmdHIDReadFSK
, 0, "['1'] Realtime HID FSK Read from antenna (option '1' for one tag only)"},
181 {"sim", CmdHIDSim
, 0, "<ID> -- HID tag simulator"},
182 {"clone", CmdHIDClone
, 0, "<ID> ['l'] -- Clone HID to T55x7 (tag must be in antenna)(option 'l' for 84bit ID)"},
183 {NULL
, NULL
, 0, NULL
}
186 int CmdLFHID(const char *Cmd
)
188 CmdsParse(CommandTable
, Cmd
);
192 int CmdHelp(const char *Cmd
)
194 CmdsHelp(CommandTable
);