mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-12-26 18:12:34 +08:00
90 lines
2 KiB
Lua
90 lines
2 KiB
Lua
local luamiibo_open, err = package.loadlib("./libluamiibo.so", "luaopen_luamiibo")
|
|
|
|
if err then
|
|
print(err)
|
|
return
|
|
end
|
|
|
|
local luamiibo = luamiibo_open()
|
|
|
|
local FLAG_SETTINGS_INITIALIZED = 4
|
|
local FLAG_APPDATA_INITIALIZED = 3
|
|
|
|
local Amiibo = {}
|
|
Amiibo.__index = Amiibo
|
|
|
|
function Amiibo:new (o)
|
|
o = o or {}
|
|
setmetatable(o, self)
|
|
|
|
if o.tag ~= nil then
|
|
o:load_tag(o.tag)
|
|
end
|
|
return o
|
|
end
|
|
|
|
function Amiibo:load_tag (tag)
|
|
self.plain = luamiibo.unpack(tag)
|
|
|
|
-- UID
|
|
local raw_uid = string.sub(self.plain, 469, 469 + 8)
|
|
self.uid = string.sub(raw_uid, 1, 3) .. string.sub(raw_uid, 5, 8)
|
|
|
|
-- Settings
|
|
local count, flags = bin.unpack('C', string.sub(self.plain, 45, 45))
|
|
self.setting_flags = flags
|
|
self.settings_initialized = self:check_flag(FLAG_SETTINGS_INITIALIZED)
|
|
self.appdata_initialized = self:check_flag(FLAG_APPDATA_INITIALIZED)
|
|
|
|
local _, appdatacounter = bin.unpack('>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
|