diff --git a/tools/pm3_amii_bin2eml.pl b/tools/pm3_amii_bin2eml.pl new file mode 100755 index 000000000..bb16960d4 --- /dev/null +++ b/tools/pm3_amii_bin2eml.pl @@ -0,0 +1,681 @@ +#!/usr/bin/perl +# +# Read Amiibo data, decrypt, and produce EML file +# Convert proxmark MFU (MIFARE Ultralight) .bin to .eml format +# for proxmark3 loading and simulation +# +# -samy kamkar 05/28/2017 +# +# hf mf eload u FILENAME_MINUS_EML +# hf 14a sim t 7 u UID + +# perl -lne 'chomp; s/\s+(\S+)$//;$f=$1;if($f=~s/-(\S+)//){$g=hex($1);}else{$g=hex($f)}$f=hex($f); for$m($f..$g){print "0x" . substr(unpack("H4",pack("n",$m)),1) ." => \"$_\","}' /tmp/game >> game2 +# perl -lne 'if(/^(\S.*?)\s+\w?\w\w\w\w(\s*-\s*\w?\w\w\w\w)?\s*$/){$l=$1} s/(\w{4,5}\s*-\s*)?(\w{4,5})$//; $a=$1;$b=$2; $b=hex($b); $a=$a?hex($a):$b; for$m($a..$b){print "0x" . substr(unpack("H4",pack("n",$m)),0) ." => \"$l\","}' /tmp/g2 + +my $BLOCKS = 255; +my $UIDLOC = -540; # UID is 540 bytes from the end +my $BLOCKSIZE = 4; # in bytes +my $AMIITOOL = '../client/amiitool/amiitool'; # path to amiitool (unless in $PATH) +my $KEYFILE = '../client/amiitool/key_retail.bin'; # path to retail key file +my $ADDHDR = 1; # add 48 byte header? +my $DECRYPT = 0; # auto-decrypt + +my %game = ( +0x000 => "Mario", +0x001 => "Mario", +0x008 => "Yoshi's Woolly World", +0x010 => "The Legend of Zelda", +0x014 => "Breath of the Wild", +0x018 => "Animal Crossing", +0x019 => "Animal Crossing", +0x01a => "Animal Crossing", +0x01b => "Animal Crossing", +0x01c => "Animal Crossing", +0x01d => "Animal Crossing", +0x01e => "Animal Crossing", +0x01f => "Animal Crossing", +0x020 => "Animal Crossing", +0x021 => "Animal Crossing", +0x022 => "Animal Crossing", +0x023 => "Animal Crossing", +0x024 => "Animal Crossing", +0x025 => "Animal Crossing", +0x026 => "Animal Crossing", +0x027 => "Animal Crossing", +0x028 => "Animal Crossing", +0x029 => "Animal Crossing", +0x02a => "Animal Crossing", +0x02b => "Animal Crossing", +0x02c => "Animal Crossing", +0x02d => "Animal Crossing", +0x02e => "Animal Crossing", +0x02f => "Animal Crossing", +0x030 => "Animal Crossing", +0x031 => "Animal Crossing", +0x032 => "Animal Crossing", +0x033 => "Animal Crossing", +0x034 => "Animal Crossing", +0x035 => "Animal Crossing", +0x036 => "Animal Crossing", +0x037 => "Animal Crossing", +0x038 => "Animal Crossing", +0x039 => "Animal Crossing", +0x03a => "Animal Crossing", +0x03b => "Animal Crossing", +0x03c => "Animal Crossing", +0x03d => "Animal Crossing", +0x03e => "Animal Crossing", +0x03f => "Animal Crossing", +0x040 => "Animal Crossing", +0x041 => "Animal Crossing", +0x042 => "Animal Crossing", +0x043 => "Animal Crossing", +0x044 => "Animal Crossing", +0x045 => "Animal Crossing", +0x046 => "Animal Crossing", +0x047 => "Animal Crossing", +0x048 => "Animal Crossing", +0x049 => "Animal Crossing", +0x04a => "Animal Crossing", +0x04b => "Animal Crossing", +0x04c => "Animal Crossing", +0x04d => "Animal Crossing", +0x04e => "Animal Crossing", +0x04f => "Animal Crossing", +0x050 => "Animal Crossing", +0x051 => "Animal Crossing", +0x058 => "Star Fox", +0x05c => "Metroid", +0x060 => "F-Zero", +0x064 => "Pikmin", +0x06c => "Punch Out", +0x070 => "Wii Fit", +0x074 => "Kid Icarus", +0x078 => "Classic Nintendo", +0x07c => "Mii", +0x080 => "Splatoon", +0x09c => "Mario Sports Superstars", +0x09d => "Mario Sports Superstars", +0x190 => "Pokemon", +0x191 => "Pokemon", +0x192 => "Pokemon", +0x193 => "Pokemon", +0x194 => "Pokemon", +0x195 => "Pokemon", +0x196 => "Pokemon", +0x197 => "Pokemon", +0x198 => "Pokemon", +0x199 => "Pokemon", +0x19a => "Pokemon", +0x19b => "Pokemon", +0x19c => "Pokemon", +0x19d => "Pokemon", +0x19e => "Pokemon", +0x19f => "Pokemon", +0x1a0 => "Pokemon", +0x1a1 => "Pokemon", +0x1a2 => "Pokemon", +0x1a3 => "Pokemon", +0x1a4 => "Pokemon", +0x1a5 => "Pokemon", +0x1a6 => "Pokemon", +0x1a7 => "Pokemon", +0x1a8 => "Pokemon", +0x1a9 => "Pokemon", +0x1aa => "Pokemon", +0x1ab => "Pokemon", +0x1ac => "Pokemon", +0x1ad => "Pokemon", +0x1ae => "Pokemon", +0x1af => "Pokemon", +0x1b0 => "Pokemon", +0x1b1 => "Pokemon", +0x1b2 => "Pokemon", +0x1b3 => "Pokemon", +0x1b4 => "Pokemon", +0x1b5 => "Pokemon", +0x1b6 => "Pokemon", +0x1b7 => "Pokemon", +0x1b8 => "Pokemon", +0x1b9 => "Pokemon", +0x1ba => "Pokemon", +0x1bb => "Pokemon", +0x1bc => "Pokemon", +0x1bd => "Pokemon", +0x1d0 => "Pokken", +0x1f0 => "Kirby", +0x1f4 => "BoxBoy!", +0x210 => "Fire Emblem", +0x224 => "Xenoblade", +0x228 => "Earthbound", +0x22c => "Chibi Robo", +0x320 => "Sonic", +0x334 => "Pac-man", +0x348 => "Megaman", +0x34c => "Street fighter", +0x350 => "Monster Hunter", +0x35c => "Shovel Knight", +); + +my %type = ( +0x00 => "Figure", +0x01 => "Card", +0x02 => "Yarn", +); + +my %amiibo = ( +0x0000 => "Super Smash Bros.", +0x0001 => "Super Smash Bros.", +0x0002 => "Super Smash Bros.", +0x0003 => "Super Smash Bros.", +0x0004 => "Super Smash Bros.", +0x0005 => "Super Smash Bros.", +0x0006 => "Super Smash Bros.", +0x0007 => "Super Smash Bros.", +0x0008 => "Super Smash Bros.", +0x0009 => "Super Smash Bros.", +0x000a => "Super Smash Bros.", +0x000b => "Super Smash Bros.", +0x000c => "Super Smash Bros.", +0x000d => "Super Smash Bros.", +0x000e => "Super Smash Bros.", +0x000f => "Super Smash Bros.", +0x0010 => "Super Smash Bros.", +0x0011 => "Super Smash Bros.", +0x0012 => "Super Smash Bros.", +0x0013 => "Super Smash Bros.", +0x0014 => "Super Smash Bros.", +0x0015 => "Super Smash Bros.", +0x0016 => "Super Smash Bros.", +0x0017 => "Super Smash Bros.", +0x0018 => "Super Smash Bros.", +0x0019 => "Super Smash Bros.", +0x001a => "Super Smash Bros.", +0x001b => "Super Smash Bros.", +0x001c => "Super Smash Bros.", +0x001d => "Super Smash Bros.", +0x001e => "Super Smash Bros.", +0x001f => "Super Smash Bros.", +0x0020 => "Super Smash Bros.", +0x0021 => "Super Smash Bros.", +0x0022 => "Super Smash Bros.", +0x0023 => "Super Smash Bros.", +0x0024 => "Super Smash Bros.", +0x0025 => "Super Smash Bros.", +0x0026 => "Super Smash Bros.", +0x0027 => "Super Smash Bros.", +0x0028 => "Super Smash Bros.", +0x0029 => "Super Smash Bros.", +0x002a => "Super Smash Bros.", +0x002b => "Super Smash Bros.", +0x002c => "Super Smash Bros.", +0x002d => "Super Smash Bros.", +0x002e => "Super Smash Bros.", +0x002f => "Super Smash Bros.", +0x0030 => "Super Smash Bros.", +0x0031 => "Super Smash Bros.", +0x0032 => "Super Smash Bros.", +0x0033 => "Super Smash Bros.", +0x023d => "Super Smash Bros.", +0x0251 => "Super Smash Bros.", +0x0252 => "Super Smash Bros.", +0x0253 => "Super Smash Bros.", +0x0258 => "Super Smash Bros.", +0x0034 => "Super Mario", +0x0035 => "Super Mario", +0x0036 => "Super Mario", +0x0037 => "Super Mario", +0x0038 => "Super Mario", +0x0039 => "Super Mario", +0x0262 => "Super Mario", +0x0263 => "Super Mario", +0x0028 => "Super Mario", +0x003c => "Super Mario", +0x003d => "Super Mario", +0x003a => "Chibi Robo", +0x003e => "Splatoon", +0x003f => "Splatoon", +0x0040 => "Splatoon", +0x025d => "Splatoon", +0x025e => "Splatoon", +0x025f => "Splatoon", +0x0260 => "Splatoon", +0x0261 => "Splatoon", +0x0044 => "Animal Crossing Cards", +0x0045 => "Animal Crossing Cards", +0x0046 => "Animal Crossing Cards", +0x0047 => "Animal Crossing Cards", +0x0048 => "Animal Crossing Cards", +0x0049 => "Animal Crossing Cards", +0x004a => "Animal Crossing Cards", +0x004b => "Animal Crossing Cards", +0x004c => "Animal Crossing Cards", +0x004d => "Animal Crossing Cards", +0x004e => "Animal Crossing Cards", +0x004f => "Animal Crossing Cards", +0x0050 => "Animal Crossing Cards", +0x0051 => "Animal Crossing Cards", +0x0052 => "Animal Crossing Cards", +0x0053 => "Animal Crossing Cards", +0x0054 => "Animal Crossing Cards", +0x0055 => "Animal Crossing Cards", +0x0056 => "Animal Crossing Cards", +0x0057 => "Animal Crossing Cards", +0x0058 => "Animal Crossing Cards", +0x0059 => "Animal Crossing Cards", +0x005a => "Animal Crossing Cards", +0x005b => "Animal Crossing Cards", +0x005c => "Animal Crossing Cards", +0x005d => "Animal Crossing Cards", +0x005e => "Animal Crossing Cards", +0x005f => "Animal Crossing Cards", +0x0060 => "Animal Crossing Cards", +0x0061 => "Animal Crossing Cards", +0x0062 => "Animal Crossing Cards", +0x0063 => "Animal Crossing Cards", +0x0064 => "Animal Crossing Cards", +0x0065 => "Animal Crossing Cards", +0x0066 => "Animal Crossing Cards", +0x0067 => "Animal Crossing Cards", +0x0068 => "Animal Crossing Cards", +0x0069 => "Animal Crossing Cards", +0x006a => "Animal Crossing Cards", +0x006b => "Animal Crossing Cards", +0x006c => "Animal Crossing Cards", +0x006d => "Animal Crossing Cards", +0x006e => "Animal Crossing Cards", +0x006f => "Animal Crossing Cards", +0x0070 => "Animal Crossing Cards", +0x0071 => "Animal Crossing Cards", +0x0072 => "Animal Crossing Cards", +0x0073 => "Animal Crossing Cards", +0x0074 => "Animal Crossing Cards", +0x0075 => "Animal Crossing Cards", +0x0076 => "Animal Crossing Cards", +0x0077 => "Animal Crossing Cards", +0x0078 => "Animal Crossing Cards", +0x0079 => "Animal Crossing Cards", +0x007a => "Animal Crossing Cards", +0x007b => "Animal Crossing Cards", +0x007c => "Animal Crossing Cards", +0x007d => "Animal Crossing Cards", +0x007e => "Animal Crossing Cards", +0x007f => "Animal Crossing Cards", +0x0080 => "Animal Crossing Cards", +0x0081 => "Animal Crossing Cards", +0x0082 => "Animal Crossing Cards", +0x0083 => "Animal Crossing Cards", +0x0084 => "Animal Crossing Cards", +0x0085 => "Animal Crossing Cards", +0x0086 => "Animal Crossing Cards", +0x0087 => "Animal Crossing Cards", +0x0088 => "Animal Crossing Cards", +0x0089 => "Animal Crossing Cards", +0x008a => "Animal Crossing Cards", +0x008b => "Animal Crossing Cards", +0x008c => "Animal Crossing Cards", +0x008d => "Animal Crossing Cards", +0x008e => "Animal Crossing Cards", +0x008f => "Animal Crossing Cards", +0x0090 => "Animal Crossing Cards", +0x0091 => "Animal Crossing Cards", +0x0092 => "Animal Crossing Cards", +0x0093 => "Animal Crossing Cards", +0x0094 => "Animal Crossing Cards", +0x0095 => "Animal Crossing Cards", +0x0096 => "Animal Crossing Cards", +0x0097 => "Animal Crossing Cards", +0x0098 => "Animal Crossing Cards", +0x0099 => "Animal Crossing Cards", +0x009a => "Animal Crossing Cards", +0x009b => "Animal Crossing Cards", +0x009c => "Animal Crossing Cards", +0x009d => "Animal Crossing Cards", +0x009e => "Animal Crossing Cards", +0x009f => "Animal Crossing Cards", +0x00a0 => "Animal Crossing Cards", +0x00a1 => "Animal Crossing Cards", +0x00a2 => "Animal Crossing Cards", +0x00a3 => "Animal Crossing Cards", +0x00a4 => "Animal Crossing Cards", +0x00a5 => "Animal Crossing Cards", +0x00a6 => "Animal Crossing Cards", +0x00a7 => "Animal Crossing Cards", +0x00a8 => "Animal Crossing Cards", +0x00a9 => "Animal Crossing Cards", +0x00aa => "Animal Crossing Cards", +0x00ab => "Animal Crossing Cards", +0x00ac => "Animal Crossing Cards", +0x00ad => "Animal Crossing Cards", +0x00ae => "Animal Crossing Cards", +0x00af => "Animal Crossing Cards", +0x00b0 => "Animal Crossing Cards", +0x00b1 => "Animal Crossing Cards", +0x00b2 => "Animal Crossing Cards", +0x00b3 => "Animal Crossing Cards", +0x00b4 => "Animal Crossing Cards", +0x00b5 => "Animal Crossing Cards", +0x00b6 => "Animal Crossing Cards", +0x00b7 => "Animal Crossing Cards", +0x00b8 => "Animal Crossing Cards", +0x00b9 => "Animal Crossing Cards", +0x00ba => "Animal Crossing Cards", +0x00bb => "Animal Crossing Cards", +0x00bc => "Animal Crossing Cards", +0x00bd => "Animal Crossing Cards", +0x00be => "Animal Crossing Cards", +0x00bf => "Animal Crossing Cards", +0x00c0 => "Animal Crossing Cards", +0x00c1 => "Animal Crossing Cards", +0x00c2 => "Animal Crossing Cards", +0x00c3 => "Animal Crossing Cards", +0x00c4 => "Animal Crossing Cards", +0x00c5 => "Animal Crossing Cards", +0x00c6 => "Animal Crossing Cards", +0x00c7 => "Animal Crossing Cards", +0x00c8 => "Animal Crossing Cards", +0x00c9 => "Animal Crossing Cards", +0x00ca => "Animal Crossing Cards", +0x00cb => "Animal Crossing Cards", +0x00cc => "Animal Crossing Cards", +0x00cd => "Animal Crossing Cards", +0x00ce => "Animal Crossing Cards", +0x00cf => "Animal Crossing Cards", +0x00d0 => "Animal Crossing Cards", +0x00d1 => "Animal Crossing Cards", +0x00d2 => "Animal Crossing Cards", +0x00d3 => "Animal Crossing Cards", +0x00d4 => "Animal Crossing Cards", +0x00d5 => "Animal Crossing Cards", +0x00d6 => "Animal Crossing Cards", +0x00d7 => "Animal Crossing Cards", +0x00d8 => "Animal Crossing Cards", +0x00d9 => "Animal Crossing Cards", +0x00da => "Animal Crossing Cards", +0x00db => "Animal Crossing Cards", +0x00dc => "Animal Crossing Cards", +0x00dd => "Animal Crossing Cards", +0x00de => "Animal Crossing Cards", +0x00df => "Animal Crossing Cards", +0x00e0 => "Animal Crossing Cards", +0x00e1 => "Animal Crossing Cards", +0x00e2 => "Animal Crossing Cards", +0x00e3 => "Animal Crossing Cards", +0x00e4 => "Animal Crossing Cards", +0x00e5 => "Animal Crossing Cards", +0x00e6 => "Animal Crossing Cards", +0x00e7 => "Animal Crossing Cards", +0x00e8 => "Animal Crossing Cards", +0x00e9 => "Animal Crossing Cards", +0x00ea => "Animal Crossing Cards", +0x00eb => "Animal Crossing Cards", +0x00ec => "Animal Crossing Cards", +0x00ed => "Animal Crossing Cards", +0x00ee => "Animal Crossing Cards", +0x00ef => "Animal Crossing Cards", +0x00f0 => "Animal Crossing Cards", +0x00f1 => "Animal Crossing Cards", +0x00f2 => "Animal Crossing Cards", +0x00f3 => "Animal Crossing Cards", +0x00f4 => "Animal Crossing Cards", +0x00f5 => "Animal Crossing Cards", +0x00f6 => "Animal Crossing Cards", +0x00f7 => "Animal Crossing Cards", +0x00f8 => "Animal Crossing Cards", +0x00f9 => "Animal Crossing Cards", +0x00fa => "Animal Crossing Cards", +0x00fb => "Animal Crossing Cards", +0x00fc => "Animal Crossing Cards", +0x00fd => "Animal Crossing Cards", +0x00fe => "Animal Crossing Cards", +0x00ff => "Animal Crossing Cards", +0x0100 => "Animal Crossing Cards", +0x0101 => "Animal Crossing Cards", +0x0102 => "Animal Crossing Cards", +0x0103 => "Animal Crossing Cards", +0x0104 => "Animal Crossing Cards", +0x0105 => "Animal Crossing Cards", +0x0106 => "Animal Crossing Cards", +0x0107 => "Animal Crossing Cards", +0x0108 => "Animal Crossing Cards", +0x0109 => "Animal Crossing Cards", +0x010a => "Animal Crossing Cards", +0x010b => "Animal Crossing Cards", +0x01d4 => "Animal Crossing Cards", +0x01d5 => "Animal Crossing Cards", +0x01d6 => "Animal Crossing Cards", +0x01d7 => "Animal Crossing Cards", +0x01d8 => "Animal Crossing Cards", +0x0041 => "Yoshi's Woolly World", +0x0042 => "Yoshi's Woolly World", +0x0043 => "Yoshi's Woolly World", +0x023e => "Yoshi's Woolly World", +0x035d => "Yoshi's Woolly World", +0x0238 => "8 - Bit Mario", +0x0239 => "8 - Bit Mario", +0x023a => "Skylanders", +0x023b => "Skylanders", +0x023f => "Animal Crossing Figures", +0x0240 => "Animal Crossing Figures", +0x0241 => "Animal Crossing Figures", +0x0242 => "Animal Crossing Figures", +0x0243 => "Animal Crossing Figures", +0x0244 => "Animal Crossing Figures", +0x0245 => "Animal Crossing Figures", +0x0246 => "Animal Crossing Figures", +0x0247 => "Animal Crossing Figures", +0x0248 => "Animal Crossing Figures", +0x0249 => "Animal Crossing Figures", +0x024a => "Animal Crossing Figures", +0x024f => "The Legend of Zelda", +0x034b => "The Legend of Zelda", +0x034c => "The Legend of Zelda", +0x034d => "The Legend of Zelda", +0x034e => "The Legend of Zelda", +0x034f => "The Legend of Zelda", +0x0350 => "The Legend of Zelda", +0x0351 => "The Legend of Zelda", +0x0352 => "The Legend of Zelda", +0x0353 => "The Legend of Zelda", +0x0354 => "The Legend of Zelda", +0x0355 => "The Legend of Zelda", +0x0356 => "The Legend of Zelda", +0x0357 => "The Legend of Zelda", +0x0358 => "The Legend of Zelda", +0x0359 => "The Legend of Zelda", +0x035a => "The Legend of Zelda", +0x035b => "The Legend of Zelda", +0x035c => "The Legend of Zelda", +0x0250 => "Shovel Knight", +0x0254 => "Kirby", +0x0255 => "Kirby", +0x0256 => "Kirby", +0x0257 => "Kirby", +0x025c => "Pokken", +0x02e1 => "Monster Hunter Stories", +0x02e2 => "Monster Hunter Stories", +0x02e3 => "Monster Hunter Stories", +0x0319 => "Animal Crossing Sanrio", +0x031a => "Animal Crossing Sanrio", +0x031b => "Animal Crossing Sanrio", +0x031c => "Animal Crossing Sanrio", +0x031d => "Animal Crossing Sanrio", +0x031e => "Animal Crossing Sanrio", +0x035e => "BoxBoy!", +0x0360 => "Fire Emblem", +0x0361 => "Fire Emblem", +); + +my %amiiboseries = ( +0x00 => "Super Smash Bros.", +0x01 => "Super Mario", +0x02 => "Chibi-Robo", +0x03 => "Yoshi's Woolly World", +0x04 => "Splatoon", +0x05 => "Animal Crossing", +0x06 => "8 - Bit Mario", +0x07 => "Skylanders", +0x08 => "???", +0x09 => "The Legend Of Zelda", +0x0A => "Shovel Knight", +0x0B => "??? (Pikmin?)", +0x0C => "Kirby", +0x0D => "Pokken", +0x0E => "Mario Sports Superstars", +0x0F => "Monster Hunter", +0x10 => "BoxBoy!", +0x11 => "???", +0x12 => "Fire Emblem", +); + +use strict; +my @err; +sub err { push @err, @_ } + +die "usage: $0 \n" unless @ARGV == 1; +my $input = shift; + +open(IN, "<$input") || die "Can't read $input$!"; +my $file = join "", ; +close(IN); + +sub bytes { return substr($file, ((length($file) + $UIDLOC) + $_[0]), $_[1] || 1) } + +# check for crypto +#my $dec_check = substr($file, ((length($file) + $UIDLOC) + 3 ), 1) eq "\xE0"; +#my $enc_check = substr($file, ((length($file) + $UIDLOC) + 3 + 8), 1) eq "\xE0"; +my $dec_check = bytes(3 + 0, 1) eq "\xE0"; +my $enc_check = bytes(3 + 8, 1) eq "\xE0"; + +my $game = ( unpack("H3", bytes(84 + 0, 2))); +my $char = (substr(unpack("H2", bytes(84 + 1)), 1)); +my $cvar = ( unpack("H2", bytes(84 + 2))); +my $type = ( unpack("H2", bytes(84 + 3))); +my $amii = ( unpack("H4", bytes(84 + 4, 2))); +my $amis = ( unpack("H2", bytes(84 + 6))); +my $last = ( unpack("H2", bytes(84 + 7))); +err "Character / info: " . join(" ", map { unpack("H2", $_) } split(//, bytes(84, 8))); +err "Game : $game $game{hex($game)}"; +err "Character: $char --"; +err "Variation: $cvar --"; +err "Type : $type $type{hex($type)}"; +err "Amiibo : $amii $amiibo{hex($amii)}"; +err "Series : $amis $amiiboseries{hex($amis)}"; +err "Last : $last (should be 02)"; +err ""; + +# looks like encrypted file +my $run; +if ($enc_check && !$dec_check) +{ + if ($DECRYPT) + { + $run = "'$AMIITOOL' -d -k '$KEYFILE' -i '$input'"; + err "Looks like encrypted file, decrypting"; + err "Running: $run"; + $file = `$run`; + } + else + { + err "Looks like encrypted file but setting preventing us from decrypting"; + } +} +elsif ($enc_check && $dec_check) +{ + $run = "'$AMIITOOL' -d -k '$KEYFILE' -i '$input'"; + err "Looks like encrypted AND decrypted file, will try decrypting first"; + err "Running: $run"; + my $tmp = `$run`; + if (!$tmp) + { + err "Decryption failed, assuming file is already decrypted"; + } + else + { + err "Decryption succeeded, loading decrypted contents"; + $file = $tmp; + } +} +elsif ($dec_check && !$enc_check) +{ + err "Looks like decrypted file, great!"; +} +elsif (!$dec_check && !$enc_check) +{ + die "Does not look like proper file format! Exiting.\n"; +} + +my $lines = $BLOCKS; +my $uid = unpack("H14", + substr($file, length($file) + $UIDLOC, 3) . + substr($file, (length($file) + $UIDLOC) + 4, 4)); +my $pwd = unpack("H8", substr($file, length($file) - 8, 4)); + +# file does not contain our 48 byte header, let's add it +if ($ADDHDR && length($file) == -1 * $UIDLOC) +{ + err "Does not contain header, adding"; + while () + { + $lines--; + chomp; # there may not be a newline so chomp and add below + print "$_\n"; + } +} + +while (length($file)) +{ + my $out = substr($file, 0, $BLOCKSIZE, ""); # was 16 + $out = unpack("H*", $out); + print "$out\n"; + + # grab UID +=cut + if ($BLOCKS - $lines == 12) + { + $uid = substr($out, 0, 6); + } + elsif ($BLOCKS - $lines == 13) + { + $uid .= substr($out, 0, 8); + } +=cut + + $lines--; +} + +# still need to pad to 255 4-byte (8 hex char) blocks +if ($lines > 0) +{ + while ($lines--) + { + print "00000000\n"; + } +} + + +print STDERR "\n"; +print STDERR "$_\n" for @err; +print STDERR "UID: $uid\n"; +print STDERR "PWD: $pwd\n"; +print STDERR "\n"; +$uid = uc $uid; +#print STDERR "amiitool -d -k ../client/amiitool/key_retail.bin -i $input -o $input.decrypted\n"; +$input =~ s/\....$//; +print STDERR "hf mf eload u $input\n"; +print STDERR "hf 14a sim t 7 u $uid\n"; + + +__DATA__ +00040402 +01001103 +01000000 +00808000 +92580b4c +45a9c42f +a90145ce +5e5f9c43 +09a43d47 +d232a3d1 +68cbade6 +7f8185c6 diff --git a/tools/pm3_cs8.pl b/tools/pm3_cs8.pl new file mode 100755 index 000000000..2d10c07d0 --- /dev/null +++ b/tools/pm3_cs8.pl @@ -0,0 +1,43 @@ +#!/usr/bin/perl + +use strict; + +die "usage: $0 \n" unless @ARGV == 1; +# Convert proxmark3 trace to cs8 (complex int8/hackrf fmt) for inspectrum +# From miek + +if ($ARGV[0] =~ /wav$/) +{ + system("sox $ARGV[0] -t raw -e signed-integer -b 16 $ARGV[0].cs16"); +} +else +{ + #perl -ne 'chomp; print pack "c", $_' p.trace > p.c8 + my $f = "/tmp/pm3.trace." . rand(); + open(F, ">$f") || die $!; + open(IN, "<$ARGV[0]"); + while () + { + chomp; + print F pack "c", $_; + } + close(IN); + close(F); + +# upsample 100x and pad 2nd channel with zeroes + system("sox -t s8 -r 1 -c 1 -v 0.5 $f -t s8 -r 100 -c 2 $f.cs8 remix 1 0"); + + open(OUT, ">$ARGV[0].cs8") || die $!; + open(IN, "<$f.cs8") || die $!; + print OUT while ; + print OUT "\0" x (1024 * 1024); + close(IN); + close(OUT); + + unlink($f, "$f.cs8"); + +# pad file since inspectrum doesn't handle small files so well +#system("dd if=/dev/zero of=$f.pad bs=1m count=1 >>/dev/null"); + +#system("cat $f.cs8 $f.pad > $ARGV[1]"); +} \ No newline at end of file