From aabf3ecafad4ebcb37ce640ab6dad126b6e26cfb Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 5 Nov 2019 10:51:27 +0100 Subject: [PATCH] removed problematic code. Attribution to @jamchamb for his amii lua scripts --- client/libluamiibo.so | Bin 23648 -> 0 bytes client/lualibs/amiibolib.lua | 90 -------------- client/lualibs/emulator.lua | 84 ------------- client/luascripts/amiibo.lua | 235 ----------------------------------- 4 files changed, 409 deletions(-) delete mode 100644 client/libluamiibo.so delete mode 100644 client/lualibs/amiibolib.lua delete mode 100644 client/lualibs/emulator.lua delete mode 100644 client/luascripts/amiibo.lua diff --git a/client/libluamiibo.so b/client/libluamiibo.so deleted file mode 100644 index 2cd716aa08e79dba46e064f833fcfa2facce5fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23648 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 dVC5$$e`B*>!WV1|!%S', string.sub(self.plain, 49, 50)) - self.appdata_counter = appdatacounter - - self.figure_id = string.sub(self.plain, 477, 477 + 8) - - -- UTF-16 nickname string - self.nickname = string.sub(self.plain, 57, 76) -end - - -function Amiibo:export_tag () - return luamiibo.pack(self.plain) -end - - -function Amiibo:check_flag (power) - local flag = math.pow(2, power) - return flag == bit32.band(self.setting_flags, flag) -end - - -function Amiibo:get_pwd () - local xorkey = "\xaa\x55\xaa\x55" - - local result = '' - for i = 1, 4 do - result = result .. - bin.pack('C', - bit32.bxor(self.uid:byte(i+1), - self.uid:byte(i+3), - xorkey:byte(i))) - end - - return result -end - --- Hack to make UTF-16 nicknames into regular char string --- Only works for ASCII nicknames -function Amiibo:display_nickname() - local nickname_tmp = self.nickname - - local nickname = '' - for i = 1, nickname_tmp:len() do - if i % 2 == 0 then - nickname = nickname .. nickname_tmp:sub(i, i) - end - end - - return nickname -end - -return Amiibo diff --git a/client/lualibs/emulator.lua b/client/lualibs/emulator.lua deleted file mode 100644 index d43f5da92..000000000 --- a/client/lualibs/emulator.lua +++ /dev/null @@ -1,84 +0,0 @@ -local cmds = require('commands') -local utils = require('utils') -local reader = require('read14a') - -local Emulator = { - _VERSION = 'emulator.lua 0.1.0', - _DESCRIPTION = 'emulator memory interface', - BLOCK_SZ = 512, - BLOCK_COUNT = 512 / 16 -} - -function Emulator:set_mem (data, clear_first) - if clear_first then - -- Clear out the emulator memory first - local memclrCmd = Command:newMIX{cmd = cmds.CMD_HF_MIFARE_EML_MEMCLR} - - local _, err = memclrCmd:sendMIX() - if err then - print('Failed to clear emulator memory:', err) - return false - else - print('Cleared emulator memory') - end - end - - -- Can fit 32 16 byte blocks per command (512 total bytes max) - for i = 0, (data:len() / self.BLOCK_SZ) do - local cur_out_block = data:sub((i*self.BLOCK_SZ) + 1, (i*self.BLOCK_SZ) + self.BLOCK_SZ) - print(string.format('Transmission #%u: %u bytes', i, cur_out_block:len())) - - -- arg1: start block number - -- arg2: block count - local memsetCmd = Command:newMIX{cmd = cmds.CMD_HF_MIFARE_EML_MEMSET, - data = utils.hexlify(cur_out_block), - arg1 = i * self.BLOCK_COUNT, - arg2 = self.BLOCK_COUNT} - - -- Send command and wait for response - local _, err = memsetCmd:sendMIX() - if err then - print('Failed setting memory', err) - return false - end - end - - print('Emulator memory set') - return true -end - --- Read bytes from emulator memory -function Emulator:get_mem (size) - local MAX_BLOCKS = 4 - local result = '' - - -- We can request a maximum of 4 blocks (16 bytes each) per command, - -- according to mifarecmd.c - for i = 0, (size / (MAX_BLOCKS * 16)) do - -- arg1: start block number - -- arg2: block count (max 4) - local getmemCmd = Command:newMIX{cmd = cmds.CMD_HF_MIFARE_EML_MEMGET, - arg1 = i * MAX_BLOCKS, - arg2 = MAX_BLOCKS, - arg3 = 0} - - local response, err = getmemCmd:sendMIX() - if err then - print('Failed getting memory:', err) - return false - end - - -- USB data begins after four 64-bit values - local data_begin = ((64/8) * 4) + 1 - response = string.sub(response, data_begin) - - -- Truncate to the received 16 byte blocks - response = string.sub(response, 1, 16 * MAX_BLOCKS) - - result = result .. response - end - - return string.sub(result, 1, size) -end - -return Emulator diff --git a/client/luascripts/amiibo.lua b/client/luascripts/amiibo.lua deleted file mode 100644 index 10ede4008..000000000 --- a/client/luascripts/amiibo.lua +++ /dev/null @@ -1,235 +0,0 @@ -local utils = require('utils') -local cmds = require('commands') -local Amiibo = require('amiibolib') -local reader = require('read14a') -local bin = require('bin') -local emu = require('emulator') -local luamiibo_open, err = package.loadlib("./libluamiibo.so", "luaopen_luamiibo") - -if err then - print(err) - return -end - -local luamiibo = luamiibo_open() - -local function nfc_read_amiibo () - - local command = Command:newMIX{ - cmd = cmds.CMD_HF_MIFAREU_READCARD, - arg1 = 0, - arg2 = 135 - } - - local result, err = command:sendMIX() - if result then - -- Do Mifare Ultralight read - local count, cmd, arg0, data_len, offset = bin.unpack('LLLL', result) - - if arg0 == 0 then - return nil, "Card select failed" - end - - -- Do GetFromBigBuf - local data = core.GetFromBigBuf(offset, data_len) - - return data, err - else - return nil, "Couldn't read Amiibo" - end -end - - -local function emulate_amiibo (amiibo_data) - -- Make UID args - -- Use known ID/sig for known ECDSA signature - REPLACE ME! - local uid_bytes = '\x00\x04\xFF\xFF\xFF\xFF\xFF\xFF' - local ecc_sig = '' - .. '\x00\x00\x00\x00\x00\x00\x00\x00' - .. '\x00\x00\x00\x00\x00\x00\x00\x00' - .. '\x00\x00\x00\x00\x00\x00\x00\x00' - .. '\x00\x00\x00\x00\x00\x00\x00\x00' - - if amiibo_data:len() == 520 then - -- Add common ending bytes - print('Added missing ending bytes') - amiibo_data = amiibo_data - .. '\x01\x00\x0F\xBD\x00\x00\x00\x04' - .. '\x5F\x00\x00\x00\x00\x00\x00\x00' - .. '\x00\x00\x00\x00' - end - - if amiibo_data:len() == 572 then - -- Get ECC signature and use original serial - uid_bytes = '\x00' .. amiibo_data:sub(1,3) .. amiibo_data:sub(5,8) - ecc_sig = amiibo_data:sub(541, 572) - print('Amiibo image contains ECC signature', hexlify(ecc_sig)) - --amiibo_data = amiibo_data:sub(1,540) - elseif amiibo_data:len() == 540 then - if uid_bytes ~= '\x00\x04\xFF\xFF\xFF\xFF\xFF\xFF' then - print('Using known ECC sig pair') - else - print('No known ECC/sig pair; using null signature') - uid_bytes = '\x00' .. amiibo_data:sub(1,3) .. amiibo_data:sub(5,8) - end - amiibo_data = amiibo_data .. ecc_sig - else - print('Unusual Amiibo image size', amiibo_data:len()) - end - - -- Send amiibo data to emulator memory. If the Amiibo was just scanned, this - -- is already set! - if not emu:set_mem(amiibo_data, false) then - print('Failed to set emulator card memory') - return - end - - -- Get UID parts - local count, uid_first, uid_second = bin.unpack('>I>I', uid_bytes) - print(string.format('Simulating with UID: 0x%04x 0x%04x', uid_first, uid_second)) - - -- Begin simulating NTAG215 - local simCmd = Command:newMIX{ - cmd = cmds.CMD_HF_ISO14443A_SIMULATE, - arg1 = 7, - arg2 = uid_first, - arg3 = uid_second - } - local _, err = simCmd:sendMIX() - if err then - print('Failed to start simulator', err) - return - else - print('Starting simulator') - end -end - - -local function test_packing() - -- Load Pikachu dump instead - local dumpfile = io.open("pika.bin", "rb") - local pikachu = dumpfile:read("*all") - - local unpacked_pika = luamiibo.unpack(pikachu) - local packed_data = luamiibo.pack(unpacked_pika) - - print('Original', utils.hexlify(pikachu)) - print('Unpacked', utils.hexlify(unpacked_pika)) - print('Packed', utils.hexlify(packed_data)) -end - - -local function load_sim(argv) - local tag = assert(io.open(argv[2], "rb")) - local data = tag:read("*all") - tag:close() - - emulate_amiibo(data) - return -end - - -local function dump_sim(argv) - local keypath = argv[2] - if keypath == nil then - keypath = 'amiitool_keys.bin' - end - luamiibo.load_keys(keypath) - - -- Read all 135 pages - dump = emu:get_mem(540) - - if dump == false then - print('Failed to read emulator memory') - else - local amiiboData = Amiibo:new{tag = dump} - print('Dumped ' .. dump:len() .. ' bytes') - print(hexlify(dump)) - print('Nickname: ' .. utils.hexlify(amiiboData:display_nickname())) - - -- Write dump to file - local filename = argv[2] - if filename ~= nil then - local outfile = assert(io.open(filename, "wb")) - outfile:write(dump) - outfile:close() - print('Wrote to ' .. filename) - else - print('No output file specified') - end - end -end - - -local function main(args) - argv = {} - for arg in string.gmatch(args, "%S+") do - table.insert(argv, arg) - end - - -- Load and emulate Amiibo from image - if argv[1] == 'help' then - print('read - scan amiibo') - print('load - load and simulate amiibo') - print('dump [output_file] - dump card memory') - print('help - print this help') - return - elseif argv[1] == 'load' then - load_sim(argv) - return - elseif argv[1] == 'dump' then - dump_sim(argv) - return - elseif argv[1] ~= 'read' and argv[1] ~= nil then - print('Unknown command') - end - - local keypath = argv[2] - if keypath == nil then - keypath = 'amiitool_keys.bin' - end - - if luamiibo.load_keys(keypath) then - print('Loaded retail keys from ' .. keypath) - else - print('Failed to load retail keys from ' .. keypath) - return - end - - local tag, err = nfc_read_amiibo() - if err then - print(err) - return - elseif tag:len() ~= 540 then - print('Incorrect tag data size ' .. tag:len()) - return - end - - parsed_tag = reader.parse14443a(tag) - print('Tag type:', parsed_tag.name) - print('Tag UID:', parsed_tag.uid) - print('Tag len:', tag:len()) - --print('Tag data:', utils.hexlify(tag)) - - local amiiboData = Amiibo:new{tag = tag} - - --print('Unpacked:', utils.hexlify(amiiboData.plain)) - --print('Repacked:', utils.hexlify(amiiboData:export_tag())) - - print('Figure ID:', utils.hexlify(amiiboData.figure_id)) - print('Settings init:', amiiboData.settings_initialized) - - if amiiboData.settings_initialized then - print('Nickname:', amiiboData:display_nickname()) - print('Appdata writes:', amiiboData.appdata_counter) - end - - print('UID:', utils.hexlify(amiiboData.uid)) - print('Write key:', utils.hexlify(amiiboData:get_pwd())) - - --print('Attempting emulation...') - --emulate_amiibo(amiiboData:export_tag()) - return -end - -main(args)