mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-12-29 11:52:59 +08:00
FIX: data mandemod read the wrong part of BigBuffer (no correct offset)
This commit is contained in:
parent
c2d25819d8
commit
081151eabb
5 changed files with 62 additions and 141 deletions
|
@ -456,25 +456,23 @@ int CmdHpf(const char *Cmd)
|
|||
|
||||
int CmdSamples(const char *Cmd)
|
||||
{
|
||||
int cnt = 0;
|
||||
int n;
|
||||
uint8_t got[40000];
|
||||
|
||||
n = strtol(Cmd, NULL, 0);
|
||||
if (n == 0) n = 512;
|
||||
if (n > sizeof(got)) n = sizeof(got);
|
||||
uint8_t got[36440] = {0x00};
|
||||
|
||||
int n = strtol(Cmd, NULL, 0);
|
||||
if (n == 0)
|
||||
n = 512;
|
||||
if (n > sizeof(got))
|
||||
n = sizeof(got);
|
||||
|
||||
PrintAndLog("Reading %d samples from device memory\n", n);
|
||||
GetFromBigBuf(got,n,3560);
|
||||
WaitForResponse(CMD_ACK,NULL);
|
||||
for (int j = 0; j < n; j++) {
|
||||
GraphBuffer[cnt++] = ((int)got[j]) - 128;
|
||||
}
|
||||
|
||||
PrintAndLog("Done!\n");
|
||||
GraphTraceLen = n;
|
||||
RepaintGraphWindow();
|
||||
return 0;
|
||||
PrintAndLog("Reading %d samples from device memory\n", n);
|
||||
GetFromBigBuf(got,n,3560);
|
||||
WaitForResponse(CMD_ACK,NULL);
|
||||
for (int j = 0; j < n; ++j) {
|
||||
GraphBuffer[j] = ((int)got[j]) - 128;
|
||||
}
|
||||
GraphTraceLen = n;
|
||||
RepaintGraphWindow();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CmdLoad(const char *Cmd)
|
||||
|
@ -684,7 +682,7 @@ int CmdManchesterDemod(const char *Cmd)
|
|||
// We cannot end up in this state, this means we are unsynchronized,
|
||||
// move up 1 bit:
|
||||
i++;
|
||||
warnings++;
|
||||
warnings++;
|
||||
PrintAndLog("Unsynchronized, resync...");
|
||||
PrintAndLog("(too many of those messages mean the stream is not Manchester encoded)");
|
||||
|
||||
|
|
|
@ -230,7 +230,7 @@ int CmdLFHitagReader(const char *Cmd) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static command_t CommandTableHitag[] =
|
||||
static command_t CommandTable[] =
|
||||
{
|
||||
{"help", CmdHelp, 1, "This help"},
|
||||
{"list", CmdLFHitagList, 1, "List Hitag trace history"},
|
||||
|
@ -242,12 +242,12 @@ static command_t CommandTableHitag[] =
|
|||
|
||||
int CmdLFHitag(const char *Cmd)
|
||||
{
|
||||
CmdsParse(CommandTableHitag, Cmd);
|
||||
CmdsParse(CommandTable, Cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CmdHelp(const char *Cmd)
|
||||
{
|
||||
CmdsHelp(CommandTableHitag);
|
||||
CmdsHelp(CommandTable);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@ static int CmdHelp(const char *Cmd);
|
|||
int CmdReadBlk(const char *Cmd)
|
||||
{
|
||||
int Block = -1;
|
||||
|
||||
sscanf(Cmd, "%d", &Block);
|
||||
|
||||
if ((Block > 7) | (Block < 0)) {
|
||||
|
@ -37,7 +36,6 @@ int CmdReadBlk(const char *Cmd)
|
|||
return 1;
|
||||
}
|
||||
|
||||
// this command fills up BigBuff
|
||||
UsbCommand c;
|
||||
c.cmd = CMD_T55XX_READ_BLOCK;
|
||||
c.d.asBytes[0] = 0x00;
|
||||
|
@ -47,17 +45,18 @@ int CmdReadBlk(const char *Cmd)
|
|||
SendCommand(&c);
|
||||
WaitForResponse(CMD_ACK, NULL);
|
||||
|
||||
uint8_t data[LF_TRACE_BUFF_SIZE] = {0x00};
|
||||
// uint8_t data[LF_TRACE_BUFF_SIZE] = {0x00};
|
||||
|
||||
GetFromBigBuf(data,LF_TRACE_BUFF_SIZE,3560); //3560 -- should be offset..
|
||||
WaitForResponseTimeout(CMD_ACK,NULL, 1500);
|
||||
// GetFromBigBuf(data,LF_TRACE_BUFF_SIZE,3560); //3560 -- should be offset..
|
||||
// WaitForResponseTimeout(CMD_ACK,NULL, 1500);
|
||||
|
||||
for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
|
||||
GraphBuffer[j] = (int)data[j];
|
||||
}
|
||||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||
// for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
|
||||
// GraphBuffer[j] = (int)data[j];
|
||||
// }
|
||||
// GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||
CmdSamples("12000");
|
||||
ManchesterDemod(Block);
|
||||
RepaintGraphWindow();
|
||||
// RepaintGraphWindow();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -90,7 +89,7 @@ int CmdReadBlkPWD(const char *Cmd)
|
|||
WaitForResponseTimeout(CMD_ACK,NULL, 1500);
|
||||
|
||||
for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
|
||||
GraphBuffer[j] = ((int)data[j]) - 128;
|
||||
GraphBuffer[j] = ((int)data[j]);
|
||||
}
|
||||
GraphTraceLen = LF_TRACE_BUFF_SIZE;
|
||||
ManchesterDemod(Block);
|
||||
|
@ -155,8 +154,8 @@ int CmdReadTrace(const char *Cmd)
|
|||
PrintAndLog("Usage: lf t55xx trace [use data from Graphbuffer]");
|
||||
PrintAndLog(" [use data from Graphbuffer], if not set, try reading data from tag.");
|
||||
PrintAndLog("");
|
||||
PrintAndLog(" sample: lf t55xx trace");
|
||||
PrintAndLog(" sample: lf t55xx trace 1");
|
||||
PrintAndLog(" sample: lf t55xx trace");
|
||||
PrintAndLog(" sample: lf t55xx trace 1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -245,15 +244,14 @@ int CmdInfo(const char *Cmd){
|
|||
PrintAndLog("Usage: lf t55xx info [use data from Graphbuffer]");
|
||||
PrintAndLog(" [use data from Graphbuffer], if not set, try reading data from tag.");
|
||||
PrintAndLog("");
|
||||
PrintAndLog(" sample: lf t55xx info");
|
||||
PrintAndLog(" sample: lf t55xx info 1");
|
||||
PrintAndLog(" sample: lf t55xx info");
|
||||
PrintAndLog(" sample: lf t55xx info 1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( strlen(Cmd)==0){
|
||||
CmdReadBlk("0");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t bits[1000] = {0x00};
|
||||
uint8_t * bitstream = bits;
|
||||
|
@ -349,18 +347,20 @@ int CmdIceManchester(const char *Cmd){
|
|||
int ManchesterDemod(int block){
|
||||
|
||||
int blockNum = -1;
|
||||
uint8_t sizebyte = 32;
|
||||
uint8_t offset = 5;
|
||||
uint32_t blockData;
|
||||
uint8_t bits[1000] = {0x00};
|
||||
uint8_t * bitstream = bits;
|
||||
|
||||
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
|
||||
blockData = PackBits(5, 32, bitstream);
|
||||
blockData = PackBits(offset, sizebyte, bitstream);
|
||||
|
||||
if ( blockNum > -1){
|
||||
PrintAndLog(" Block %d : 0x%08X %s", blockNum, blockData, sprint_bin(bitstream+5,32) );
|
||||
}else{
|
||||
PrintAndLog(" Decoded : 0x%08X %s", blockData, sprint_bin(bitstream+5,32) );
|
||||
}
|
||||
if ( blockNum < 0)
|
||||
PrintAndLog(" Decoded : 0x%08X %s", blockData, sprint_bin(bitstream+offset,sizebyte) );
|
||||
else
|
||||
PrintAndLog(" Block %d : 0x%08X %s", blockNum, blockData, sprint_bin(bitstream+offset,sizebyte) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
114
client/ui.c
114
client/ui.c
|
@ -18,7 +18,8 @@
|
|||
#include <pthread.h>
|
||||
#include "loclass/cipherutils.h"
|
||||
#include "ui.h"
|
||||
|
||||
#include "cmdmain.h"
|
||||
#include "cmddata.h"
|
||||
//#include <liquid/liquid.h>
|
||||
#define M_PI 3.14159265358979323846264338327
|
||||
|
||||
|
@ -117,7 +118,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
|||
startindex = DetectFirstTransition(data, len, high);
|
||||
|
||||
PrintAndLog(" Clock : %d", clock);
|
||||
PrintAndLog(" startindex : %d", startindex);
|
||||
//PrintAndLog(" startindex : %d", startindex);
|
||||
|
||||
if (high != 1)
|
||||
bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex);
|
||||
|
@ -235,8 +236,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
|
|||
// No high value found, are we in a dampening field?
|
||||
if ( !hithigh ) {
|
||||
//PrintAndLog(" # Entering damp test at index : %d (%d)", z+j, j);
|
||||
for (j = 0; j < clock; j++)
|
||||
{
|
||||
for (j = 0; j < clock; j++) {
|
||||
if (
|
||||
(data[z+j] <= dampHi && data[z+j] >= dampLow)
|
||||
){
|
||||
|
@ -392,83 +392,6 @@ void PrintPaddedManchester( uint8_t* bitStream, size_t len, size_t blocksize){
|
|||
PrintAndLog(" %s", sprint_bin(bitStream+i, mod) );
|
||||
}
|
||||
|
||||
void iceFsk(int * data, const size_t len){
|
||||
|
||||
//34359738 == 125khz (2^32 / 125) =
|
||||
|
||||
// parameters
|
||||
float phase_offset = 0.00f; // carrier phase offset
|
||||
float frequency_offset = 0.30f; // carrier frequency offset
|
||||
float wn = 0.01f; // pll bandwidth
|
||||
float zeta = 0.707f; // pll damping factor
|
||||
float K = 1000; // pll loop gain
|
||||
size_t n = len; // number of samples
|
||||
|
||||
// generate loop filter parameters (active PI design)
|
||||
float t1 = K/(wn*wn); // tau_1
|
||||
float t2 = 2*zeta/wn; // tau_2
|
||||
|
||||
// feed-forward coefficients (numerator)
|
||||
float b0 = (4*K/t1)*(1.+t2/2.0f);
|
||||
float b1 = (8*K/t1);
|
||||
float b2 = (4*K/t1)*(1.-t2/2.0f);
|
||||
|
||||
// feed-back coefficients (denominator)
|
||||
// a0 = 1.0 is implied
|
||||
float a1 = -2.0f;
|
||||
float a2 = 1.0f;
|
||||
|
||||
// filter buffer
|
||||
float v0=0.0f, v1=0.0f, v2=0.0f;
|
||||
|
||||
// initialize states
|
||||
float phi = phase_offset; // input signal's initial phase
|
||||
float phi_hat = 0.0f; // PLL's initial phase
|
||||
|
||||
unsigned int i;
|
||||
float complex x,y;
|
||||
float complex output[n];
|
||||
|
||||
for (i=0; i<n; i++) {
|
||||
// INPUT SIGNAL
|
||||
x = data[i];
|
||||
phi += frequency_offset;
|
||||
|
||||
// generate complex sinusoid
|
||||
y = cosf(phi_hat) + _Complex_I*sinf(phi_hat);
|
||||
|
||||
output[i] = y;
|
||||
|
||||
// compute error estimate
|
||||
float delta_phi = cargf( x * conjf(y) );
|
||||
|
||||
|
||||
// print results to standard output
|
||||
printf(" %6u %12.8f %12.8f %12.8f %12.8f %12.8f\n",
|
||||
i,
|
||||
crealf(x), cimagf(x),
|
||||
crealf(y), cimagf(y),
|
||||
delta_phi);
|
||||
|
||||
// push result through loop filter, updating phase estimate
|
||||
|
||||
// advance buffer
|
||||
v2 = v1; // shift center register to upper register
|
||||
v1 = v0; // shift lower register to center register
|
||||
|
||||
// compute new lower register
|
||||
v0 = delta_phi - v1*a1 - v2*a2;
|
||||
|
||||
// compute new output
|
||||
phi_hat = v0*b0 + v1*b1 + v2*b2;
|
||||
|
||||
}
|
||||
|
||||
for (i=0; i<len; ++i){
|
||||
data[i] = (int)crealf(output[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Sliding DFT
|
||||
Smooths out
|
||||
*/
|
||||
|
@ -502,21 +425,21 @@ void iceFsk3(int * data, const size_t len){
|
|||
|
||||
int i,j;
|
||||
int output[len];
|
||||
float fc = 0.1125f; // center frequency
|
||||
|
||||
float fc = 0.1125f; // center frequency
|
||||
size_t adjustedLen = len;
|
||||
|
||||
// create very simple low-pass filter to remove images (2nd-order Butterworth)
|
||||
float complex iir_buf[3] = {0,0,0};
|
||||
float b[3] = {0.003621681514929, 0.007243363029857, 0.003621681514929};
|
||||
float a[3] = {1.000000000000000, -1.822694925196308, 0.837181651256023};
|
||||
|
||||
// process entire input file one sample at a time
|
||||
float sample = 0; // input sample read from file
|
||||
float complex x_prime = 1.0f; // save sample for estimating frequency
|
||||
float sample = 0; // input sample read from file
|
||||
float complex x_prime = 1.0f; // save sample for estimating frequency
|
||||
float complex x;
|
||||
|
||||
for (i=0; i<len; ++i) {
|
||||
for (i=0; i<adjustedLen; ++i) {
|
||||
|
||||
sample = data[i];
|
||||
sample = data[i]+128;
|
||||
|
||||
// remove DC offset and mix to complex baseband
|
||||
x = (sample - 127.5f) * cexpf( _Complex_I * 2 * M_PI * fc * i );
|
||||
|
@ -538,18 +461,19 @@ void iceFsk3(int * data, const size_t len){
|
|||
}
|
||||
|
||||
// show data
|
||||
for (j=0; j<len; ++j)
|
||||
for (j=0; j<adjustedLen; ++j)
|
||||
data[j] = output[j];
|
||||
|
||||
CmdLtrim("30");
|
||||
adjustedLen -= 30;
|
||||
|
||||
// zero crossings.
|
||||
for (j=0; j<len; ++j){
|
||||
for (j=0; j<adjustedLen; ++j){
|
||||
if ( data[j] == 10) break;
|
||||
}
|
||||
int startOne =j;
|
||||
|
||||
for (;j<len; ++j){
|
||||
for (;j<adjustedLen; ++j){
|
||||
if ( data[j] == -10 ) break;
|
||||
}
|
||||
int stopOne = j-1;
|
||||
|
@ -560,13 +484,13 @@ void iceFsk3(int * data, const size_t len){
|
|||
fieldlen = (fieldlen == 59 || fieldlen == 51)? 50 : fieldlen;
|
||||
if ( fieldlen != 40 && fieldlen != 50){
|
||||
printf("Detected field Length: %d \n", fieldlen);
|
||||
printf("Can only handle len 40 or 50. Aborting...");
|
||||
printf("Can only handle 40 or 50. Aborting...\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// FSK sequence start == 000111
|
||||
int startPos = 0;
|
||||
for (i =0; i<len; ++i){
|
||||
for (i =0; i<adjustedLen; ++i){
|
||||
int dec = 0;
|
||||
for ( j = 0; j < 6*fieldlen; ++j){
|
||||
dec += data[i + j];
|
||||
|
@ -584,14 +508,14 @@ void iceFsk3(int * data, const size_t len){
|
|||
int bit =0;
|
||||
printf("BINARY\n");
|
||||
printf("R/40 : ");
|
||||
for (i =startPos ; i < len; i += 40){
|
||||
for (i =startPos ; i < adjustedLen; i += 40){
|
||||
bit = data[i]>0 ? 1:0;
|
||||
printf("%d", bit );
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
printf("R/50 : ");
|
||||
for (i =startPos ; i < len; i += 50){
|
||||
for (i =startPos ; i < adjustedLen; i += 50){
|
||||
bit = data[i]>0 ? 1:0;
|
||||
printf("%d", bit ); }
|
||||
printf("\n");
|
||||
|
|
|
@ -34,7 +34,6 @@ void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize);
|
|||
void ManchesterDiffDecodedString( const uint8_t *bitStream, size_t len, uint8_t invert );
|
||||
int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int high, int low, int clock, int startIndex);
|
||||
int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex);
|
||||
void iceFsk(int * data, const size_t len);
|
||||
void iceFsk2(int * data, const size_t len);
|
||||
void iceFsk3(int * data, const size_t len);
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue