mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-05-12 11:18:11 -07:00
Merge pull request #42 from RfidResearchGroup/master
Update from RRG Master
This commit is contained in:
+11
@@ -31,12 +31,23 @@ version.c
|
||||
*.old
|
||||
*.swp
|
||||
*.json.bak
|
||||
*.pyc
|
||||
|
||||
# new build file for add-ons.
|
||||
Makefile.platform
|
||||
# Cache for detecting platform def changes
|
||||
.Makefile.options.cache
|
||||
|
||||
# cmake
|
||||
client/build/
|
||||
|
||||
# Coverity
|
||||
cov-int/
|
||||
.coverity.conf
|
||||
|
||||
# profiling
|
||||
*.gcno
|
||||
|
||||
!client/resources/hardnested/*.bin
|
||||
!client/resources/hardnested_tables/*.z
|
||||
client/src/ui/ui_overlays.h
|
||||
|
||||
+21
-28
@@ -4,29 +4,23 @@ language: c
|
||||
#default linux build env is: xenial
|
||||
compiler: gcc
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
dist: xenial
|
||||
|
||||
osx_image: xcode11
|
||||
|
||||
# move some env variables to homebrew env
|
||||
env:
|
||||
global:
|
||||
- HOMEBREW_TRAVIS_BRANCH=$TRAVIS_BRANCH
|
||||
- HOMEBREW_TRAVIS_COMMIT=$TRAVIS_COMMIT
|
||||
|
||||
# Test on Linux and MacOS
|
||||
matrix:
|
||||
include:
|
||||
- os: osx
|
||||
osx_image: xcode11
|
||||
env: MAKE_PARAMS='PLATFORM_EXTRAS='
|
||||
- os: osx
|
||||
osx_image: xcode11
|
||||
env: MAKE_PARAMS='PLATFORM_EXTRAS=BTADDON'
|
||||
- os: linux
|
||||
dist: xenial
|
||||
sudo: required
|
||||
env: MAKE_PARAMS='PLATFORM_EXTRAS='
|
||||
- os: linux
|
||||
dist: xenial
|
||||
sudo: required
|
||||
env: MAKE_PARAMS='PLATFORM_EXTRAS=BTADDON'
|
||||
jobs:
|
||||
- TO_TEST=MAKEFILE MAKE_PARAMS='PLATFORM_EXTRAS='
|
||||
- TO_TEST=MAKEFILE MAKE_PARAMS='PLATFORM_EXTRAS=BTADDON'
|
||||
- TO_TEST=CMAKE
|
||||
|
||||
addons:
|
||||
apt:
|
||||
@@ -53,18 +47,17 @@ before_install:
|
||||
fi
|
||||
|
||||
install:
|
||||
if ! arm-none-eabi-gcc -v; then
|
||||
if ! arm-none-eabi-gcc -v; then
|
||||
echo "arm-none-eabi-gcc [ERROR]";
|
||||
travis_terminate 1;
|
||||
fi
|
||||
|
||||
make clean;
|
||||
make all V=1 "$MAKE_PARAMS";
|
||||
|
||||
script:
|
||||
## start and run a test script
|
||||
if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
|
||||
./pm3test.sh;
|
||||
elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
|
||||
./pm3test.sh;
|
||||
fi
|
||||
- if [ "$TO_TEST" = "MAKEFILE" ]; then
|
||||
make clean && make V=1 "$MAKE_PARAMS";
|
||||
./pm3test.sh;
|
||||
fi
|
||||
- if [ "$TO_TEST" = "CMAKE" ]; then
|
||||
mkdir -p client/build && ( cd client/build && cmake .. && make VERBOSE=1 );
|
||||
PM3BIN=./client/build/proxmark3 ./pm3test.sh client;
|
||||
fi
|
||||
|
||||
@@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file.
|
||||
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
|
||||
|
||||
## [unreleased][unreleased]
|
||||
- Added `HF_MSDSAL` standalone mode which read and emulate Visa EMV cards (@Netxing)
|
||||
- Added Mifare Ultralight tear off experiment (@cintainfinita and @fukmar)
|
||||
- Added Mifare Desfire Read/Write/Create files/records/values functionality and several fixes to `hf mfdes` (@bkerler)
|
||||
- Added CreateStdFile command to Mifare `hf mfdes` (@bkerler)
|
||||
- Rework des/3des/3k3des/aes auth. Port to mbedtls crypto library on device (@bkerler)
|
||||
|
||||
+6
-1
@@ -28,7 +28,7 @@ POSTCOMPILE = $(MV) -f $(OBJDIR)/$*.Td $(OBJDIR)/$*.d && $(TOUCH) $@
|
||||
BINDIR := .
|
||||
OBJDIR := obj
|
||||
|
||||
MYOBJS = $(MYSRCS:%.c=$(OBJDIR)/%.o)
|
||||
MYOBJS ?= $(MYSRCS:%.c=$(OBJDIR)/%.o)
|
||||
CLEAN = $(foreach bin,$(MYLIBS) $(BINS) $(LIB_A),$(BINDIR)/$(bin))
|
||||
|
||||
all: $(foreach bin,$(MYLIBS) $(BINS) $(LIB_A),$(BINDIR)/$(bin))
|
||||
@@ -36,6 +36,11 @@ all: $(foreach bin,$(MYLIBS) $(BINS) $(LIB_A),$(BINDIR)/$(bin))
|
||||
clean:
|
||||
$(Q)$(RM) $(CLEAN)
|
||||
$(Q)$(RMDIR) $(OBJDIR)
|
||||
ifneq (,$(MYCLEANOLDPATH))
|
||||
$(Q)$(RM) $(foreach f,$(CLEAN),$(MYCLEANOLDPATH)/$(f))
|
||||
$(Q)$(RMDIR) $(MYCLEANOLDPATH)/$(OBJDIR)
|
||||
$(Q)$(RMDIR_SOFT) $(MYCLEANOLDPATH) 2>/dev/null || true
|
||||
endif
|
||||
|
||||
install: all
|
||||
ifneq (,$(INSTALLTOOLS))
|
||||
|
||||
@@ -15,13 +15,13 @@
|
||||
|[Development](#development) | **[Important notes on ModemManager for Linux users](/doc/md/Installation_Instructions/ModemManager-Must-Be-Discarded.md)** | [Validating proxmark client functionality](/doc/md/Use_of_Proxmark/1_Validation.md) |
|
||||
|[Why didn't you base it on official Proxmark3 Master?](#why-didnt-you-base-it-on-official-proxmark3-master)| **[Homebrew (Mac OS X) & Upgrading HomeBrew Tap Formula](/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md)** | [First Use and Verification](/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md)|
|
||||
|[Proxmark3 GUI](#proxmark3-gui)|**[Setup and build for Windows](/doc/md/Installation_Instructions/Windows-Installation-Instructions.md)**|[Commands & Features](/doc/md/Use_of_Proxmark/3_Commands-and-Features.md)|
|
||||
|[Issues](#issues)|[Blue shark manual](/doc/bt_manual_v10.md) |[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|
|
||||
|[Issues](#issues)|[Blue shark manual](/doc/bt_manual_v10.md) ||
|
||||
|[Notes on UART](/doc/uart_notes.md)|[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)|
|
||||
|[Notes on frame format](/doc/new_frame_format.md)||[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)|
|
||||
|[Notes on frame format](/doc/new_frame_format.md)|[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)|
|
||||
|[Notes on external flash](/doc/ext_flash_notes.md)||[EMV](/doc/emv_notes.md)|
|
||||
|[Notes on Termux / Android](/doc/termux_notes.md)||[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)|
|
||||
|[Notes on tracedata / wireshark](/doc/trace_notes.md)||[JTAG](/doc/jtag_notes.md)|
|
||||
|[Notes on loclass](/doc/loclass_notes.md)||[Complete client command set](/doc/commands.md)|
|
||||
|[Notes on Termux / Android](/doc/termux_notes.md)|**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)|
|
||||
|[Notes on tracedata / wireshark](/doc/trace_notes.md)|**[JTAG](/doc/jtag_notes.md)**||
|
||||
|[Notes on loclass](/doc/loclass_notes.md)|||
|
||||
|[Notes on paths](/doc/path_notes.md)|||
|
||||
|[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) ||
|
||||
|[Donations](#Donations)|||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Default standalone if no standalone specified
|
||||
DEFAULT_STANDALONE=LF_SAMYRUN
|
||||
HELP_EXAMPLE_STANDALONE=HF_YOUNG
|
||||
DEFAULT_STANDALONE=HF_MSDSAL
|
||||
HELP_EXAMPLE_STANDALONE=LF_SAMYRUN
|
||||
# (you can set explicitly STANDALONE= to disable standalone modes)
|
||||
STANDALONE?=$(DEFAULT_STANDALONE)
|
||||
STANDALONE_REQ_DEFS=
|
||||
@@ -11,51 +11,54 @@ define KNOWN_STANDALONE_DEFINITIONS
|
||||
+==========================================================+
|
||||
| (empty) | No standalone mode |
|
||||
+----------------------------------------------------------+
|
||||
| LF_SAMYRUN | HID26 read/clone/sim |
|
||||
| (default) | - Samy Kamkar |
|
||||
+----------------------------------------------------------+
|
||||
| LF_ICERUN | standalone mode skeleton |
|
||||
| LF_SKELETON | standalone mode skeleton |
|
||||
| | - iceman |
|
||||
+----------------------------------------------------------+
|
||||
| LF_PROXBRUTE | HID ProxII bruteforce |
|
||||
| | - Brad Antoniewicz |
|
||||
+----------------------------------------------------------+
|
||||
| LF_HIDBRUTE | HID corporate 1000 bruteforce |
|
||||
| | - Federico dotta & Maurizio Agazzini |
|
||||
+----------------------------------------------------------+
|
||||
| HF_YOUNG | Mifare sniff/simulation |
|
||||
| | - Craig Young |
|
||||
+----------------------------------------------------------+
|
||||
| HF_MATTYRUN | Mifare sniff/clone |
|
||||
| | - Matías A. Ré Medina |
|
||||
+----------------------------------------------------------+
|
||||
| HF_COLIN | Mifare ultra fast sniff/sim/clone |
|
||||
| (RDV4 only) | - Colin Brigato |
|
||||
+----------------------------------------------------------+
|
||||
| HF_BOG | 14a sniff with ULC/ULEV1/NTAG auth |
|
||||
| (RDV4 only) | storing in flashmem - Bogito |
|
||||
+----------------------------------------------------------+
|
||||
| HF_14ASNIFF | 14a sniff to flashmem |
|
||||
| (RDV4 only) | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_ICEHID | LF HID collector to flashmem |
|
||||
| (RDV4 only) | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_EM4100EMUL | Simulate predefined em4100 tags only |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_EM4100RWC | Read/simulate em4100 tags & clone it |
|
||||
| | to T555x tags |
|
||||
+----------------------------------------------------------+
|
||||
| LF_HIDBRUTE | HID corporate 1000 bruteforce |
|
||||
| | - Federico dotta & Maurizio Agazzini |
|
||||
+----------------------------------------------------------+
|
||||
| LF_ICEHID | LF HID collector to flashmem |
|
||||
| (RDV4 only) | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_PROXBRUTE | HID ProxII bruteforce |
|
||||
| | - Brad Antoniewicz |
|
||||
+----------------------------------------------------------+
|
||||
| LF_SAMYRUN | HID26 read/clone/sim |
|
||||
| | - Samy Kamkar |
|
||||
+----------------------------------------------------------+
|
||||
| HF_14ASNIFF | 14a sniff to flashmem |
|
||||
| (RDV4 only) | |
|
||||
+----------------------------------------------------------+
|
||||
| HF_BOG | 14a sniff with ULC/ULEV1/NTAG auth |
|
||||
| (RDV4 only) | storing in flashmem - Bogito |
|
||||
+----------------------------------------------------------+
|
||||
| HF_COLIN | Mifare ultra fast sniff/sim/clone |
|
||||
| (RDV4 only) | - Colin Brigato |
|
||||
+----------------------------------------------------------+
|
||||
| HF_LEGIC | Read/simulate Legic Prime tags |
|
||||
| | storing in flashmem |
|
||||
+----------------------------------------------------------+
|
||||
| HF_MATTYRUN | Mifare sniff/clone |
|
||||
| | - Matías A. Ré Medina |
|
||||
+----------------------------------------------------------+
|
||||
| HF_MSDSAL | Read and emulate MSD Visa cards |
|
||||
| (default) | - Salvador Mendoza |
|
||||
+----------------------------------------------------------+
|
||||
| HF_YOUNG | Mifare sniff/simulation |
|
||||
| | - Craig Young |
|
||||
+----------------------------------------------------------+
|
||||
endef
|
||||
|
||||
STANDALONE_MODES := LF_SAMYRUN LF_ICERUN LF_PROXBRUTE LF_HIDBRUTE LF_ICEHID LF_EM4100EMUL LF_EM4100RWC
|
||||
STANDALONE_MODES += HF_YOUNG HF_MATTYRUN HF_COLIN HF_BOG HF_14ASNIFF HF_LEGIC
|
||||
STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RWC LF_HIDBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN
|
||||
STANDALONE_MODES += HF_14ASNIFF HF_BOG HF_COLIN HF_LEGIC HF_MATTYRUN HF_MSDSAL HF_YOUNG
|
||||
STANDALONE_MODES_REQ_SMARTCARD :=
|
||||
STANDALONE_MODES_REQ_FLASH := HF_COLIN HF_BOG HF_14ASNIFF LF_ICEHID
|
||||
STANDALONE_MODES_REQ_FLASH := LF_ICEHID HF_14ASNIFF HF_BOG HF_COLIN
|
||||
ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES)),)
|
||||
STANDALONE_PLATFORM_DEFS += -DWITH_STANDALONE_$(STANDALONE)
|
||||
ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES_REQ_SMARTCARD)),)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# Generic standalone Mode injection of source code
|
||||
|
||||
SRC_STANDALONE = placeholder.c
|
||||
# WITH_STANDALONE_LF_ICERUN
|
||||
ifneq (,$(findstring WITH_STANDALONE_LF_ICERUN,$(APP_CFLAGS)))
|
||||
SRC_STANDALONE = lf_icerun.c
|
||||
# WITH_STANDALONE_LF_SKELETON
|
||||
ifneq (,$(findstring WITH_STANDALONE_LF_SKELETON,$(APP_CFLAGS)))
|
||||
SRC_STANDALONE = lf_skeleton.c
|
||||
endif
|
||||
# WITH_STANDALONE_LF_SAMYRUN
|
||||
ifneq (,$(findstring WITH_STANDALONE_LF_SAMYRUN,$(APP_CFLAGS)))
|
||||
@@ -53,3 +53,7 @@ endif
|
||||
ifneq (,$(findstring WITH_STANDALONE_HF_LEGIC,$(APP_CFLAGS)))
|
||||
SRC_STANDALONE = hf_legic.c
|
||||
endif
|
||||
# WITH_STANDALONE_LF_MSDSAL
|
||||
ifneq (,$(findstring WITH_STANDALONE_HF_MSDSAL,$(APP_CFLAGS)))
|
||||
SRC_STANDALONE = hf_msdsal.c
|
||||
endif
|
||||
|
||||
@@ -47,10 +47,10 @@
|
||||
void DownloadLogInstructions() {
|
||||
Dbprintf("");
|
||||
Dbprintf("[=] List all dumps from flash:");
|
||||
Dbprintf("[=] " _YELLOW_("-") "mem spiffs tree");
|
||||
Dbprintf("[=] " _YELLOW_("-") " mem spiffs tree");
|
||||
Dbprintf("");
|
||||
Dbprintf("[=] To save a dump file from flash to client:");
|
||||
Dbprintf("[=] " _YELLOW_("-") "mem spiffs dump o hf-legic-UID-dump.bin f hf-legic-UID-dump.bin");
|
||||
Dbprintf("[=] " _YELLOW_("-") " mem spiffs dump o hf-legic-UID-dump.bin f hf-legic-UID-dump.bin");
|
||||
}
|
||||
|
||||
void save_dump_to_file(legic_card_select_t *p_card) {
|
||||
|
||||
@@ -0,0 +1,450 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Salvador Mendoza (salmg.net), 2020
|
||||
//
|
||||
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
|
||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||
// the license.
|
||||
//-----------------------------------------------------------------------------
|
||||
// Code for reading and emulating 14a technology aka MSDSal by Salvador Mendoza
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "standalone.h"
|
||||
#include "proxmark3_arm.h"
|
||||
#include "appmain.h"
|
||||
#include "fpgaloader.h"
|
||||
#include "util.h"
|
||||
#include "dbprint.h"
|
||||
#include "ticks.h"
|
||||
#include "string.h"
|
||||
#include "BigBuf.h"
|
||||
#include "iso14443a.h"
|
||||
#include "protocols.h"
|
||||
#include "cmd.h"
|
||||
|
||||
void ModInfo(void) {
|
||||
DbpString(" HF - Reading Visa cards & Emulating a Visa MSD Transaction(ISO14443) - (Salvador Mendoza)");
|
||||
}
|
||||
|
||||
/* This standalone implements two different modes: reading and emulating.
|
||||
*
|
||||
* The initial mode is reading with LED A as guide.
|
||||
* In this mode, the Proxmark expects a Visa Card,
|
||||
* and will act as card reader. Trying to find track 2.
|
||||
*
|
||||
* If the Proxmark found a track 2, it will change to emulation mode (LED C) automatically.
|
||||
* During this mode the Proxmark will behave as card, emulating a Visa MSD transaction
|
||||
* using the pre-saved track2 from the previous reading.
|
||||
*
|
||||
* It is possible to jump from mode to another by simply pressing the button.
|
||||
* However, to jump from reading to emulation mode, the LED C as to be on, which
|
||||
* means having a track 2 in memory.
|
||||
*
|
||||
* Keep pressing the button down will quit the standalone cycle.
|
||||
*
|
||||
* LEDs:
|
||||
* LED A = in reading mode
|
||||
* LED C = in emulation(a track 2 in memory) mode
|
||||
* LED A + LED C = in reading mode, but you can jump back to emulation mode by pressing the button
|
||||
* LED B = receiving/sending commands, activity
|
||||
*
|
||||
*
|
||||
* Reading or emulating ISO-14443A technology is not limited to payment cards. This example
|
||||
* was not only designed to make a replay attack, but to open new possibilities in the ISO-14443A
|
||||
* technologies. Be brave enough to share your knowledge & inspire others. Salvador Mendoza.
|
||||
*/
|
||||
|
||||
uint8_t ppdol [255] = {0x80, 0xA8, 0x00, 0x00, 0x02, 0x83, 0x00}; // Default GET PROCESSING
|
||||
|
||||
uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING
|
||||
uint8_t plen = 7;
|
||||
//PDOL Format: 80 A8 00 00 + (PDOL Length+2) + 83 + PDOL Length + PDOL + 00
|
||||
for (uint8_t i = 1; i <= apdu[0]; i++) { //Magic stuff, the generation order is important
|
||||
if (apdu[i] == 0x9F && apdu[i + 1] == 0x66) { //Terminal Transaction Qualifiers
|
||||
ppdol[plen] = 0xF6;
|
||||
ppdol[plen + 1] = 0x20;
|
||||
ppdol[plen + 2] = 0xC0;
|
||||
ppdol[plen + 3] = 0x00;
|
||||
plen += 4;
|
||||
i += 2;
|
||||
} else if (apdu[i] == 0x9F && apdu[i + 1] == 0x1A) { //Terminal Country Code
|
||||
ppdol[plen] = 0x9F;
|
||||
ppdol[plen + 1] = 0x1A;
|
||||
plen += 2;
|
||||
i += 2;
|
||||
} else if (apdu[i] == 0x5F && apdu[i + 1] == 0x2A) { //Transaction Currency Code
|
||||
ppdol[plen] = 0x5F;
|
||||
ppdol[plen + 1] = 0x2A;
|
||||
plen += 2;
|
||||
i += 2;
|
||||
} else if (apdu[i] == 0x9A) { //Transaction Date
|
||||
ppdol[plen] = 0x9A;
|
||||
ppdol[plen + 1] = 0x9A;
|
||||
ppdol[plen + 2] = 0x9A;
|
||||
plen += 3;
|
||||
i += 1;
|
||||
} else if (apdu[i] == 0x95) { //Terminal Verification Results
|
||||
ppdol[plen] = 0x95;
|
||||
ppdol[plen + 1] = 0x95;
|
||||
ppdol[plen + 2] = 0x95;
|
||||
ppdol[plen + 3] = 0x95;
|
||||
ppdol[plen + 4] = 0x95;
|
||||
plen += 5;
|
||||
i += 1;
|
||||
} else if (apdu[i] == 0x9C) { //Transaction Type
|
||||
ppdol[plen] = 0x9C;
|
||||
plen += 1;
|
||||
i += 1;
|
||||
} else if (apdu[i] == 0x9F && apdu[i + 1] == 0x37) { //Unpredictable Number
|
||||
ppdol[plen] = 0x9F;
|
||||
ppdol[plen + 1] = 0x37;
|
||||
ppdol[plen + 2] = 0x9F;
|
||||
ppdol[plen + 3] = 0x37;
|
||||
plen += 4;
|
||||
i += 2;
|
||||
} else { //To the others, add "0" to complete the format depending on its range
|
||||
uint8_t u = apdu[i + 2];
|
||||
while (u > 0) {
|
||||
ppdol[plen] = 0;
|
||||
plen += 1;
|
||||
u--;
|
||||
}
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
ppdol[4] = (plen + 2) - 7; // Length of PDOL + 2
|
||||
ppdol[6] = plen - 7; // Real length
|
||||
plen++; // +1 because the last 0
|
||||
ppdol[plen] = 0x00; // Add the last 0 to the challenge
|
||||
return plen;
|
||||
}
|
||||
|
||||
void RunMod() {
|
||||
StandAloneMode();
|
||||
Dbprintf(_YELLOW_(">>") "Reading Visa cards & Emulating a Visa MSD Transaction a.k.a. MSDSal Started<<");
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
||||
|
||||
//For reading process
|
||||
iso14a_card_select_t card_a_info;
|
||||
uint8_t apdubuffer[MAX_FRAME_SIZE] = { 0x00 };
|
||||
|
||||
//Specific for Visa cards: select ppse, select Visa AID, GET PROCESSING, SFI
|
||||
uint8_t ppse[20] = {0x00, 0xA4, 0x04, 0x00, 0x0e, 0x32, 0x50, 0x41, 0x59, 0x2e, 0x53, 0x59, 0x53, 0x2e, 0x44, 0x44, 0x46, 0x30, 0x31, 0x00};
|
||||
uint8_t visa[13] = {0x00, 0xA4, 0x04, 0x00, 0x07, 0xa0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0x00};
|
||||
uint8_t processing [8] = {0x80, 0xA8, 0x00, 0x00, 0x02, 0x83, 0x00, 0x00};
|
||||
uint8_t sfi[5] = {0x00, 0xb2, 0x01, 0x0c, 0x00};
|
||||
|
||||
uint8_t *apdus[4] = {ppse, visa, processing, sfi};
|
||||
uint8_t apdusLen [4] = { sizeof(ppse), sizeof(visa), sizeof(processing), sizeof(sfi)};
|
||||
|
||||
uint8_t pdol[50], plen = 8;
|
||||
|
||||
bool existpdol;
|
||||
|
||||
|
||||
// - MSD token card format -
|
||||
//
|
||||
//Card number: 4412 3456 0578 1234
|
||||
//Expiration date: 17/11
|
||||
//Service code: 201
|
||||
//Discretionary data: 0000030000991
|
||||
//char token[19] = {0x44,0x12,0x34,0x56,0x05,0x78,0x12,0x34,0xd1,0x71,0x12,0x01,0x00,0x00,0x03,0x00,0x00,0x99,0x1f};
|
||||
//
|
||||
// It is possible to initialize directly the emulation mode, having "token" with data and set "chktoken" = true ;)
|
||||
//
|
||||
char token[19] = {0x00};
|
||||
bool chktoken = false;
|
||||
|
||||
//For emulation steps
|
||||
#define ATQA 0
|
||||
#define UIDC1 1
|
||||
#define SAKC1 3
|
||||
#define RATS 5
|
||||
#define SIGNATURE 7
|
||||
|
||||
// Allocate 512 bytes for the dynamic modulation, created when the reader queries for it
|
||||
// Such a response is less time critical, so we can prepare them on the fly
|
||||
#define DYNAMIC_RESPONSE_BUFFER_SIZE 64
|
||||
#define DYNAMIC_MODULATION_BUFFER_SIZE 512
|
||||
|
||||
uint8_t flags = FLAG_4B_UID_IN_DATA; //UID 4 bytes(could be 7 bytes if needed it)
|
||||
uint8_t data[PM3_CMD_DATA_SIZE] = {0x00}; // in case there is a read command received we shouldn't break
|
||||
|
||||
uint8_t visauid[7] = {0x01, 0x02, 0x03, 0x04};
|
||||
memcpy(data, visauid, 4);
|
||||
|
||||
// to initialize the emulation
|
||||
uint8_t tagType = 4; // 4 = ISO/IEC 14443-4 - javacard (JCOP)
|
||||
tag_response_info_t *responses;
|
||||
uint32_t cuid = 0;
|
||||
uint32_t counters[3] = { 0x00, 0x00, 0x00 };
|
||||
uint8_t tearings[3] = { 0xbd, 0xbd, 0xbd };
|
||||
uint8_t pages = 0;
|
||||
|
||||
// command buffers
|
||||
uint8_t receivedCmd[MAX_FRAME_SIZE] = { 0x00 };
|
||||
uint8_t receivedCmdPar[MAX_PARITY_SIZE] = { 0x00 };
|
||||
|
||||
uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE];
|
||||
uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE];
|
||||
|
||||
// to know the transaction status
|
||||
uint8_t prevCmd = 0;
|
||||
|
||||
// handler - command responses
|
||||
tag_response_info_t dynamic_response_info = {
|
||||
.response = dynamic_response_buffer,
|
||||
.response_n = 0,
|
||||
.modulation = dynamic_modulation_buffer,
|
||||
.modulation_n = 0
|
||||
};
|
||||
|
||||
// States for standalone
|
||||
#define STATE_READ 0
|
||||
#define STATE_EMU 1
|
||||
|
||||
uint8_t state = STATE_READ;
|
||||
|
||||
//Checking if the user wants to go directly to emulation mode using a hardcoded track 2
|
||||
if (chktoken == true && token[0] != 0x00) {
|
||||
state = STATE_EMU;
|
||||
Dbprintf(_YELLOW_("[") "Initialized emulation mode " _YELLOW_("]"));
|
||||
DbpString("\n"_YELLOW_("!!") "Waiting for a card reader...");
|
||||
} else {
|
||||
DbpString(_YELLOW_("[") "Initialized reading mode " _YELLOW_("]"));
|
||||
DbpString("\n"_YELLOW_("!!") "Waiting for a Visa card...");
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
WDT_HIT();
|
||||
|
||||
// exit from RunMod, send a usbcommand.
|
||||
if (data_available()) break;
|
||||
|
||||
// Was our button held down or pressed?
|
||||
int button_pressed = BUTTON_HELD(1000);
|
||||
|
||||
if (button_pressed == 1) //Holding down the button
|
||||
break;
|
||||
else if (button_pressed == -1) { //Pressing one time change between reading & emulation
|
||||
if (state == STATE_READ) {
|
||||
if (chktoken == true && token[0] != 0x00) { //Only change to emulation if it saved a track 2 in memory
|
||||
state = STATE_EMU;
|
||||
Dbprintf(_YELLOW_("[") "In emulation mode " _YELLOW_("]"));
|
||||
} else
|
||||
Dbprintf(_YELLOW_("!!") "Nothing in memory to emulate");
|
||||
} else {
|
||||
state = STATE_READ;
|
||||
Dbprintf(_YELLOW_("[") "In reading mode " _YELLOW_("]"));
|
||||
}
|
||||
}
|
||||
|
||||
SpinDelay(500);
|
||||
|
||||
if (state == STATE_READ) {
|
||||
LED_A_ON();
|
||||
if (chktoken)
|
||||
LED_C_ON();
|
||||
|
||||
iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD);
|
||||
|
||||
if (iso14443a_select_card(NULL, &card_a_info, NULL, true, 0, false)) {
|
||||
|
||||
Dbprintf(_YELLOW_("+") "Found ISO 14443 Type A!");
|
||||
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
chktoken = false;
|
||||
LED_C_OFF();
|
||||
LED_B_ON();
|
||||
uint8_t apdulen = iso14_apdu(apdus[i], (uint16_t) apdusLen[i], false, apdubuffer, NULL);
|
||||
|
||||
if (apdulen > 0) {
|
||||
Dbprintf(_YELLOW_("[") "Proxmark command " _YELLOW_("]"));
|
||||
Dbhexdump(apdusLen[i], apdus[i], false);
|
||||
Dbprintf(_GREEN_("[") "Card answer " _GREEN_("]"));
|
||||
Dbhexdump(apdulen - 2, apdubuffer, false);
|
||||
Dbprintf("----");
|
||||
|
||||
for (uint8_t u = 0; u < apdulen; u++) {
|
||||
if (i == 1) {
|
||||
if (apdubuffer[u] == 0x9F && apdubuffer[u + 1] == 0x38) { //Check for PDOL
|
||||
for (uint8_t e = 0; e <= apdubuffer[u + 2]; e++)
|
||||
pdol[e] = apdubuffer[u + e + 2];
|
||||
|
||||
plen = treatPDOL(pdol); //Generate a challenge
|
||||
apdus[2] = ppdol;
|
||||
apdusLen[2] = plen;
|
||||
existpdol = true;
|
||||
}
|
||||
} else if (i == 3) {
|
||||
if (apdubuffer[u] == 0x57 && apdubuffer[u + 1] == 0x13 && !chktoken) { //Find track 2
|
||||
chktoken = true;
|
||||
memcpy(&token, &apdubuffer[u + 2], 19);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 1) {
|
||||
Dbprintf(_GREEN_("[") "Challenge generated " _GREEN_("]"));
|
||||
Dbhexdump(plen, existpdol ? ppdol : processing, false);
|
||||
}
|
||||
} else {
|
||||
Dbprintf(_YELLOW_("!!") "Error reading the card");
|
||||
}
|
||||
LED_B_OFF();
|
||||
}
|
||||
|
||||
if (chktoken) {
|
||||
Dbprintf(_RED_("[") "Track 2 " _RED_("]"));
|
||||
Dbhexdump(19, (uint8_t *)token, false);
|
||||
Dbprintf(_YELLOW_("!!") "Card number");
|
||||
Dbhexdump(8, (uint8_t *)token, false);
|
||||
DbpString("---");
|
||||
LED_C_ON();
|
||||
state = STATE_EMU;
|
||||
Dbprintf(_YELLOW_("[") "Initialized emulation mode " _YELLOW_("]"));
|
||||
DbpString("\n"_YELLOW_("!!") "Waiting for a card reader...");
|
||||
}
|
||||
}
|
||||
} else if (state == STATE_EMU) {
|
||||
LED_A_OFF();
|
||||
LED_C_ON();
|
||||
|
||||
// free eventually allocated BigBuf memory but keep Emulator Memory
|
||||
BigBuf_free_keep_EM();
|
||||
|
||||
if (SimulateIso14443aInit(tagType, flags, data, &responses, &cuid, counters, tearings, &pages) == false) {
|
||||
BigBuf_free_keep_EM();
|
||||
reply_ng(CMD_HF_MIFARE_SIMULATE, PM3_EINIT, NULL, 0);
|
||||
DbpString(_YELLOW_("!!") "Error initializing the emulation process!");
|
||||
SpinDelay(500);
|
||||
state = STATE_READ;
|
||||
DbpString(_YELLOW_("[") "Initialized reading mode " _YELLOW_("]"));
|
||||
DbpString("\n" _YELLOW_("!!") "Waiting for a Visa card...");
|
||||
break;
|
||||
}
|
||||
|
||||
// We need to listen to the high-frequency, peak-detected path.
|
||||
iso14443a_setup(FPGA_HF_ISO14443A_TAGSIM_LISTEN);
|
||||
|
||||
int len = 0; // command length
|
||||
int retval = PM3_SUCCESS; // to check emulation status
|
||||
|
||||
clear_trace();
|
||||
set_tracing(true);
|
||||
|
||||
for (;;) {
|
||||
LED_B_OFF();
|
||||
// Clean receive command buffer
|
||||
if (!GetIso14443aCommandFromReader(receivedCmd, receivedCmdPar, &len)) {
|
||||
Dbprintf(_YELLOW_("!!") "Emulator stopped");
|
||||
retval = PM3_EOPABORTED;
|
||||
break;
|
||||
}
|
||||
tag_response_info_t *p_response = NULL;
|
||||
LED_B_ON();
|
||||
|
||||
// dynamic_response_info will be in charge of responses
|
||||
dynamic_response_info.response_n = 0;
|
||||
|
||||
// Checking the commands order is important and elemental
|
||||
if (receivedCmd[0] == ISO14443A_CMD_REQA && len == 1) { // Received a REQUEST
|
||||
DbpString(_YELLOW_("+") "REQUEST Received");
|
||||
p_response = &responses[ATQA];
|
||||
} else if (receivedCmd[0] == ISO14443A_CMD_HALT && len == 4) { // Received a HALT
|
||||
DbpString(_YELLOW_("+") "Received a HALT");
|
||||
p_response = NULL;
|
||||
} else if (receivedCmd[0] == ISO14443A_CMD_WUPA && len == 1) { // Received a WAKEUP //Este!!
|
||||
DbpString(_YELLOW_("+") "WAKEUP Received");
|
||||
p_response = &responses[ATQA];
|
||||
prevCmd = 0;
|
||||
} else if (receivedCmd[1] == 0x20 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 2) { // Received request for UID (cascade 1)
|
||||
DbpString(_YELLOW_("+") "Request for UID C1");
|
||||
p_response = &responses[UIDC1];
|
||||
} else if (receivedCmd[1] == 0x70 && receivedCmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && len == 9) { // Received a SELECT (cascade 1)
|
||||
DbpString(_YELLOW_("+") "Request for SELECT S1");
|
||||
p_response = &responses[SAKC1];
|
||||
} else if (receivedCmd[0] == ISO14443A_CMD_RATS && len == 4) { // Received a RATS request
|
||||
DbpString(_YELLOW_("+") "Request for RATS");
|
||||
p_response = &responses[RATS];
|
||||
} else {
|
||||
Dbprintf(_YELLOW_("[") "Card reader command " _YELLOW_("]"));
|
||||
Dbhexdump(len, receivedCmd, false);
|
||||
|
||||
if (receivedCmd[0] == 0x02 || receivedCmd[0] == 0x03) { //Emulate a Visa MSD(Magnetic stripe data) card
|
||||
dynamic_response_info.response[0] = receivedCmd[0];
|
||||
|
||||
//Depending on card reader commands, the Proxmark will answer to fool the reader
|
||||
if (receivedCmd[2] == 0xA4 && receivedCmd[6] == 0x32 && prevCmd == 0) { //Respond with PPSE
|
||||
uint8_t ppsea[39] = {0x6F, 0x23, 0x84, 0x0E, 0x32, 0x50, 0x41, 0x59, 0x2E, 0x53, 0x59, 0x53, 0x2E, 0x44, 0x44, 0x46, 0x30, 0x31, 0xA5, 0x11, 0xBF, 0x0C, 0x0E, 0x61, 0x0C, 0x4F, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0x87, 0x01, 0x01, 0x90, 0x00};
|
||||
memcpy(&dynamic_response_info.response[1], ppsea, sizeof(ppsea));
|
||||
dynamic_response_info.response_n = sizeof(ppsea) + 1;
|
||||
prevCmd++;
|
||||
} else if (receivedCmd[2] == 0xA4 && receivedCmd[10] == 0x03 && receivedCmd[11] == 0x10 && prevCmd == 1) { //Respond Visa AID
|
||||
uint8_t visauid_long[34] = {0x6F, 0x1E, 0x84, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0xA5, 0x13, 0x50, 0x0B, 0x56, 0x49, 0x53, 0x41, 0x20, 0x43, 0x52, 0x45, 0x44, 0x49, 0x54, 0x9F, 0x38, 0x03, 0x9F, 0x66, 0x02, 0x90, 0x00};
|
||||
memcpy(&dynamic_response_info.response[1], visauid_long, sizeof(visauid_long));
|
||||
dynamic_response_info.response_n = sizeof(visauid_long) + 1;
|
||||
prevCmd++;
|
||||
} else if (receivedCmd[1] == 0x80 && receivedCmd[2] == 0xA8 && receivedCmd[6] == 0x83 && prevCmd == 2) { //GET PROCESSING
|
||||
uint8_t processing_long[10] = {0x80, 0x06, 0x00, 0x80, 0x08, 0x01, 0x01, 0x00, 0x90, 0x00};
|
||||
memcpy(&dynamic_response_info.response[1], processing_long, sizeof(processing_long));
|
||||
dynamic_response_info.response_n = sizeof(processing_long) + 1;
|
||||
prevCmd++;
|
||||
} else if (receivedCmd[1] == 0x00 && receivedCmd[2] == 0xB2 && prevCmd == 3) { //SFI
|
||||
uint8_t last[4] = {0x70, 0x15, 0x57, 0x13};
|
||||
uint8_t statusapdu[2] = {0x90, 0x00};
|
||||
uint8_t card[25];
|
||||
memcpy(&card[0], last, sizeof(last));
|
||||
memcpy(&card[4], token, sizeof(token));
|
||||
memcpy(&card[23], statusapdu, sizeof(statusapdu));
|
||||
memcpy(&dynamic_response_info.response[1], card, sizeof(card));
|
||||
dynamic_response_info.response_n = sizeof(card) + 1;
|
||||
prevCmd++;
|
||||
} else {
|
||||
uint8_t finished[2] = {0x6f, 0x00};
|
||||
memcpy(&dynamic_response_info.response[1], finished, sizeof(finished));
|
||||
dynamic_response_info.response_n = sizeof(finished) + 1;
|
||||
if (prevCmd == 5) {
|
||||
prevCmd = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Dbprintf(_YELLOW_("!!") "Received unknown command!");
|
||||
if (prevCmd < 4) {
|
||||
memcpy(dynamic_response_info.response, receivedCmd, len);
|
||||
dynamic_response_info.response_n = len;
|
||||
} else {
|
||||
dynamic_response_info.response_n = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dynamic_response_info.response_n > 0) {
|
||||
Dbprintf(_GREEN_("[") "Proxmark3 answer " _GREEN_("]"));
|
||||
Dbhexdump(dynamic_response_info.response_n, dynamic_response_info.response, false);
|
||||
Dbprintf("----");
|
||||
|
||||
// Add CRC bytes, always used in ISO 14443A-4 compliant cards
|
||||
AddCrc14A(dynamic_response_info.response, dynamic_response_info.response_n);
|
||||
dynamic_response_info.response_n += 2;
|
||||
|
||||
if (prepare_tag_modulation(&dynamic_response_info, DYNAMIC_MODULATION_BUFFER_SIZE) == false) {
|
||||
SpinDelay(500);
|
||||
DbpString(_YELLOW_("!!") "Error preparing Proxmark to answer!");
|
||||
continue;
|
||||
}
|
||||
p_response = &dynamic_response_info;
|
||||
}
|
||||
|
||||
if (p_response != NULL) {
|
||||
EmSendPrecompiledCmd(p_response);
|
||||
}
|
||||
}
|
||||
switch_off();
|
||||
|
||||
set_tracing(false);
|
||||
BigBuf_free_keep_EM();
|
||||
reply_ng(CMD_HF_MIFARE_SIMULATE, retval, NULL, 0);
|
||||
}
|
||||
}
|
||||
DbpString(_YELLOW_("[=]") "exiting");
|
||||
LEDsoff();
|
||||
}
|
||||
@@ -85,7 +85,7 @@ void RunMod() {
|
||||
Dbprintf("[=] >> LF EM4100 simulator started <<");
|
||||
|
||||
int selected = 0; //selected slot after start
|
||||
slots_count = sizeof(low) / sizeof(low[0]);
|
||||
slots_count = ARRAYLEN(low);
|
||||
bba = BigBuf_get_addr();
|
||||
for (;;) {
|
||||
WDT_HIT();
|
||||
|
||||
@@ -129,7 +129,7 @@ void RunMod() {
|
||||
// 2 - simulate tag from selected slot
|
||||
// 3 - write to T5555 tag
|
||||
uint8_t state = 0;
|
||||
slots_count = sizeof(low) / sizeof(low[0]);
|
||||
slots_count = ARRAYLEN(low);
|
||||
bba = BigBuf_get_addr();
|
||||
LED_Slot(selected);
|
||||
for (;;) {
|
||||
|
||||
@@ -57,9 +57,9 @@
|
||||
void DownloadLogInstructions() {
|
||||
Dbprintf("");
|
||||
Dbprintf("[=] To get the logfile from flash and display it:");
|
||||
Dbprintf("[=] " _YELLOW_("1.") "mem spiffs dump o "LF_HIDCOLLECT_LOGFILE" f "LF_HIDCOLLECT_LOGFILE);
|
||||
Dbprintf("[=] " _YELLOW_("2.") "exit proxmark3 client");
|
||||
Dbprintf("[=] " _YELLOW_("3.") "cat "LF_HIDCOLLECT_LOGFILE);
|
||||
Dbprintf("[=] " _YELLOW_("1.") " mem spiffs dump o "LF_HIDCOLLECT_LOGFILE" f "LF_HIDCOLLECT_LOGFILE);
|
||||
Dbprintf("[=] " _YELLOW_("2.") " exit proxmark3 client");
|
||||
Dbprintf("[=] " _YELLOW_("3.") " cat "LF_HIDCOLLECT_LOGFILE);
|
||||
}
|
||||
|
||||
bool log_exists;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||
// the license.
|
||||
//-----------------------------------------------------------------------------
|
||||
// main code for skeleton aka IceRun by Iceman
|
||||
// main code for skeleton by Iceman
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "standalone.h" // standalone definitions
|
||||
#include "proxmark3_arm.h"
|
||||
@@ -15,19 +15,19 @@
|
||||
#include "dbprint.h"
|
||||
|
||||
void ModInfo(void) {
|
||||
DbpString(" LF skeleton mode - aka IceRun (iceman)");
|
||||
DbpString(" LF skeleton mode - aka Skeleton (iceman)");
|
||||
}
|
||||
|
||||
void RunMod() {
|
||||
StandAloneMode();
|
||||
Dbprintf("[=] LF skeleton code a.k.a IceRun started");
|
||||
Dbprintf("[=] LF skeleton code a.k.a Skeleton started");
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
|
||||
|
||||
// the main loop for your standalone mode
|
||||
for (;;) {
|
||||
WDT_HIT();
|
||||
|
||||
// exit from IceRun, send a usbcommand.
|
||||
// exit from RunMod, send a usbcommand.
|
||||
if (data_available()) break;
|
||||
|
||||
// Was our button held down or pressed?
|
||||
@@ -3,7 +3,7 @@
|
||||
This contains functionality for different StandAlone modes. The fullimage will be built given the correct compiler flags used. Build targets for these files are contained in `Makefile.inc` and `Makefile.hal`
|
||||
|
||||
If you want to implement a new standalone mode, you need to implement the methods provided in `standalone.h`.
|
||||
Have a look at the skeleton standalone mode called IceRun, in the files `lf_icerun.c lf_icerun.h`.
|
||||
Have a look at the skeleton standalone mode, in the file `lf_skeleton.c`.
|
||||
|
||||
As it is now, you can only have one standalone mode installed at the time.
|
||||
|
||||
@@ -58,7 +58,7 @@ This leads to your next step, your DEFINE name needed in Makefile.
|
||||
|
||||
## Update MAKEFILE.HAL
|
||||
|
||||
Add your mode to the `Makefile.hal` help and modes list:
|
||||
Add your mode to the `Makefile.hal` help and modes list (alphabetically):
|
||||
```
|
||||
+==========================================================+
|
||||
| STANDALONE | DESCRIPTION |
|
||||
@@ -68,24 +68,24 @@ Add your mode to the `Makefile.hal` help and modes list:
|
||||
| LF_FOO | My foobar mode will make you coffee |
|
||||
+----------------------------------------------------------+
|
||||
|
||||
STANDALONE_MODES := LF_SAMYRUN LF_ICERUN LF_PROXBRUTE LF_HIDBRUTE LF_FOO
|
||||
STANDALONE_MODES += HF_YOUNG HF_MATTYRUN HF_COLIN HF_BOG
|
||||
STANDALONE_MODES := LF_... LF_FOO
|
||||
STANDALONE_MODES += HF_...
|
||||
```
|
||||
|
||||
If your mode is using one of the unique features of the RDV4, add it to the proper list:
|
||||
|
||||
```
|
||||
STANDALONE_MODES_REQ_SMARTCARD :=
|
||||
STANDALONE_MODES_REQ_FLASH := HF_COLIN HF_BOG
|
||||
STANDALONE_MODES_REQ_FLASH :=
|
||||
```
|
||||
|
||||
## Update MAKEFILE.INC
|
||||
Add your source code files like the following sample in the `Makefile.inc`
|
||||
|
||||
```
|
||||
# WITH_STANDALONE_LF_ICERUN
|
||||
ifneq (,$(findstring WITH_STANDALONE_LF_ICERUN,$(APP_CFLAGS)))
|
||||
SRC_STANDALONE = lf_icerun.c
|
||||
# WITH_STANDALONE_LF_SKELETON
|
||||
ifneq (,$(findstring WITH_STANDALONE_LF_SKELETON,$(APP_CFLAGS)))
|
||||
SRC_STANDALONE = lf_skeleton.c
|
||||
endif
|
||||
|
||||
# WITH_STANDALONE_LF_FOO
|
||||
@@ -140,4 +140,13 @@ The final steps is to
|
||||
When compiling you will see a header showing what configurations your project compiled with.
|
||||
Make sure it says your standalone mode name.
|
||||
|
||||
## Submitting your code
|
||||
|
||||
Once you're ready to share your mode, please
|
||||
|
||||
* add a line in CHANGELOG.md
|
||||
* add your mode in the modes table in doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md
|
||||
|
||||
and submit your PR.
|
||||
|
||||
Happy hacking!
|
||||
|
||||
+2
-2
@@ -333,7 +333,7 @@ void printConnSpeed(void) {
|
||||
|
||||
Dbprintf(" Time elapsed............%dms", delta_time);
|
||||
Dbprintf(" Bytes transferred.......%d", bytes_transferred);
|
||||
Dbprintf(" Transfer Speed PM3 -> Client = " _YELLOW_("%d") "bytes/s", 1000 * bytes_transferred / delta_time);
|
||||
Dbprintf(" Transfer Speed PM3 -> Client = " _YELLOW_("%d") " bytes/s", 1000 * bytes_transferred / delta_time);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1295,7 +1295,7 @@ static void PacketReceived(PacketCommandNG *packet) {
|
||||
break;
|
||||
}
|
||||
case CMD_HF_MFU_OTP_TEAROFF: {
|
||||
MifareU_Otp_Tearoff();
|
||||
MifareU_Otp_Tearoff(packet->oldarg[0], packet->oldarg[1], packet->data.asBytes);
|
||||
break;
|
||||
}
|
||||
case CMD_HF_MIFARE_STATIC_NONCE: {
|
||||
|
||||
+3
-3
@@ -573,7 +573,7 @@ void Flashmem_print_info(void) {
|
||||
if (isok == 2) {
|
||||
num = ((keysum[1] << 8) | keysum[0]);
|
||||
if (num != 0xFFFF && num != 0x0)
|
||||
Dbprintf(" Mifare.................."_YELLOW_("%d")"keys", num);
|
||||
Dbprintf(" Mifare.................."_YELLOW_("%d")" keys", num);
|
||||
}
|
||||
|
||||
Flash_CheckBusy(BUSY_TIMEOUT);
|
||||
@@ -581,7 +581,7 @@ void Flashmem_print_info(void) {
|
||||
if (isok == 2) {
|
||||
num = ((keysum[1] << 8) | keysum[0]);
|
||||
if (num != 0xFFFF && num != 0x0)
|
||||
Dbprintf(" T55x7..................."_YELLOW_("%d")"keys", num);
|
||||
Dbprintf(" T55x7..................."_YELLOW_("%d")" keys", num);
|
||||
}
|
||||
|
||||
Flash_CheckBusy(BUSY_TIMEOUT);
|
||||
@@ -589,7 +589,7 @@ void Flashmem_print_info(void) {
|
||||
if (isok == 2) {
|
||||
num = ((keysum[1] << 8) | keysum[0]);
|
||||
if (num != 0xFFFF && num != 0x0)
|
||||
Dbprintf(" iClass.................."_YELLOW_("%d")"keys", num);
|
||||
Dbprintf(" iClass.................."_YELLOW_("%d")" keys", num);
|
||||
}
|
||||
|
||||
FlashStop();
|
||||
|
||||
@@ -32,7 +32,7 @@ bool hitag2_crack(uint8_t *response, uint8_t *nrarhex) {
|
||||
uint8_t uid[32];
|
||||
uint8_t nrar[64];
|
||||
uint8_t e_firstcmd[10];
|
||||
uint8_t e_page0cmd[10];
|
||||
// uint8_t e_page0cmd[10];
|
||||
uint8_t keybits[42];
|
||||
uint8_t pagehex[9];
|
||||
uint8_t temp[20];
|
||||
@@ -298,7 +298,6 @@ bool hitag2crack_read_page(uint8_t *responsestr, uint8_t pagenum, uint8_t *nrar,
|
||||
uint8_t e_responsestr[9];
|
||||
uint8_t e_response[32];
|
||||
uint8_t response[32];
|
||||
int i;
|
||||
|
||||
if (pagenum > 7) {
|
||||
UserMessage("hitag2crack_read_page:\r\n invalid pagenum\r\n");
|
||||
@@ -354,7 +353,6 @@ bool hitag2crack_send_e_cmd(uint8_t *responsestr, uint8_t *nrar, uint8_t *cmd, i
|
||||
// uint8_t tmp[37];
|
||||
uint8_t uid[9];
|
||||
uint8_t e_page3str[9];
|
||||
int ret = 0;
|
||||
|
||||
// get the UID
|
||||
if (!hitag2_get_uid(uid)) {
|
||||
|
||||
+3
-3
@@ -837,7 +837,7 @@ static void Code4bitAnswerAsTag(uint8_t cmd) {
|
||||
// stop when button is pressed or client usb connection resets
|
||||
// or return TRUE when command is captured
|
||||
//-----------------------------------------------------------------------------
|
||||
static bool GetIso14443aCommandFromReader(uint8_t *received, uint8_t *par, int *len) {
|
||||
bool GetIso14443aCommandFromReader(uint8_t *received, uint8_t *par, int *len) {
|
||||
// Set FPGA mode to "simulated ISO 14443 tag", no modulation (listen
|
||||
// only, since we are receiving, not transmitting).
|
||||
// Signal field is off with the appropriate LED
|
||||
@@ -873,7 +873,7 @@ static bool GetIso14443aCommandFromReader(uint8_t *received, uint8_t *par, int *
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool prepare_tag_modulation(tag_response_info_t *response_info, size_t max_buffer_size) {
|
||||
bool prepare_tag_modulation(tag_response_info_t *response_info, size_t max_buffer_size) {
|
||||
// Example response, answer to MIFARE Classic read block will be 16 bytes + 2 CRC = 18 bytes
|
||||
// This will need the following byte array for a modulation sequence
|
||||
// 144 data bits (18 * 8)
|
||||
@@ -919,7 +919,7 @@ bool prepare_allocated_tag_modulation(tag_response_info_t *response_info, uint8_
|
||||
}
|
||||
}
|
||||
|
||||
static bool SimulateIso14443aInit(int tagType, int flags, uint8_t *data, tag_response_info_t **responses, uint32_t *cuid, uint32_t counters[3], uint8_t tearings[3], uint8_t *pages) {
|
||||
bool SimulateIso14443aInit(int tagType, int flags, uint8_t *data, tag_response_info_t **responses, uint32_t *cuid, uint32_t counters[3], uint8_t tearings[3], uint8_t *pages) {
|
||||
uint8_t sak = 0;
|
||||
// The first response contains the ATQA (note: bytes are transmitted in reverse order).
|
||||
static uint8_t rATQA[2] = { 0x00 };
|
||||
|
||||
@@ -112,6 +112,8 @@ RAMFUNC int ManchesterDecoding(uint8_t bit, uint16_t offset, uint32_t non_real_t
|
||||
|
||||
void RAMFUNC SniffIso14443a(uint8_t param);
|
||||
void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data);
|
||||
bool SimulateIso14443aInit(int tagType, int flags, uint8_t *data, tag_response_info_t **responses, uint32_t *cuid, uint32_t counters[3], uint8_t tearings[3], uint8_t *pages);
|
||||
bool GetIso14443aCommandFromReader(uint8_t *received, uint8_t *par, int *len);
|
||||
void iso14443a_antifuzz(uint32_t flags);
|
||||
void ReaderIso14443a(PacketCommandNG *c);
|
||||
void ReaderTransmit(uint8_t *frame, uint16_t len, uint32_t *timing);
|
||||
@@ -136,6 +138,7 @@ int EmSendCmdParEx(uint8_t *resp, uint16_t respLen, uint8_t *par, bool collision
|
||||
int EmSendPrecompiledCmd(tag_response_info_t *p_response);
|
||||
|
||||
bool prepare_allocated_tag_modulation(tag_response_info_t *response_info, uint8_t **buffer, size_t *max_buffer_size);
|
||||
bool prepare_tag_modulation(tag_response_info_t *response_info, size_t max_buffer_size);
|
||||
|
||||
bool EmLogTrace(uint8_t *reader_data, uint16_t reader_len, uint32_t reader_StartTime, uint32_t reader_EndTime, uint8_t *reader_Parity,
|
||||
uint8_t *tag_data, uint16_t tag_len, uint32_t tag_StartTime, uint32_t tag_EndTime, uint8_t *tag_Parity);
|
||||
|
||||
+1
-1
@@ -465,7 +465,7 @@ void LegicRfSimulate(uint8_t cardtype) {
|
||||
}
|
||||
|
||||
LED_A_ON();
|
||||
DbpString("[=] Starting Legic emulator, press " _YELLOW_("button") "to end");
|
||||
DbpString("[=] Starting Legic emulator, press " _YELLOW_("button") " to end");
|
||||
while (!BUTTON_PRESS() && !data_available()) {
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user