mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-19 04:49:38 -07:00
add bitswap option for lf em 4x05write (#236)
default read mode of this chip outputs in reverse order... so offer the option to program in reverse order
This commit is contained in:
parent
de867f502f
commit
2d42ea1e4d
3 changed files with 30 additions and 14 deletions
|
@ -763,9 +763,10 @@ int CmdEM4x05dump(const char *Cmd) {
|
||||||
int usage_lf_em_write(void) {
|
int usage_lf_em_write(void) {
|
||||||
PrintAndLog("Write EM4x05/EM4x69. Tag must be on antenna. ");
|
PrintAndLog("Write EM4x05/EM4x69. Tag must be on antenna. ");
|
||||||
PrintAndLog("");
|
PrintAndLog("");
|
||||||
PrintAndLog("Usage: lf em 4x05writeword [h] <address> <data> <pwd>");
|
PrintAndLog("Usage: lf em 4x05writeword [h] [s] <address> <data> <pwd>");
|
||||||
PrintAndLog("Options:");
|
PrintAndLog("Options:");
|
||||||
PrintAndLog(" h - this help");
|
PrintAndLog(" h - this help");
|
||||||
|
PrintAndLog(" s - swap data bit order before write");
|
||||||
PrintAndLog(" address - memory address to write to. (0-15)");
|
PrintAndLog(" address - memory address to write to. (0-15)");
|
||||||
PrintAndLog(" data - data to write (hex)");
|
PrintAndLog(" data - data to write (hex)");
|
||||||
PrintAndLog(" pwd - password (hex) (optional)");
|
PrintAndLog(" pwd - password (hex) (optional)");
|
||||||
|
@ -784,11 +785,16 @@ int CmdEM4x05WriteWord(const char *Cmd) {
|
||||||
uint8_t addr = 16; // default to invalid address
|
uint8_t addr = 16; // default to invalid address
|
||||||
uint32_t data = 0xFFFFFFFF; // default to blank data
|
uint32_t data = 0xFFFFFFFF; // default to blank data
|
||||||
uint32_t pwd = 0xFFFFFFFF; // default to blank password
|
uint32_t pwd = 0xFFFFFFFF; // default to blank password
|
||||||
|
char swap = 0;
|
||||||
|
|
||||||
addr = param_get8ex(Cmd, 0, 16, 10);
|
int p = 0;
|
||||||
data = param_get32ex(Cmd, 1, 0, 16);
|
swap = param_getchar(Cmd, 0);
|
||||||
pwd = param_get32ex(Cmd, 2, 1, 16);
|
if (swap == 's' || swap=='S') p++;
|
||||||
|
addr = param_get8ex(Cmd, p++, 16, 10);
|
||||||
|
data = param_get32ex(Cmd, p++, 0, 16);
|
||||||
|
pwd = param_get32ex(Cmd, p++, 1, 16);
|
||||||
|
|
||||||
|
if (swap == 's' || swap=='S') data = SwapBits(data, 32);
|
||||||
|
|
||||||
if ( (addr > 15) ) {
|
if ( (addr > 15) ) {
|
||||||
PrintAndLog("Address must be between 0 and 15");
|
PrintAndLog("Address must be between 0 and 15");
|
||||||
|
|
|
@ -257,6 +257,15 @@ void num_to_bytebitsLSBF(uint64_t n, size_t len, uint8_t *dest) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Swap bit order on a uint32_t value. Can be limited by nrbits just use say 8bits reversal
|
||||||
|
// And clears the rest of the bits.
|
||||||
|
uint32_t SwapBits(uint32_t value, int nrbits) {
|
||||||
|
uint32_t newvalue = 0;
|
||||||
|
for(int i = 0; i < nrbits; i++) {
|
||||||
|
newvalue ^= ((value >> i) & 1) << (nrbits - 1 - i);
|
||||||
|
}
|
||||||
|
return newvalue;
|
||||||
|
}
|
||||||
|
|
||||||
// aa,bb,cc,dd,ee,ff,gg,hh, ii,jj,kk,ll,mm,nn,oo,pp
|
// aa,bb,cc,dd,ee,ff,gg,hh, ii,jj,kk,ll,mm,nn,oo,pp
|
||||||
// to
|
// to
|
||||||
|
|
|
@ -47,6 +47,7 @@ extern uint64_t bytes_to_num(uint8_t* src, size_t len);
|
||||||
extern void num_to_bytebits(uint64_t n, size_t len, uint8_t *dest);
|
extern void num_to_bytebits(uint64_t n, size_t len, uint8_t *dest);
|
||||||
extern void num_to_bytebitsLSBF(uint64_t n, size_t len, uint8_t *dest);
|
extern void num_to_bytebitsLSBF(uint64_t n, size_t len, uint8_t *dest);
|
||||||
extern char *printBits(size_t const size, void const * const ptr);
|
extern char *printBits(size_t const size, void const * const ptr);
|
||||||
|
extern uint32_t SwapBits(uint32_t value, int nrbits);
|
||||||
extern uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize);
|
extern uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize);
|
||||||
extern void SwapEndian64ex(const uint8_t *src, const size_t len, const uint8_t blockSize, uint8_t *dest);
|
extern void SwapEndian64ex(const uint8_t *src, const size_t len, const uint8_t blockSize, uint8_t *dest);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue