]>
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 //-----------------------------------------------------------------------------
13 #include "proxmark3.h"
16 #include "cmdparser.h"
17 #include "cmddata.h" //for g_debugMode, demodbuff cmds
18 #include "lfdemod.h" // for HIDdemodFSK
20 static int CmdHelp(const char *Cmd
);
22 //by marshmellow (based on existing demod + holiman's refactor)
23 //HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded)
24 //print full HID Prox ID and some bit format details if found
25 int CmdFSKdemodHID(const char *Cmd
)
27 //raw fsk demod no manchester decoding no start bit finding just get binary from wave
28 uint32_t hi2
=0, hi
=0, lo
=0;
30 uint8_t BitStream
[MAX_GRAPH_TRACE_LEN
]={0};
31 size_t BitLen
= getFromGraphBuf(BitStream
);
32 if (BitLen
==0) return 0;
33 //get binary from fsk wave
34 int idx
= HIDdemodFSK(BitStream
,&BitLen
,&hi2
,&hi
,&lo
);
38 PrintAndLog("DEBUG: Just Noise Detected");
39 } else if (idx
== -2) {
40 PrintAndLog("DEBUG: Error demoding fsk");
41 } else if (idx
== -3) {
42 PrintAndLog("DEBUG: Preamble not found");
43 } else if (idx
== -4) {
44 PrintAndLog("DEBUG: Error in Manchester data, SIZE: %d", BitLen
);
46 PrintAndLog("DEBUG: Error demoding fsk %d", idx
);
51 if (hi2
==0 && hi
==0 && lo
==0) {
52 if (g_debugMode
) PrintAndLog("DEBUG: Error - no values found");
55 if (hi2
!= 0){ //extra large HID tags
56 PrintAndLog("HID Prox TAG ID: %x%08x%08x (%d)",
57 (unsigned int) hi2
, (unsigned int) hi
, (unsigned int) lo
, (unsigned int) (lo
>>1) & 0xFFFF);
59 else { //standard HID tags <38 bits
63 if (((hi
>>5)&1)==1){//if bit 38 is set then < 37 bit format is used
65 lo2
=(((hi
& 31) << 12) | (lo
>>20)); //get bits 21-37 to check for format len bit
67 while(lo2
>1){ //find last bit set to 1 (format len bit)
75 cardnum
= (lo
>>1)&0xFFFF;
79 cardnum
= (lo
>>1)&0xFFFF;
80 fc
= ((hi
&1)<<15)|(lo
>>17);
83 cardnum
= (lo
>>1)&0xFFFFF;
84 fc
= ((hi
&1)<<11)|(lo
>>21);
87 else { //if bit 38 is not set then 37 bit format is used
92 cardnum
= (lo
>>1)&0x7FFFF;
93 fc
= ((hi
&0xF)<<12)|(lo
>>20);
96 PrintAndLog("HID Prox TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
97 (unsigned int) hi
, (unsigned int) lo
, (unsigned int) (lo
>>1) & 0xFFFF,
98 (unsigned int) fmtLen
, (unsigned int) fc
, (unsigned int) cardnum
);
100 setDemodBuf(BitStream
,BitLen
,idx
);
102 PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx
, BitLen
);
108 int CmdHIDReadFSK(const char *Cmd
)
111 if(Cmd
[0]=='1') findone
=1;
112 UsbCommand c
={CMD_HID_DEMOD_FSK
};
118 int CmdHIDSim(const char *Cmd
)
120 unsigned int hi
= 0, lo
= 0;
123 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
124 hi
= (hi
<< 4) | (lo
>> 28);
125 lo
= (lo
<< 4) | (n
& 0xf);
128 PrintAndLog("Emulating tag with ID %x%16x", hi
, lo
);
129 PrintAndLog("Press pm3-button to abort simulation");
131 UsbCommand c
= {CMD_HID_SIM_TAG
, {hi
, lo
, 0}};
136 int CmdHIDClone(const char *Cmd
)
138 unsigned int hi2
= 0, hi
= 0, lo
= 0;
142 if (strchr(Cmd
,'l') != 0) {
143 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
144 hi2
= (hi2
<< 4) | (hi
>> 28);
145 hi
= (hi
<< 4) | (lo
>> 28);
146 lo
= (lo
<< 4) | (n
& 0xf);
149 PrintAndLog("Cloning tag with long ID %x%08x%08x", hi2
, hi
, lo
);
154 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
155 hi
= (hi
<< 4) | (lo
>> 28);
156 lo
= (lo
<< 4) | (n
& 0xf);
159 PrintAndLog("Cloning tag with ID %x%08x", hi
, lo
);
165 c
.cmd
= CMD_HID_CLONE_TAG
;
174 static command_t CommandTable
[] =
176 {"help", CmdHelp
, 1, "This help"},
177 {"demod", CmdFSKdemodHID
, 1, "Demodulate HID Prox from GraphBuffer"},
178 {"read", CmdHIDReadFSK
, 0, "['1'] Realtime HID FSK Read from antenna (option '1' for one tag only)"},
179 {"sim", CmdHIDSim
, 0, "<ID> -- HID tag simulator"},
180 {"clone", CmdHIDClone
, 0, "<ID> ['l'] -- Clone HID to T55x7 (tag must be in antenna)(option 'l' for 84bit ID)"},
181 {NULL
, NULL
, 0, NULL
}
184 int CmdLFHID(const char *Cmd
)
186 CmdsParse(CommandTable
, Cmd
);
190 int CmdHelp(const char *Cmd
)
192 CmdsHelp(CommandTable
);