diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ab2736e5..64e6eb500 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ 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] +- Fixed `hf_mf_uscuid_prog.lua` - bad divisions and code style fixes (@iceman1001) - Changed `hf iclass info` - now checks for cards silicon version (@antiklesys) - Changed `hf iclass legrec` - updated script implementation to ensure functionality (@antiklesys) - Added recovered iclass custom key to dictionary (@antiklesys) diff --git a/client/luascripts/hf_mf_uscuid_prog.lua b/client/luascripts/hf_mf_uscuid_prog.lua index b5dcbcd87..f98ae601e 100644 --- a/client/luascripts/hf_mf_uscuid_prog.lua +++ b/client/luascripts/hf_mf_uscuid_prog.lua @@ -2,33 +2,36 @@ local cmds = require('commands') local getopt = require('getopt') local lib14a = require('read14a') local utils = require('utils') -local ansicolors = require('ansicolors') +local cl = require('ansicolors') local bxor = bit32.bxor - copyright = '\nLicensed under GNU GPL v3.0. Team orangeBlue.' -author = 'Team '..ansicolors.yellow..'orange'..ansicolors.cyan..'Blue'..ansicolors.reset -- Disinformation -version = 'v1.0' -date = 'Created - Aug 2023' +author = 'Team '..cl.yellow..'orange'..cl.cyan..'Blue'..cl.reset -- Disinformation +version = 'v1.0.1' desc = [[ -Script to set UID on USCUID using any means possible. No warranties given! -See below for capabilities. +Script to set UID on USCUID using any means possible. This script is compatible with the ICs listed below: * GDMIC * UCUID * M1-7B * Other chips, showing up as "Gen 4 GDM" -This script does not claim full compatibility with the ICs listed below: + +This script does *NOT* claim full compatibility with the ICs listed below: * UFUID * PFUID* -WHY? Unfortunately, these are cut down versions. Checks show that they only acknowledge bytes 0-1, 7, 8, and 15 of the configuration. +Why? +Unfortunately, these are cut down versions. +Checks show that they only acknowledge bytes 0-1, 7, 8, and 15 of the configuration. * WARNING: The config commands are inversed. Nothing will work. -Ready to start? Set the first 2 bytes of your config to 7AFF and use -t 4. +Ready to start? + +Set the first 2 bytes of your config to 7AFF and use -t 4. + ]] example = [[ -- Set UID 7 bytes long via 20-23 wakeup @@ -51,8 +54,10 @@ arguments = [[ -B Read backdoor block -S Read sector -E Read backdoor sector + [ConfigStar] To enable an option, pass "1". To disable, pass "0". Unmarked data will not be edited. + -g Gen1 mode -c Gen1 command (1 for 20-23; 0 for 40-43) -b Block key B if readable by ACL @@ -63,6 +68,7 @@ arguments = [[ -n Static encrypted nonces -r Signature sector ]] + changelog = [[ Welcome, proxmark user! Here's a secret changelog of this script as its' life started. @@ -78,23 +84,26 @@ v1.0 - Memory access. Just like in the proxmark client. -- [[ Start introducing functions that get called later on ]] -- -- give up local function oops(err) - print(ansicolors.red.."[!]"..ansicolors.reset..' ERROR:', err) + print(cl.red.."[!]"..cl.reset..' ERROR:', err) core.clearCommandBuffer() return nil, err end + local function help() print(copyright) print(author) print(version) print(desc) - print(ansicolors.cyan..'Usage'..ansicolors.reset) + print(cl.cyan..'Usage'..cl.reset) print(usage) - print(ansicolors.cyan..'Arguments'..ansicolors.reset) + print(cl.cyan..'Arguments'..cl.reset) print(arguments) - print(ansicolors.cyan..'Example usage'..ansicolors.reset) + print(cl.cyan..'Example usage'..cl.reset) print(example) end + -- Sorry, didn't care to figure out custom bit amounts with the 14a lua lib. So here's this thing +-- 20/23 local function wupc2() return { [0] = 'hf 14a raw -akb 7 20', @@ -102,6 +111,7 @@ local function wupc2() } end +-- 40/43 local function wupc() return{ [0] = 'hf 14a raw -akb 7 40', @@ -112,6 +122,7 @@ end local function makenuid(uid) core.console('ana nuid -d '..uid) end + local function sendCmds(cmds) for i = 0, #cmds do if cmds[i] then @@ -120,9 +131,15 @@ local function sendCmds(cmds) end end end + local function wakeupmagic(writetype) - if writetype=="2" then sendCmds(wupc2()) elseif writetype=="4" then sendCmds(wupc()) end + if writetype == "2" then + sendCmds(wupc2()) + elseif writetype == "4" then + sendCmds(wupc()) + end end + local function calculate_block0(useruid) local uidbytes = utils.ConvertHexToBytes(useruid) local i = 1 @@ -130,31 +147,43 @@ local function calculate_block0(useruid) local length = #useruid / 2; -- bcc - for i = 3, length, 1 do bcc = bxor(bcc, uidbytes[i]) end + for i = 3, length, 1 do + bcc = bxor(bcc, uidbytes[i]) + end -- block0 local block0 = "" - for i = 1, length, 1 do block0 = block0..string.format('%02X', uidbytes[i]) end + for i = 1, length, 1 do + block0 = block0..string.format('%02X', uidbytes[i]) + end return block0..string.format('%02X', bcc) end + local function cltwo_block0(uid) payload = uid payload = payload .. "884400000000000000" return payload end + local function SectorHeader(sector) - print("["..ansicolors.yellow.."="..ansicolors.reset.."] # | sector "..ansicolors.green..string.format("%02d", sector)..ansicolors.reset.." / "..ansicolors.green..string.format("0x%02X", sector)..ansicolors.reset) - print("["..ansicolors.yellow.."="..ansicolors.reset.."] ----+------------------------------------------------") + if sector == nil then return end + + print("["..cl.yellow.."="..cl.reset.."] # | sector "..cl.green..string.format("%02d", sector)..cl.reset.." / "..cl.green..string.format("0x%02X", sector)..cl.reset) + print("["..cl.yellow.."="..cl.reset.."] ----+------------------------------------------------") end + local function BlockParser(data, block) - if block == "0" or block == 0 then -- for block 0 - print("["..ansicolors.yellow.."="..ansicolors.reset.."] "..string.format("%02d", block).." | "..ansicolors.red..string.sub(data,1,2).." "..string.sub(data,3,4).." "..string.sub(data,5,6).." "..string.sub(data,7,8).." "..string.sub(data,9,10).." "..string.sub(data,11,12).." "..string.sub(data,13,14).." "..string.sub(data,15,16).." "..string.sub(data,17,18).." "..string.sub(data,19,20).." "..string.sub(data,21,22).." "..string.sub(data,23,24).." "..string.sub(data,25,26).." "..string.sub(data,27,28).." "..string.sub(data,29,30).." "..string.sub(data,31,32)..ansicolors.reset) - elseif (block+1)%4 == 0 then -- for ST - print("["..ansicolors.yellow.."="..ansicolors.reset.."] "..string.format("%02d", block).." | "..ansicolors.yellow..string.sub(data,1,2).." "..string.sub(data,3,4).." "..string.sub(data,5,6).." "..string.sub(data,7,8).." "..string.sub(data,9,10).." "..string.sub(data,11,12).." "..ansicolors.magenta..string.sub(data,13,14).." "..string.sub(data,15,16).." "..string.sub(data,17,18).." "..ansicolors.reset..string.sub(data,19,20).." "..ansicolors.yellow..string.sub(data,21,22).." "..string.sub(data,23,24).." "..string.sub(data,25,26).." "..string.sub(data,27,28).." "..string.sub(data,29,30).." "..string.sub(data,31,32)..ansicolors.reset) - else - print("["..ansicolors.yellow.."="..ansicolors.reset.."] "..string.format("%02d", block).." | "..string.sub(data,1,2).." "..string.sub(data,3,4).." "..string.sub(data,5,6).." "..string.sub(data,7,8).." "..string.sub(data,9,10).." "..string.sub(data,11,12).." "..string.sub(data,13,14).." "..string.sub(data,15,16).." "..string.sub(data,17,18).." "..string.sub(data,19,20).." "..string.sub(data,21,22).." "..string.sub(data,23,24).." "..string.sub(data,25,26).." "..string.sub(data,27,28).." "..string.sub(data,29,30).." "..string.sub(data,31,32)) end + if data == nil or block == nil then return end + if block == "0" or block == 0 then -- for block 0 + print("["..cl.yellow.."="..cl.reset.."] "..string.format("%02d", block).." | "..cl.red..string.sub(data,1,2).." "..string.sub(data,3,4).." "..string.sub(data,5,6).." "..string.sub(data,7,8).." "..string.sub(data,9,10).." "..string.sub(data,11,12).." "..string.sub(data,13,14).." "..string.sub(data,15,16).." "..string.sub(data,17,18).." "..string.sub(data,19,20).." "..string.sub(data,21,22).." "..string.sub(data,23,24).." "..string.sub(data,25,26).." "..string.sub(data,27,28).." "..string.sub(data,29,30).." "..string.sub(data,31,32)..cl.reset) + elseif (block+1)%4 == 0 then -- for ST + print("["..cl.yellow.."="..cl.reset.."] "..string.format("%02d", block).." | "..cl.yellow..string.sub(data,1,2).." "..string.sub(data,3,4).." "..string.sub(data,5,6).." "..string.sub(data,7,8).." "..string.sub(data,9,10).." "..string.sub(data,11,12).." "..cl.magenta..string.sub(data,13,14).." "..string.sub(data,15,16).." "..string.sub(data,17,18).." "..cl.reset..string.sub(data,19,20).." "..cl.yellow..string.sub(data,21,22).." "..string.sub(data,23,24).." "..string.sub(data,25,26).." "..string.sub(data,27,28).." "..string.sub(data,29,30).." "..string.sub(data,31,32)..cl.reset) + else + print("["..cl.yellow.."="..cl.reset.."] "..string.format("%02d", block).." | "..string.sub(data,1,2).." "..string.sub(data,3,4).." "..string.sub(data,5,6).." "..string.sub(data,7,8).." "..string.sub(data,9,10).." "..string.sub(data,11,12).." "..string.sub(data,13,14).." "..string.sub(data,15,16).." "..string.sub(data,17,18).." "..string.sub(data,19,20).." "..string.sub(data,21,22).." "..string.sub(data,23,24).." "..string.sub(data,25,26).." "..string.sub(data,27,28).." "..string.sub(data,29,30).." "..string.sub(data,31,32)) + end end + local function sendRaw(rawdata, keep) flags = lib14a.ISO14A_COMMAND.ISO14A_RAW + lib14a.ISO14A_COMMAND.ISO14A_APPEND_CRC if keep == true then flags = flags + lib14a.ISO14A_COMMAND.ISO14A_NO_DISCONNECT end @@ -185,10 +214,10 @@ local function readconf() end local function writeconf(configbuffer) configbuffer=utils.ConvertBytesToHex(configbuffer) - print(ansicolors.yellow.."[|]".. ansicolors.reset .." The new config is: "..configbuffer) + print(cl.yellow.."[|]".. cl.reset .." The new config is: "..configbuffer) if sendRaw("E100", true) == "0A" then if sendRaw(configbuffer, true) == "0A" then - print(ansicolors.yellow.."[/]".. ansicolors.reset .." Config updated successfully") + print(cl.yellow.."[/]".. cl.reset .." Config updated successfully") else oops("Tag did not ACK config update!") lib14a.disconnect() @@ -244,17 +273,20 @@ function main(args) if o == 'w' then wipe = true end -- So one odd thing I noticed is the bool args like -h, -w don't work without a 2nd argument. So you now must do -h 1.. what? Why? -- ConfigStar - if o == 'g' then if a == "1" then gen1 = true elseif a == "0" then gen1 = false end end - if o == 'c' then if a == "1" then gen1com= true elseif a == "0" then gen1com= false end end - if o == 'b' then if a == "1" then keyblock= true elseif a == "0" then keyblock= false end end - if o == '2' then if a == "1" then cuid= true elseif a == "0" then cuid= false end end - if o == '7' then if a == "1" then cl2mode= true elseif a == "0" then cl2mode= false end end - if o == 'd' then if a == "1" then shadowmode = true elseif a == "0" then shadowmode = false end end - if o == 'a' then if a == "1" then magicauth= true elseif a == "0" then magicauth= false end end - if o == 'n' then if a == "1" then statenc= true elseif a == "0" then statenc= false end end - if o == 'r' then if a == "1" then sigsec = true elseif a == "0" then sigsec= false end end + if o == 'g' then if a == "1" then gen1 = true elseif a == "0" then gen1 = false end end + if o == 'c' then if a == "1" then gen1com= true elseif a == "0" then gen1com= false end end + if o == 'b' then if a == "1" then keyblock= true elseif a == "0" then keyblock= false end end + if o == '2' then if a == "1" then cuid= true elseif a == "0" then cuid= false end end + if o == '7' then if a == "1" then cl2mode= true elseif a == "0" then cl2mode= false end end + if o == 'd' then if a == "1" then shadowmode = true elseif a == "0" then shadowmode = false end end + if o == 'a' then if a == "1" then magicauth= true elseif a == "0" then magicauth= false end end + if o == 'n' then if a == "1" then statenc= true elseif a == "0" then statenc= false end end + if o == 'r' then if a == "1" then sigsec = true elseif a == "0" then sigsec= false end end + end + + if gen1 ~= nil or gen1com~= nil or keyblock~= nil or cuid~= nil or cl2mode~= nil or shadowmode~= nil or magicauth~= nil or statenc~= nil or sigsec~= nil then + configwrite = true end - if gen1 ~= nil or gen1com~= nil or keyblock~= nil or cuid~= nil or cl2mode~= nil or shadowmode~= nil or magicauth~= nil or statenc~= nil or sigsec~= nil then configwrite = true end if targetbblk then if tonumber(targetbblk)>63 then oops("Block is above 63") return 1 end end if targetblk then if tonumber(targetblk)>63 then oops("Block is above 63") return 1 end end @@ -267,33 +299,42 @@ function main(args) -- 3. Form data to write -- 4. Issue commands if wipe == true then - print(ansicolors.red.."[/]"..ansicolors.reset.." Wipe issued! Nullifying other arguments!") - print(ansicolors.red.."[-]"..ansicolors.reset.." DO NOT REMOVE YOUR TAG!") + + print(cl.red.."[/]"..cl.reset.." Wipe issued! Nullifying other arguments!") + print(cl.red.."[-]"..cl.reset.." DO NOT REMOVE YOUR TAG!") + uid = nil signature = nil configwrite = nil + wakeupmagic(writetype) if sendRaw("F000", true) ~= "0A" then oops("DANGER! Tag did not ACK wipe command. The field has NOT been reset.") print("[ ] If you think the wipe succeeded, immediately do this:") print("hf 14a raw -kc E100; hf 14a raw -c 7AFF0000000000000000000000000008") - return 1 end + return 1 + end + writeconf(utils.ConvertHexToBytes("7AFF0000000000000000005A00000008")) + sendRaw("F800", true) -- here you only wipe the backdoor blocks and they're not super critical so might as well not check. sendRaw("A000", true) -- By this point I just rely on the tag. sendRaw("DE7715B8040804000000000000000000", true) - for i =0,15 do + + for i =0, 15 do blk=string.format("%02x", 4*i+3):gsub("0x","") sendRaw("A0"..blk, true) - sendRaw("FFFFFFFFFFFFFF078069FFFFFFFFFFFF",true) - sendRaw("A8"..blk,true) - sendRaw("FFFFFFFFFFFFFF078069FFFFFFFFFFFF",true) + sendRaw("FFFFFFFFFFFFFF078069FFFFFFFFFFFF", true) + sendRaw("A8"..blk, true) + sendRaw("FFFFFFFFFFFFFF078069FFFFFFFFFFFF", true) end + sendRaw("A807", true) - sendRaw("75CCB59C9BED70F0F8694B791BEA7BCC",true) - print(ansicolors.yellow.."[-]"..ansicolors.reset.." Wipe completed successfully") + sendRaw("75CCB59C9BED70F0F8694B791BEA7BCC", true) + print(cl.yellow.."[-]"..cl.reset.." Wipe completed successfully") lib14a.disconnect() end + -- Separator if targetblk or targetbblk or targetsec or targetbsec then uid = nil @@ -301,18 +342,51 @@ function main(args) configwrite = nil wakeupmagic(writetype) print("") + if targetblk or targetsec then - if targetblk then data = sendRaw("30"..string.format("%02x", targetblk), false) end - if targetblk then SectorHeader(targetblk/4) else SectorHeader(targetsec) end - if targetblk then BlockParser(data, targetblk) else for i=0,3 do BlockParser(sendRaw("30"..string.format("%02x", targetsec*4+i), true), targetsec*4+i) end end + if targetblk then + data = sendRaw("30"..string.format("%02x", targetblk), false) + end + + if targetblk then + -- floor division... + SectorHeader(targetblk // 4) + else + SectorHeader(targetsec) + end + + if targetblk then + BlockParser(data, targetblk) + else + for i=0, 3 do + BlockParser(sendRaw("30"..string.format("%02x", targetsec * 4 + i), true), targetsec * 4 + i) + end + end + elseif targetbblk or targetbsec then - if targetbblk then data=sendRaw("38"..string.format("%02x", targetbblk), false) end - if targetbblk then SectorHeader(targetbblk/4) else SectorHeader(targetbsec) end - if targetbblk then BlockParser(data, targetbblk) else for i=0,3 do BlockParser(sendRaw("38"..string.format("%02x", targetbsec*4+i), true), targetbsec*4+i) end end + if targetbblk then + data = sendRaw("38"..string.format("%02x", targetbblk), false) + end + + if targetbblk then + -- floor division + SectorHeader(targetbblk // 4) + else + SectorHeader(targetbsec) + end + + if targetbblk then + BlockParser(data, targetbblk) + else + for i =0, 3 do + BlockParser(sendRaw("38"..string.format("%02x", targetbsec * 4 + i), true), targetbsec * 4 + i) + end + end -- Actually is there an sprintf_hex in lua? end - lib14a.disconnect() + lib14a.disconnect() end + -- Separator if uid then if writetype == "2" or writetype == "4" then @@ -325,72 +399,101 @@ function main(args) payload = payload .. "04000000000000000000" elseif string.len(uid) == 14 then -- Same logic, but with raw anticollision data because that's what the tag accepts. :P - payload = calculate_block0("88"..string.sub(uid,1,6)) + payload = calculate_block0("88"..string.sub(uid, 1, 6)) payload = payload .. "04" - payload = payload .. calculate_block0(string.sub(uid,7,14)) + payload = payload .. calculate_block0(string.sub(uid, 7, 14)) payload = payload .. "08" payload = payload .. "00000000" end end + core.clearCommandBuffer() -- Now, let's write! 1. We wake up the tag in magic mode. -- 2. We will deal with the "easier" 7 byte UID stuff - if uid then if string.len(uid) == 14 then + wakeupmagic(writetype) - if f3perso == true then print("[?] WARNING: F3 perso write is set, but 7 byte UID is passed. Ignoring -3 argument") end + if f3perso == true then + print("[?] WARNING: F3 perso write is set, but 7 byte UID is passed. Ignoring -3 argument") + end + local configdata = readconf() + if configdata[10] ~= 0x5A and configdata[10] ~= 0xC3 and configdata[10] ~= 0xA5 then -- Enable CL2 mode if necessary print("[?] WARNING: Tag is not in 7 byte UID mode. Automatically updating to F0 unfused") - print(ansicolors.yellow.."[-]".. ansicolors.reset .." This is because the configuration byte responsible for CL2 was not found to be equal to 0x5A, 0xC3 or 0xA5, but rather: ".. string.format("%02x", configdata[10])) - print(ansicolors.yellow.."[\\]".. ansicolors.reset .." The old config is: ".. utils.ConvertBytesToHex(configdata)) - configdata[10]=0x5A + print(cl.yellow.."[-]".. cl.reset .." This is because the configuration byte responsible for CL2 was not found to be equal to 0x5A, 0xC3 or 0xA5, but rather: ".. string.format("%02x", configdata[10])) + print(cl.yellow.."[\\]".. cl.reset .." The old config is: ".. utils.ConvertBytesToHex(configdata)) + configdata[10] = 0x5A writeconf(configdata) end + if sendRaw("A800", true) ~= "0A" then oops("Tag did not ACK `A800` command!") lib14a.disconnect() - return 1 end + return 1 + end + print("[?] WARNING: nUID should be updated with this value:") - print(makenuid(uid)) - print(ansicolors.yellow.."[/]".. ansicolors.reset .." Use `--f3d` to update nUID for Perso F3 only.") - if sendRaw(payload, true) ~= "0A" then - oops("Tag did not ACK data to write!") - lib14a.disconnect() - return 1 end - print(ansicolors.yellow.."[-]".. ansicolors.reset .." Updating real block 0") - if sendRaw("A000", true) ~= "0A" then - oops("Tag did not ACK `A000` command!") - lib14a.disconnect() - return 1 end - if sendRaw(cltwo_block0(uid), false) ~="0A" then oops("Tag did not ACK data to write!") end - -- Now, let's work with 4 byte UIDs. - elseif string.len(uid)==8 then - wakeupmagic(writetype) - local configdata = readconf() - if configdata[10] == 0x69 or f3perso == true then -- If we have Perso: F3, then write backdoor blk 1 - if f3perso == true then print ("[?] WARNING: F3 flag enabled. Updating UID used for F3 perso") end - if sendRaw("A801", true) ~= "0A" then + print(makenuid(uid)) + print(cl.yellow.."[/]".. cl.reset .." Use `--f3d` to update nUID for Perso F3 only.") + + if sendRaw(payload, true) ~= "0A" then + oops("Tag did not ACK data to write!") + lib14a.disconnect() + return 1 + end + + print(cl.yellow.."[-]".. cl.reset .." Updating real block 0") + if sendRaw("A000", true) ~= "0A" then + oops("Tag did not ACK `A000` command!") + lib14a.disconnect() + return 1 + end + + if sendRaw(cltwo_block0(uid), false) ~="0A" then + oops("Tag did not ACK data to write!") + end + + -- Now, let's work with 4 byte UIDs. + elseif string.len(uid) == 8 then + + wakeupmagic(writetype) + local configdata = readconf() + + if configdata[10] == 0x69 or f3perso == true then -- If we have Perso: F3, then write backdoor blk 1 + + if f3perso == true then + print ("[?] WARNING: F3 flag enabled. Updating UID used for F3 perso") + end + + if sendRaw("A801", true) ~= "0A" then oops("Tag did not ACK `A801` command!") lib14a.disconnect() - return 1 end + return 1 + end + else -- Otherwise write real block 0. if configdata[10] == 0x5a or configdata[10] == 0xc3 or configdata[10] == 0xa5 then -- Disable CL2 if necessary print("[?] WARNING: Tag is not in 4 byte UID mode. Automatically disabling") - print(ansicolors.yellow.."[-]".. ansicolors.reset .." This is because the configuration byte responsible for CL2 was found to be equal to: ".. string.format("%02x", configdata[10])) - print(ansicolors.yellow.."[\\]".. ansicolors.reset .." The old config is: ".. utils.ConvertBytesToHex(configdata)) - configdata[10]=0x00 + print(cl.yellow.."[-]".. cl.reset .." This is because the configuration byte responsible for CL2 was found to be equal to: ".. string.format("%02x", configdata[10])) + print(cl.yellow.."[\\]".. cl.reset .." The old config is: ".. utils.ConvertBytesToHex(configdata)) + configdata[10] = 0x00 writeconf(configdata) end + if sendRaw("A000", true) ~= "0A" then oops("Tag did not ACK `A000` command!") lib14a.disconnect() - return 1 end + return 1 + end end - if sendRaw(payload, false) ~= "0A" then oops("Tag did not ACK data to write!") end + + if sendRaw(payload, false) ~= "0A" then + oops("Tag did not ACK data to write!") end end end + -- Separator if signature then wakeupmagic(writetype) @@ -400,35 +503,49 @@ function main(args) configdata[14] = 0x5A writeconf(configdata) end + if sendRaw("A805", true) ~= "0A" then oops("Tag did not ACK `A805` command!") lib14a.disconnect() - return 1 end + return 1 + end + if sendRaw(string.sub(signature,1,32), true) ~= "0A" then oops("Tag did not ACK data 1 to write!") lib14a.disconnect() - return 1 end + return 1 + end + if sendRaw("A806", true) ~= "0A" then oops("Tag did not ACK `A806` command!") lib14a.disconnect() - return 1 end + return 1 + end + if sendRaw(string.sub(signature,33,64), false) ~= "0A" then - oops("Tag did not ACK data 2 to write!") + oops("Tag did not ACK data 2 to write!") lib14a.disconnect() - return 1 end + return 1 + end end + if configwrite then - print(ansicolors.yellow.."[|]"..ansicolors.reset.." Welcome to ConfigStar!") + + print(cl.yellow.."[|]"..cl.reset.." Welcome to ConfigStar!") wakeupmagic(writetype) - config=readconf() + config = readconf() + if (gen1 == false and magicauth == false) or ((config[1]==0x85 and config[2] == 0x00) and magicauth==false) or ((config[12]==0x00) and gen1 == false) then - oops("What you are about to do is potentially dangerous. \n If you really want to continue (potentially leaving your tag in an unusable state), enter this line as given, without quotation marks:\n \"Yes, do as I say!\"") - local ans=io.read() - if ans ~="Yes, do as I say!" then + oops("What you are about to do is potentially dangerous. \nIf you really want to continue (potentially leaving your tag in an unusable state), enter this line as given, without quotation marks:\n \"yes\"") + local ans = io.read() + if ans ~="yes" then lib14a.disconnect() return 1 - else print(ansicolors.red.."[/]"..ansicolors.reset.." Brace yourself.") end + else + print(cl.red.."[/]"..cl.reset.." Brace yourself.") end + + end -- Baby oh baby -- Prepare for disappointment if gen1 == true then @@ -438,49 +555,60 @@ function main(args) config[1] = 0x85 config[2] = 0x00 end + if gen1com == true then config[3] = 0x85 elseif gen1com == false then config[3] = 0x00 end + if keyblock == true then config[7] = 0x5A elseif keyblock == false then config[7] = 0x00 end + if cuid == true then config[8] = 0x5A elseif cuid == false then config[8] = 0x00 end + if cl2mode == true then config[10] = 0x5A elseif cl2mode == false then config[10] = 0x00 end + if shadowmode == true then config[11] = 0x5A elseif shadowmode == false then config[11] = 0x00 end + if magicauth == true then config[12] = 0x5A elseif magicauth == false then config[12] = 0x00 end + if statenc == true then config[13] = 0x5A elseif statenc == false then config[13] = 0x00 end + if sigsec == true then config[14] = 0x5A elseif sigsec == false then config[14] = 0x00 end + writeconf(config) - print(ansicolors.yellow.."[\\]"..ansicolors.reset.." Completed!") + print(cl.yellow.."[\\]"..cl.reset.." Completed!") lib14a.disconnect() end + end + main(args)