mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-19 12:59:44 -07:00
Merge branch 'master' of https://github.com/Proxmark/proxmark3
This commit is contained in:
commit
471c514167
7 changed files with 59 additions and 18 deletions
|
@ -204,7 +204,7 @@ void MeasureAntennaTuning(void)
|
||||||
|
|
||||||
LED_B_ON();
|
LED_B_ON();
|
||||||
DbpString("Measuring antenna characteristics, please wait...");
|
DbpString("Measuring antenna characteristics, please wait...");
|
||||||
memset(dest,0,sizeof(FREE_BUFFER_SIZE));
|
memset(dest,0,FREE_BUFFER_SIZE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sweeps the useful LF range of the proxmark from
|
* Sweeps the useful LF range of the proxmark from
|
||||||
|
|
|
@ -968,7 +968,7 @@ void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain
|
||||||
{
|
{
|
||||||
|
|
||||||
uint8_t mac_responses[64] = { 0 };
|
uint8_t mac_responses[64] = { 0 };
|
||||||
Dbprintf("Going into attack mode");
|
Dbprintf("Going into attack mode, %d CSNS sent", numberOfCSNS);
|
||||||
// In this mode, a number of csns are within datain. We'll simulate each one, one at a time
|
// In this mode, a number of csns are within datain. We'll simulate each one, one at a time
|
||||||
// in order to collect MAC's from the reader. This can later be used in an offlne-attack
|
// in order to collect MAC's from the reader. This can later be used in an offlne-attack
|
||||||
// in order to obtain the keys, as in the "dismantling iclass"-paper.
|
// in order to obtain the keys, as in the "dismantling iclass"-paper.
|
||||||
|
@ -978,7 +978,7 @@ void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain
|
||||||
// The usb data is 512 bytes, fitting 65 8-byte CSNs in there.
|
// The usb data is 512 bytes, fitting 65 8-byte CSNs in there.
|
||||||
|
|
||||||
memcpy(csn_crc, datain+(i*8), 8);
|
memcpy(csn_crc, datain+(i*8), 8);
|
||||||
if(doIClassSimulation(csn_crc,1,mac_responses))
|
if(doIClassSimulation(csn_crc,1,mac_responses+i*8))
|
||||||
{
|
{
|
||||||
return; // Button pressed
|
return; // Button pressed
|
||||||
}
|
}
|
||||||
|
@ -1106,7 +1106,6 @@ int doIClassSimulation(uint8_t csn[], int breakAfterMacReceived, uint8_t *reader
|
||||||
//Signal tracer
|
//Signal tracer
|
||||||
// Can be used to get a trigger for an oscilloscope..
|
// Can be used to get a trigger for an oscilloscope..
|
||||||
LED_C_OFF();
|
LED_C_OFF();
|
||||||
|
|
||||||
if(!GetIClassCommandFromReader(receivedCmd, &len, 100)) {
|
if(!GetIClassCommandFromReader(receivedCmd, &len, 100)) {
|
||||||
buttonPressed = true;
|
buttonPressed = true;
|
||||||
break;
|
break;
|
||||||
|
@ -1149,9 +1148,10 @@ int doIClassSimulation(uint8_t csn[], int breakAfterMacReceived, uint8_t *reader
|
||||||
respsize = 0;
|
respsize = 0;
|
||||||
if (breakAfterMacReceived){
|
if (breakAfterMacReceived){
|
||||||
// dbprintf:ing ...
|
// dbprintf:ing ...
|
||||||
Dbprintf("CSN: %02x %02x %02x %02x %02x %02x %02x %02x",csn[0],csn[1],csn[2],csn[3],csn[4],csn[5],csn[6],csn[7]);
|
Dbprintf("CSN: %02x %02x %02x %02x %02x %02x %02x %02x"
|
||||||
|
,csn[0],csn[1],csn[2],csn[3],csn[4],csn[5],csn[6],csn[7]);
|
||||||
Dbprintf("RDR: (len=%02d): %02x %02x %02x %02x %02x %02x %02x %02x %02x",len,
|
Dbprintf("RDR: (len=%02d): %02x %02x %02x %02x %02x %02x %02x %02x %02x",len,
|
||||||
receivedCmd[0], receivedCmd[1], receivedCmd[2],
|
receivedCmd[0], receivedCmd[1], receivedCmd[2],
|
||||||
receivedCmd[3], receivedCmd[4], receivedCmd[5],
|
receivedCmd[3], receivedCmd[4], receivedCmd[5],
|
||||||
receivedCmd[6], receivedCmd[7], receivedCmd[8]);
|
receivedCmd[6], receivedCmd[7], receivedCmd[8]);
|
||||||
if (reader_mac_buf != NULL)
|
if (reader_mac_buf != NULL)
|
||||||
|
|
|
@ -479,6 +479,26 @@ int CmdSamples(const char *Cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CmdTuneSamples(const char *Cmd)
|
||||||
|
{
|
||||||
|
int cnt = 0;
|
||||||
|
int n = 255;
|
||||||
|
uint8_t got[255];
|
||||||
|
|
||||||
|
PrintAndLog("Reading %d samples\n", n);
|
||||||
|
GetFromBigBuf(got,n,7256); // armsrc/apps.h: #define FREE_BUFFER_OFFSET 7256
|
||||||
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
|
for (int j = 0; j < n; j++) {
|
||||||
|
GraphBuffer[cnt++] = ((int)got[j]) - 128;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrintAndLog("Done! Divisor 89 is 134khz, 95 is 125khz.\n");
|
||||||
|
PrintAndLog("\n");
|
||||||
|
GraphTraceLen = n;
|
||||||
|
RepaintGraphWindow();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int CmdLoad(const char *Cmd)
|
int CmdLoad(const char *Cmd)
|
||||||
{
|
{
|
||||||
FILE *f = fopen(Cmd, "r");
|
FILE *f = fopen(Cmd, "r");
|
||||||
|
@ -906,6 +926,7 @@ static command_t CommandTable[] =
|
||||||
{"norm", CmdNorm, 1, "Normalize max/min to +/-500"},
|
{"norm", CmdNorm, 1, "Normalize max/min to +/-500"},
|
||||||
{"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"},
|
{"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"},
|
||||||
{"samples", CmdSamples, 0, "[512 - 40000] -- Get raw samples for graph window"},
|
{"samples", CmdSamples, 0, "[512 - 40000] -- Get raw samples for graph window"},
|
||||||
|
{"tune", CmdTuneSamples, 0, "Get hw tune samples for graph window"},
|
||||||
{"save", CmdSave, 1, "<filename> -- Save trace (from graph window)"},
|
{"save", CmdSave, 1, "<filename> -- Save trace (from graph window)"},
|
||||||
{"scale", CmdScale, 1, "<int> -- Set cursor display scale"},
|
{"scale", CmdScale, 1, "<int> -- Set cursor display scale"},
|
||||||
{"threshold", CmdThreshold, 1, "<threshold> -- Maximize/minimize every value in the graph window depending on threshold"},
|
{"threshold", CmdThreshold, 1, "<threshold> -- Maximize/minimize every value in the graph window depending on threshold"},
|
||||||
|
|
|
@ -35,6 +35,7 @@ int CmdManchesterMod(const char *Cmd);
|
||||||
int CmdNorm(const char *Cmd);
|
int CmdNorm(const char *Cmd);
|
||||||
int CmdPlot(const char *Cmd);
|
int CmdPlot(const char *Cmd);
|
||||||
int CmdSamples(const char *Cmd);
|
int CmdSamples(const char *Cmd);
|
||||||
|
int CmdTuneSamples(const char *Cmd);
|
||||||
int CmdSave(const char *Cmd);
|
int CmdSave(const char *Cmd);
|
||||||
int CmdScale(const char *Cmd);
|
int CmdScale(const char *Cmd);
|
||||||
int CmdThreshold(const char *Cmd);
|
int CmdThreshold(const char *Cmd);
|
||||||
|
|
|
@ -303,7 +303,7 @@ int CmdHFiClassSnoop(const char *Cmd)
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#define NUM_CSNS 15
|
||||||
int CmdHFiClassSim(const char *Cmd)
|
int CmdHFiClassSim(const char *Cmd)
|
||||||
{
|
{
|
||||||
uint8_t simType = 0;
|
uint8_t simType = 0;
|
||||||
|
@ -340,10 +340,10 @@ int CmdHFiClassSim(const char *Cmd)
|
||||||
|
|
||||||
if(simType == 2)
|
if(simType == 2)
|
||||||
{
|
{
|
||||||
UsbCommand c = {CMD_SIMULATE_TAG_ICLASS, {simType,63}};
|
UsbCommand c = {CMD_SIMULATE_TAG_ICLASS, {simType,NUM_CSNS}};
|
||||||
UsbCommand resp = {0};
|
UsbCommand resp = {0};
|
||||||
|
|
||||||
uint8_t csns[64] = {
|
/*uint8_t csns[8 * NUM_CSNS] = {
|
||||||
0x00,0x0B,0x0F,0xFF,0xF7,0xFF,0x12,0xE0 ,
|
0x00,0x0B,0x0F,0xFF,0xF7,0xFF,0x12,0xE0 ,
|
||||||
0x00,0x13,0x94,0x7e,0x76,0xff,0x12,0xe0 ,
|
0x00,0x13,0x94,0x7e,0x76,0xff,0x12,0xe0 ,
|
||||||
0x2a,0x99,0xac,0x79,0xec,0xff,0x12,0xe0 ,
|
0x2a,0x99,0xac,0x79,0xec,0xff,0x12,0xe0 ,
|
||||||
|
@ -352,8 +352,26 @@ int CmdHFiClassSim(const char *Cmd)
|
||||||
0x4b,0x5e,0x0b,0x72,0xef,0xff,0x12,0xe0 ,
|
0x4b,0x5e,0x0b,0x72,0xef,0xff,0x12,0xe0 ,
|
||||||
0x00,0x73,0xd8,0x75,0x58,0xff,0x12,0xe0 ,
|
0x00,0x73,0xd8,0x75,0x58,0xff,0x12,0xe0 ,
|
||||||
0x0c,0x90,0x32,0xf3,0x5d,0xff,0x12,0xe0 };
|
0x0c,0x90,0x32,0xf3,0x5d,0xff,0x12,0xe0 };
|
||||||
|
*/
|
||||||
|
|
||||||
memcpy(c.d.asBytes, csns, 64);
|
uint8_t csns[8*NUM_CSNS] = {
|
||||||
|
0x00, 0x0B, 0x0F, 0xFF, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x04, 0x0E, 0x08, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x09, 0x0D, 0x05, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x0A, 0x0C, 0x06, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x0F, 0x0B, 0x03, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x08, 0x0A, 0x0C, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x0D, 0x09, 0x09, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x0E, 0x08, 0x0A, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x03, 0x07, 0x17, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x3C, 0x06, 0xE0, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x01, 0x05, 0x1D, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x02, 0x04, 0x1E, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x07, 0x03, 0x1B, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x00, 0x02, 0x24, 0xF7, 0xFF, 0x12, 0xE0,
|
||||||
|
0x00, 0x05, 0x01, 0x21, 0xF7, 0xFF, 0x12, 0xE0 };
|
||||||
|
|
||||||
|
memcpy(c.d.asBytes, csns, 8*NUM_CSNS);
|
||||||
|
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
if (!WaitForResponseTimeout(CMD_ACK, &resp, -1)) {
|
if (!WaitForResponseTimeout(CMD_ACK, &resp, -1)) {
|
||||||
|
@ -362,9 +380,9 @@ int CmdHFiClassSim(const char *Cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t num_mac_responses = resp.arg[1];
|
uint8_t num_mac_responses = resp.arg[1];
|
||||||
PrintAndLog("Mac responses: %d MACs obtained (should be 8)", num_mac_responses);
|
PrintAndLog("Mac responses: %d MACs obtained (should be %d)", num_mac_responses,NUM_CSNS);
|
||||||
|
|
||||||
size_t datalen = 8*24;
|
size_t datalen = NUM_CSNS*24;
|
||||||
/*
|
/*
|
||||||
* Now, time to dump to file. We'll use this format:
|
* Now, time to dump to file. We'll use this format:
|
||||||
* <8-byte CSN><8-byte CC><4 byte NR><4 byte MAC>....
|
* <8-byte CSN><8-byte CC><4 byte NR><4 byte MAC>....
|
||||||
|
@ -378,7 +396,7 @@ int CmdHFiClassSim(const char *Cmd)
|
||||||
void* dump = malloc(datalen);
|
void* dump = malloc(datalen);
|
||||||
memset(dump,0,datalen);//<-- Need zeroes for the CC-field
|
memset(dump,0,datalen);//<-- Need zeroes for the CC-field
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
for(i = 0 ; i < 8 ; i++)
|
for(i = 0 ; i < NUM_CSNS ; i++)
|
||||||
{
|
{
|
||||||
memcpy(dump+i*24, csns+i*8,8); //CSN
|
memcpy(dump+i*24, csns+i*8,8); //CSN
|
||||||
//8 zero bytes here...
|
//8 zero bytes here...
|
||||||
|
|
|
@ -269,7 +269,7 @@ int CmdIndalaDemod(const char *Cmd)
|
||||||
PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
|
PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checking UID against next occurences
|
// Checking UID against next occurrences
|
||||||
for (; i + uidlen <= rawbit;) {
|
for (; i + uidlen <= rawbit;) {
|
||||||
int failed = 0;
|
int failed = 0;
|
||||||
for (bit = 0; bit < uidlen; bit++) {
|
for (bit = 0; bit < uidlen; bit++) {
|
||||||
|
@ -283,7 +283,7 @@ int CmdIndalaDemod(const char *Cmd)
|
||||||
}
|
}
|
||||||
times += 1;
|
times += 1;
|
||||||
}
|
}
|
||||||
PrintAndLog("Occurences: %d (expected %d)", times, (rawbit - start) / uidlen);
|
PrintAndLog("Occurrences: %d (expected %d)", times, (rawbit - start) / uidlen);
|
||||||
|
|
||||||
// Remodulating for tag cloning
|
// Remodulating for tag cloning
|
||||||
GraphTraceLen = 32*uidlen;
|
GraphTraceLen = 32*uidlen;
|
||||||
|
|
|
@ -18,7 +18,7 @@ int fileExists(const char *filename) {
|
||||||
|
|
||||||
int saveFile(const char *preferredName, const char *suffix, const void* data, size_t datalen)
|
int saveFile(const char *preferredName, const char *suffix, const void* data, size_t datalen)
|
||||||
{
|
{
|
||||||
int size = sizeof(char) * (strlen(preferredName)+strlen(suffix)+5);
|
int size = sizeof(char) * (strlen(preferredName)+strlen(suffix)+10);
|
||||||
char * fileName = malloc(size);
|
char * fileName = malloc(size);
|
||||||
|
|
||||||
memset(fileName,0,size);
|
memset(fileName,0,size);
|
||||||
|
@ -34,13 +34,14 @@ int saveFile(const char *preferredName, const char *suffix, const void* data, si
|
||||||
/*Opening file for writing in binary mode*/
|
/*Opening file for writing in binary mode*/
|
||||||
FILE *fileHandle=fopen(fileName,"wb");
|
FILE *fileHandle=fopen(fileName,"wb");
|
||||||
if(!fileHandle) {
|
if(!fileHandle) {
|
||||||
prnlog("Failed to write to file '%s'", fileName);
|
PrintAndLog("Failed to write to file '%s'", fileName);
|
||||||
free(fileName);
|
free(fileName);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fwrite(data, 1, datalen, fileHandle);
|
fwrite(data, 1, datalen, fileHandle);
|
||||||
fclose(fileHandle);
|
fclose(fileHandle);
|
||||||
prnlog("Saved data to '%s'", fileName);
|
PrintAndLog(">Saved data to '%s'", fileName);
|
||||||
|
|
||||||
free(fileName);
|
free(fileName);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue