]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/scripts/hard.lua
ADD: `analyse nuid` - generates NUID 4byte from a UID 7byte. Mifare Classic Ev1...
[proxmark3-svn] / client / scripts / hard.lua
index 7671c9d6f306b2744fb9e93783a826c265190403..1d8177722704b6ad426f77550424a5c6d3001c91 100644 (file)
@@ -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
Impressum, Datenschutz