monster merge...

all those changes marshmellow did..  and more...
This commit is contained in:
iceman1001 2017-07-30 09:17:48 +02:00
commit f28da2da6e
107 changed files with 5087 additions and 3777 deletions

View file

@ -30,11 +30,16 @@ int usage_lf_cmdread(void) {
return 0;
}
int usage_lf_read(void){
PrintAndLog("Usage: lf read [h] [s]");
PrintAndLog("Usage: lf read [h] [s] [d numofsamples]");
PrintAndLog("Options:");
PrintAndLog(" h This help");
PrintAndLog(" s silent run no printout");
PrintAndLog(" d #samples # samples to collect (optional)");
PrintAndLog("Use 'lf config' to set parameters.");
PrintAndLog("");
PrintAndLog("Samples:");
PrintAndLog(" lf read s d 12000 - collects 12000samples silent");
PrintAndLog(" lf read s");
return 0;
}
int usage_lf_snoop(void) {
@ -42,6 +47,8 @@ int usage_lf_snoop(void) {
PrintAndLog("Usage: lf snoop [h]");
PrintAndLog("Options:");
PrintAndLog(" h This help");
PrintAndLog("This function takes no arguments. ");
PrintAndLog("Use 'lf config' to set parameters.");
return 0;
}
int usage_lf_config(void) {
@ -244,234 +251,6 @@ int CmdFlexdemod(const char *Cmd)
RepaintGraphWindow();
return 0;
}
int CmdIndalaDemod(const char *Cmd)
{
// PSK1, Bitrate 32,
// Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID
int state = -1;
int count = 0;
int i, j;
// worst case with GraphTraceLen=64000 is < 4096
// under normal conditions it's < 2048
uint8_t rawbits[4096];
int rawbit = 0, worst = 0, worstPos = 0;
// PrintAndLog("Expecting a bit less than %d raw bits", GraphTraceLen / 32);
// loop through raw signal - since we know it is psk1 rf/32 fc/2 skip every other value (+=2)
for (i = 0; i < GraphTraceLen-1; i += 2) {
count += 1;
if ((GraphBuffer[i] > GraphBuffer[i + 1]) && (state != 1)) {
// appears redundant - marshmellow
if (state == 0) {
for (j = 0; j < count - 8; j += 16) {
rawbits[rawbit++] = 0;
}
if ((abs(count - j)) > worst) {
worst = abs(count - j);
worstPos = i;
}
}
state = 1;
count = 0;
} else if ((GraphBuffer[i] < GraphBuffer[i + 1]) && (state != 0)) {
//appears redundant
if (state == 1) {
for (j = 0; j < count - 8; j += 16) {
rawbits[rawbit++] = 1;
}
if ((abs(count - j)) > worst) {
worst = abs(count - j);
worstPos = i;
}
}
state = 0;
count = 0;
}
}
if ( rawbit<1 ) return 0;
if (g_debugMode) {
PrintAndLog("Recovered %d raw bits, expected: %d", rawbit, GraphTraceLen/32);
PrintAndLog("worst metric (0=best..7=worst): %d at pos %d", worst, worstPos);
}
// Finding the start of a UID
int uidlen, long_wait;
if (strcmp(Cmd, "224") == 0) {
uidlen = 224;
long_wait = 30;
} else {
uidlen = 64;
long_wait = 29;
}
int start;
int first = 0;
for (start = 0; start <= rawbit - uidlen; start++) {
first = rawbits[start];
for (i = start; i < start + long_wait; i++) {
if (rawbits[i] != first) {
break;
}
}
if (i == (start + long_wait)) {
break;
}
}
if (start == rawbit - uidlen + 1) {
if (g_debugMode) PrintAndLog("nothing to wait for");
return 0;
}
// Inverting signal if needed
if (first == 1) {
for (i = start; i < rawbit; i++)
rawbits[i] = !rawbits[i];
}
// Dumping UID
uint8_t bits[224] = {0x00};
char showbits[225] = {0x00};
int bit;
i = start;
int times = 0;
if (uidlen > rawbit) {
PrintAndLog("Warning: not enough raw bits to get a full UID");
for (bit = 0; bit < rawbit; bit++) {
bits[bit] = rawbits[i++];
// As we cannot know the parity, let's use "." and "/"
showbits[bit] = '.' + bits[bit];
}
showbits[bit+1]='\0';
PrintAndLog("Partial UID=%s", showbits);
return 0;
} else {
for (bit = 0; bit < uidlen; bit++) {
bits[bit] = rawbits[i++];
showbits[bit] = '0' + bits[bit];
}
times = 1;
}
//convert UID to HEX
uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
int idx;
uid1 = uid2 = 0;
if (uidlen==64){
for( idx=0; idx<64; idx++) {
if (showbits[idx] == '0') {
uid1 = (uid1<<1) | (uid2>>31);
uid2 = (uid2<<1) | 0;
} else {
uid1 = (uid1<<1) | (uid2>>31);
uid2 = (uid2<<1) | 1;
}
}
PrintAndLog("UID=%s (%x%08x)", showbits, uid1, uid2);
} else {
uid3 = uid4 = uid5 = uid6 = uid7 = 0;
for( idx=0; idx<224; idx++) {
uid1 = (uid1<<1) | (uid2>>31);
uid2 = (uid2<<1) | (uid3>>31);
uid3 = (uid3<<1) | (uid4>>31);
uid4 = (uid4<<1) | (uid5>>31);
uid5 = (uid5<<1) | (uid6>>31);
uid6 = (uid6<<1) | (uid7>>31);
if (showbits[idx] == '0')
uid7 = (uid7<<1) | 0;
else
uid7 = (uid7<<1) | 1;
}
PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
}
// Checking UID against next occurrences
int failed = 0;
for (; i + uidlen <= rawbit;) {
failed = 0;
for (bit = 0; bit < uidlen; bit++) {
if (bits[bit] != rawbits[i++]) {
failed = 1;
break;
}
}
if (failed == 1) {
break;
}
times += 1;
}
if (g_debugMode) PrintAndLog("Occurrences: %d (expected %d)", times, (rawbit - start) / uidlen);
// Remodulating for tag cloning
// HACK: 2015-01-04 this will have an impact on our new way of seening lf commands (demod)
// since this changes graphbuffer data.
GraphTraceLen = 32 * uidlen;
i = 0;
int phase = 0;
for (bit = 0; bit < uidlen; bit++) {
phase = (bits[bit] == 0) ? 0 : 1;
int j;
for (j = 0; j < 32; j++) {
GraphBuffer[i++] = phase;
phase = !phase;
}
}
RepaintGraphWindow();
return 1;
}
int CmdIndalaClone(const char *Cmd){
UsbCommand c;
unsigned int uid1, uid2, uid3, uid4, uid5, uid6, uid7;
uid1 = uid2 = uid3 = uid4 = uid5 = uid6 = uid7 = 0;
int n = 0, i = 0;
if (strchr(Cmd,'l') != 0) {
while (sscanf(&Cmd[i++], "%1x", &n ) == 1) {
uid1 = (uid1 << 4) | (uid2 >> 28);
uid2 = (uid2 << 4) | (uid3 >> 28);
uid3 = (uid3 << 4) | (uid4 >> 28);
uid4 = (uid4 << 4) | (uid5 >> 28);
uid5 = (uid5 << 4) | (uid6 >> 28);
uid6 = (uid6 << 4) | (uid7 >> 28);
uid7 = (uid7 << 4) | (n & 0xf);
}
PrintAndLog("Cloning 224bit tag with UID %x%08x%08x%08x%08x%08x%08x", uid1, uid2, uid3, uid4, uid5, uid6, uid7);
c.cmd = CMD_INDALA_CLONE_TAG_L;
c.d.asDwords[0] = uid1;
c.d.asDwords[1] = uid2;
c.d.asDwords[2] = uid3;
c.d.asDwords[3] = uid4;
c.d.asDwords[4] = uid5;
c.d.asDwords[5] = uid6;
c.d.asDwords[6] = uid7;
} else {
while (sscanf(&Cmd[i++], "%1x", &n ) == 1) {
uid1 = (uid1 << 4) | (uid2 >> 28);
uid2 = (uid2 << 4) | (n & 0xf);
}
PrintAndLog("Cloning 64bit tag with UID %x%08x", uid1, uid2);
c.cmd = CMD_INDALA_CLONE_TAG;
c.arg[0] = uid1;
c.arg[1] = uid2;
}
clearCommandBuffer();
SendCommand(&c);
return 0;
}
int CmdLFSetConfig(const char *Cmd) {
uint8_t divisor = 0;//Frequency divisor
@ -541,12 +320,33 @@ int CmdLFSetConfig(const char *Cmd) {
return 0;
}
bool lf_read(bool silent, uint32_t samples) {
if (offline) return false;
UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {silent, samples, 0}};
clearCommandBuffer();
SendCommand(&c);
UsbCommand resp;
if (g_lf_threshold_set) {
WaitForResponse(CMD_ACK, &resp);
} else {
if ( !WaitForResponseTimeout(CMD_ACK, &resp, 2500) ) {
PrintAndLog("command execution time out");
return false;
}
}
getSamples(resp.arg[0], silent);
return true;
}
int CmdLFRead(const char *Cmd) {
if (offline) return 0;
bool errors = false;
bool arg1 = false;
bool silent = false;
uint32_t samples = 0;
uint8_t cmdp = 0;
while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {
switch(param_getchar(Cmd, cmdp)) {
@ -555,9 +355,14 @@ int CmdLFRead(const char *Cmd) {
return usage_lf_read();
case 's':
case 'S':
arg1 = true;
silent = true;
cmdp++;
break;
case 'd':
case 'D':
samples = param_get32ex(Cmd, cmdp, 0, 10);
cmdp +=2;
break;
default:
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
errors = true;
@ -568,18 +373,7 @@ int CmdLFRead(const char *Cmd) {
//Validations
if (errors) return usage_lf_read();
UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}};
clearCommandBuffer();
SendCommand(&c);
if ( g_lf_threshold_set ) {
WaitForResponse(CMD_ACK,NULL);
} else {
if ( !WaitForResponseTimeout(CMD_ACK, NULL ,2500) ) {
PrintAndLog("command execution time out");
return 1;
}
}
return 0;
return lf_read(silent, samples);
}
int CmdLFSnoop(const char *Cmd) {
@ -590,7 +384,7 @@ int CmdLFSnoop(const char *Cmd) {
clearCommandBuffer();
SendCommand(&c);
WaitForResponse(CMD_ACK,NULL);
getSamples("", false);
getSamples(0, false);
return 0;
}
@ -700,9 +494,10 @@ int CmdLFfskSim(const char *Cmd)
//Validations
if (errors) return usage_lf_simfsk();
int firstClockEdge = 0;
if (dataLen == 0){ //using DemodBuffer
if (clk == 0 || fcHigh == 0 || fcLow == 0){ //manual settings must set them all
uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0);
uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0, &firstClockEdge);
if (ans==0){
if (!fcHigh) fcHigh = 10;
if (!fcLow) fcLow = 8;
@ -1016,30 +811,30 @@ int CmdVchDemod(const char *Cmd) {
return 0;
}
//by marshmellow
int CheckChipset(bool getDeviceData) {
int CheckChipType(bool getDeviceData) {
if (!getDeviceData) return 0;
uint32_t word = 0;
save_restoreGB(1);
save_restoreGB(GRAPH_SAVE);
//check for em4x05/em4x69 chips first
if (EM4x05IsBlock0(&word)) {
save_restoreGB(0);
save_restoreGB(GRAPH_RESTORE);
PrintAndLog("\nValid EM4x05/EM4x69 Chipset found\nTry `lf em 4x05` commands\n");
return 1;
}
//TODO check for t55xx chip...
// if ( t55xxIsBlock0(() {
// save_restoreGB(0);
// PrintAndLog("\nValid T55xx Chipset found\nTry `lf t55xx` commands\n");
// return 1;
// }
//check for t55xx chip...
if (tryDetectP1(true)) {
PrintAndLog("\nValid T55xx Chip Found\nTry `lf t55xx` commands\n");
save_restoreGB(GRAPH_RESTORE);
save_restoreGB(0);
return 1;
}
save_restoreDB(GRAPH_RESTORE);
return 0;
}
@ -1054,8 +849,7 @@ int CmdLFfind(const char *Cmd) {
bool getDeviceData = (!offline && (cmdp != '1') );
if (getDeviceData) {
CmdLFRead("s");
getSamples("30000", false);
lf_read(true, 30000);
} else if (GraphTraceLen < minLength) {
PrintAndLog("Data in Graphbuffer was too small.");
return 0;
@ -1074,7 +868,7 @@ int CmdLFfind(const char *Cmd) {
// only run if graphbuffer is just noise as it should be for hitag/cotag
if (graphJustNoise(GraphBuffer, testLen)) {
if (CheckChipset(getDeviceData) )
if (CheckChipType(getDeviceData) )
return 1;
ans=CmdLFHitagReader("26");
@ -1092,102 +886,135 @@ int CmdLFfind(const char *Cmd) {
}
// identify chipset
CheckChipset(getDeviceData);
CheckChipType(getDeviceData);
ans=CmdFSKdemodIO("");
ans=CmdIOProxDemod("");
if (ans>0) {
PrintAndLog("\nValid IO Prox ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdFSKdemodPyramid("");
ans=CmdPyramidDemod("");
if (ans>0) {
PrintAndLog("\nValid Pyramid ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdFSKdemodParadox("");
ans=CmdParadoxDemod("");
if (ans>0) {
PrintAndLog("\nValid Paradox ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdFSKdemodAWID("");
ans=CmdAWIDDemod("");
if (ans>0) {
PrintAndLog("\nValid AWID ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdFSKdemodHID("");
ans=CmdHIDDemod("");
if (ans>0) {
PrintAndLog("\nValid HID Prox ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdAskEM410xDemod("");
if (ans>0) {
PrintAndLog("\nValid EM410x ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdG_Prox_II_Demod("");
ans=CmdVisa2kDemod("");
if (ans>0) {
PrintAndLog("\nValid Visa2000 ID Found!");
return CheckChipType(getDeviceData);
}
ans=CmdGuardDemod("");
if (ans>0) {
PrintAndLog("\nValid Guardall G-Prox II ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdFDXBdemodBI("");
ans=CmdFdxDemod(""); //biphase
if (ans>0) {
PrintAndLog("\nValid FDX-B ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=EM4x50Read("", false);
if (ans>0) {
PrintAndLog("\nValid EM4x50 ID Found!");
return 1;
}
ans=CmdJablotronDemod("");
if (ans>0) {
PrintAndLog("\nValid Jablotron ID Found!");
return CheckChipType(getDeviceData);
}
ans=CmdNoralsyDemod("");
if (ans>0) {
PrintAndLog("\nValid Noralsy ID Found!");
return CheckChipType(getDeviceData);
}
ans=CmdSecurakeyDemod("");
if (ans>0) {
PrintAndLog("\nValid Securakey ID Found!");
return CheckChipType(getDeviceData);
}
ans=CmdVikingDemod("");
if (ans>0) {
PrintAndLog("\nValid Viking ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdIndalaDecode("");
ans=CmdIndalaDemod("");
if (ans>0) {
PrintAndLog("\nValid Indala ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdPSKNexWatch("");
ans=CmdNexWatchDemod("");
if (ans>0) {
PrintAndLog("\nValid NexWatch ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdPSKIdteck("");
if (ans>0) {
PrintAndLog("\nValid Idteck ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdJablotronDemod("");
if (ans>0) {
PrintAndLog("\nValid Jablotron ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdLFNedapDemod("");
if (ans>0) {
PrintAndLog("\nValid NEDAP ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdVisa2kDemod("");
if (ans>0) {
PrintAndLog("\nValid Visa2000 ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdNoralsyDemod("");
if (ans>0) {
PrintAndLog("\nValid Noralsy ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdPrescoDemod("");
if (ans>0) {
PrintAndLog("\nValid Presco ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdPacDemod("");
if (ans>0) {
PrintAndLog("\nValid PAC/Stanley ID Found!");
return 1;
return CheckChipType(getDeviceData);
}
// TIdemod?
@ -1229,7 +1056,7 @@ int CmdLFfind(const char *Cmd) {
ans=FSKrawDemod("",true);
if (ans>0) {
PrintAndLog("\nUnknown FSK Modulated Tag Found!");
return 1;
return CheckChipType(getDeviceData);;
}
}
bool st = true;
@ -1237,7 +1064,7 @@ int CmdLFfind(const char *Cmd) {
if (ans>0) {
PrintAndLog("\nUnknown ASK Modulated and Manchester encoded Tag Found!");
PrintAndLog("\nif it does not look right it could instead be ASK/Biphase - try 'data rawdemod ab'");
return 1;
return CheckChipType(getDeviceData);
}
ans=CmdPSK1rawDemod("");
@ -1245,7 +1072,7 @@ int CmdLFfind(const char *Cmd) {
PrintAndLog("Possible unknown PSK1 Modulated Tag Found above!\n\nCould also be PSK2 - try 'data rawdemod p2'");
PrintAndLog("\nCould also be PSK3 - [currently not supported]");
PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod");
return 1;
return CheckChipType(getDeviceData);
}
PrintAndLog("\nNo Data Found!\n");
}
@ -1254,34 +1081,32 @@ int CmdLFfind(const char *Cmd) {
static command_t CommandTable[] = {
{"help", CmdHelp, 1, "This help"},
{"animal", CmdLFFdx, 1, "{ Animal RFIDs... }"},
{"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"},
{"cotag", CmdLFCOTAG, 1, "{ COTAG RFIDs... }"},
{"em", CmdLFEM4X, 1, "{ EM4X RFIDs... }"},
{"guard", CmdLFGuard, 1, "{ Guardall RFIDs... }"},
{"cotag", CmdLFCOTAG, 1, "{ COTAG CHIPs... }"},
{"em", CmdLFEM4X, 1, "{ EM4X CHIPs & RFIDs... }"},
{"fdx", CmdLFFdx, 1, "{ FDX-B RFIDs... }"},
{"gproxii", CmdLFGuard, 1, "{ Guardall Prox II RFIDs... }"},
{"hid", CmdLFHID, 1, "{ HID RFIDs... }"},
{"hitag", CmdLFHitag, 1, "{ HITAG RFIDs... }"},
// {"indala", CmdLFIndala, 1, "{ Indala RFIDs... }"},
{"io", CmdLFIO, 1, "{ IOPROX RFIDs... }"},
{"hitag", CmdLFHitag, 1, "{ Hitag CHIPs... }"},
{"indala", CmdLFINDALA, 1, "{ Indala RFIDs... }"},
{"io", CmdLFIO, 1, "{ ioProx RFIDs... }"},
{"jablotron", CmdLFJablotron, 1, "{ Jablotron RFIDs... }"},
{"nedap", CmdLFNedap, 1, "{ Nedap RFIDs... }"},
{"nexwatch", CmdLFNexWatch, 1, "{ NexWatch RFIDs... }"},
{"nexwatch", CmdLFNEXWATCH, 1, "{ NexWatch RFIDs... }"},
{"noralsy", CmdLFNoralsy, 1, "{ Noralsy RFIDs... }"},
{"pac", CmdLFPac, 1, "{ PAC/Stanley RFIDs... }"},
{"pcf7931", CmdLFPCF7931, 1, "{ PCF7931 RFIDs... }"},
{"paradox", CmdLFParadox, 1, "{ Paradox RFIDs... }"},
{"pcf7931", CmdLFPCF7931, 1, "{ PCF7931 CHIPs... }"},
{"presco", CmdLFPresco, 1, "{ Presco RFIDs... }"},
{"pyramid", CmdLFPyramid, 1, "{ Farpointe/Pyramid RFIDs... }"},
{"securakey", CmdLFSecurakey, 1, "{ Securakey RFIDs... }"},
{"ti", CmdLFTI, 1, "{ TI RFIDs... }"},
{"t55xx", CmdLFT55XX, 1, "{ T55xx RFIDs... }"},
{"ti", CmdLFTI, 1, "{ TI CHIPs... }"},
{"t55xx", CmdLFT55XX, 1, "{ T55xx CHIPs... }"},
{"viking", CmdLFViking, 1, "{ Viking RFIDs... }"},
{"visa2000", CmdLFVisa2k, 1, "{ Visa2000 RFIDs... }"},
{"config", CmdLFSetConfig, 0, "Set config for LF sampling, bit/sample, decimation, frequency"},
{"cmdread", CmdLFCommandRead, 0, "<off period> <'0' period> <'1' period> <command> ['h' 134] \n\t\t-- Modulate LF reader field to send command before read (all periods in microseconds)"},
{"flexdemod", CmdFlexdemod, 1, "Demodulate samples for FlexPass"},
{"indalademod", CmdIndalaDemod, 1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"},
{"indalaclone", CmdIndalaClone, 0, "<UID> ['l']-- Clone Indala to T55x7 (tag must be in antenna)(UID in HEX)(option 'l' for 224 UID"},
{"read", CmdLFRead, 0, "['s' silent] Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
{"search", CmdLFfind, 1, "[offline] ['u'] Read and Search for valid known tag (in offline mode it you can load first then search) \n\t\t-- 'u' to search for unknown tags"},
{"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},