X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/e108a48ac415ab2b1fc212c63ad1a2e68efd5e4e..9833360b251571f82749c352f49d712c9c8322ad:/client/scripts/hard.lua?ds=inline diff --git a/client/scripts/hard.lua b/client/scripts/hard.lua index 7671c9d6..1d817772 100644 --- a/client/scripts/hard.lua +++ b/client/scripts/hard.lua @@ -54,6 +54,38 @@ function ExitMsg(msg) print(msg) print() end +-- A little helper to place an item first in the list +local function placeFirst(akey, list) + akey = akey:lower() + if list[1] == akey then + -- Already at pole position + return list + end + local result = {akey} + --print(("Putting '%s' first"):format(akey)) + for i,v in ipairs(list) do + if v ~= akey then + result[#result+1] = v + end + end + return result +end +-- A function to display the results +-- TODO: iceman 2016, still screws up output when a key is not found. +local function displayresults(results) + local sector, blockNo, keyA, keyB, succA, succB, _ + + print("|---|----------------|---|----------------|---|") + print("|sec|key A |res|key B |res|") + print("|---|----------------|---|----------------|---|") + + for sector,_ in pairs(results) do + succA, succB, keyA, keyB = unpack(_) + print(("|%03d| %s | %s | %s | %s |"):format(sector, keyA, succA, keyB, succB)) + end + print("|---|----------------|---|----------------|---|") + +end --- -- a simple selftest function, local function selftest() @@ -68,13 +100,12 @@ function main(args) local keytype = 0 --A 01==B local key = 'fc00018778f7' local trgkey = '' + local numSectors = 16 - local data -- Read the parameters - for o, a in getopt.getopt(args, 'hk:t') do + for o, a in getopt.getopt(args, 'hk:') do if o == "h" then return help() end if o == "k" then key = a end - if o == "t" then return selftest() end end -- Turn off Debug @@ -90,20 +121,55 @@ function main(args) -- Show tag info print((' Found tag %s'):format(result.name)) - local keys = {} - -- loop - for i=4, 12 , 4 do - for trgkeytype=0,1 do - local trgblockno = ("%02d"):format(i) - local err, found_key = core.hardnested(blockno, keytype, key, trgblockno, trgkeytype, trgkey, 0,0,0,0) - - table.insert( keys , { ["success"] = err, ["sector"] = i, ["type"] = trgkeytype, ["key"] = utils.ConvertAsciiToHex(found_key) } ) - end + if 0x18 == result.sak then --NXP MIFARE Classic 4k | Plus 4k + -- IFARE Classic 4K offers 4096 bytes split into forty sectors, + -- of which 32 are same size as in the 1K with eight more that are quadruple size sectors. + numSectors = 40 + elseif 0x08 == result.sak then -- NXP MIFARE CLASSIC 1k | Plus 2k + -- 1K offers 1024 bytes of data storage, split into 16 sector + numSectors = 16 + elseif 0x09 == result.sak then -- NXP MIFARE Mini 0.3k + -- MIFARE Classic mini offers 320 bytes split into five sectors. + numSectors = 5 + elseif 0x10 == result.sak then-- "NXP MIFARE Plus 2k" + numSectors = 32 + else + print("I don't know how many sectors there are on this type of card, defaulting to 16") end - --print - for k,v in pairs(keys) do - for a,b in pairs(v) do print(a,b) end + + result = {} + for sector=1,numSectors do + + --[[ + The mifare Classic 1k card has 16 sectors of 4 data blocks each. + The first 32 sectors of a mifare Classic 4k card consists of 4 data blocks and the remaining + 8 sectors consist of 16 data blocks. + --]] + local trgblockno = sector * 4 - 1 + if sector > 32 then + trgblockno = 32 * 4 + (sector-32) * 16 -1 + end + + trgblockno = ("%02d"):format(trgblockno) + + local succA = 1 + local succB = 1 + local errA, keyA = core.hardnested(blockno, keytype, key, trgblockno, '0', trgkey, 0,0,0,0) + keyA = keyA or "" + if errA == nil or errA > 0 then succA = 0 end + + local errB, keyB = core.hardnested(blockno, keytype, key, trgblockno, '1', trgkey, 0,0,0,0) + keyB = keyB or "" + if errB == nil or errB > 0 then succB = 0 end + result[sector] = { succA, succB, utils.ConvertAsciiToHex(keyA), utils.ConvertAsciiToHex(keyB) } + + -- Check if user aborted + if core.ukbhit() then + print("Aborted by user") + break + end end + displayresults(result) end main(args) \ No newline at end of file