]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/scripts/tnp3dump.lua
ADD: `analyse nuid` - generates NUID 4byte from a UID 7byte. Mifare Classic Ev1...
[proxmark3-svn] / client / scripts / tnp3dump.lua
index cd547e8adf2225987a5a1a2abbbd36acf78d7b6a..613cf5819dcf3ca36fddca4c4bf62c2cfca15bd0 100644 (file)
@@ -31,16 +31,14 @@ Arguments:
        -o             : filename for the saved dumps
 ]]
 local RANDOM = '20436F707972696768742028432920323031302041637469766973696F6E2E20416C6C205269676874732052657365727665642E20'
-local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
+local TIMEOUT = 2500 -- Shouldn't take longer than 2 seconds
 local DEBUG = false -- the debug flag
 local numBlocks = 64
 local numSectors = 16
 --- 
 -- A debug printout-function
 function dbg(args)
-       if not DEBUG then
-               return
-       end
+       if not DEBUG then return end
        
     if type(args) == "table" then
                local i = 1
@@ -56,6 +54,7 @@ end
 -- This is only meant to be used when errors occur
 function oops(err)
        print("ERROR: ",err)
+       return nil,err
 end
 --- 
 -- Usage help
@@ -81,17 +80,17 @@ local function readdumpkeys(infile)
 end
 
 local function waitCmd()
-       local response = core.WaitForResponseTimeout(cmds.CMD_ACK,TIMEOUT)
+       local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
        if response then
-               local count,cmd,arg0 = bin.unpack('LL',response)
+               local count, cmd, arg0 = bin.unpack('LL',response)
                if(arg0==1) then
                        local count,arg1,arg2,data = bin.unpack('LLH511',response,count)
                        return data:sub(1,32)
                else
-                       return nil, "Couldn't read block..
+                       return nil, "Couldn't read block.. ["..arg0.."]"
                end
        end
-       return nil, "No response from device"
+       return nil, 'No response from device'
 end
 
 local function main(args)
@@ -150,6 +149,7 @@ local function main(args)
        if usePreCalc then
                local pre = require('precalc')
                akeys = pre.GetAll(result.uid)
+               dbg(akeys)
        else
                print('Loading dumpkeys.bin')
                local hex, err = utils.ReadDumpFile(input)
@@ -160,38 +160,45 @@ local function main(args)
        end
        
        -- Read block 0
-       cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 0,arg2 = 0,arg3 = 0, data = keyA}
+       dbg('Reading block 0')
+       cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 0, arg2 = 0, arg3 = 0, data = keyA}
        err = core.SendCommand(cmd:getBytes())
        if err then return oops(err) end
        local block0, err = waitCmd()
        if err then return oops(err) end
        
+       core.clearCommandBuffer()
+       
        -- Read block 1
-       cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 1,arg2 = 0,arg3 = 0, data = keyA}
+       dbg('Reading block 1')
+       cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 1, arg2 = 0, arg3 = 0, data = keyA}
        err = core.SendCommand(cmd:getBytes())
        if err then return oops(err) end
        local block1, err = waitCmd()
        if err then return oops(err) end
 
+       core.clearCommandBuffer()
+       
        local tmpHash = block0..block1..'%02x'..RANDOM
 
        local key
        local pos = 0
        local blockNo
        local blocks = {}
-
-       print('Reading card data')
-       core.clearCommandBuffer()
-               
+       
        -- main loop
        io.write('Reading blocks > ')
        for blockNo = 0, numBlocks-1, 1 do
 
+               io.flush()
+               
                if core.ukbhit() then
                        print("aborted by user")
                        break
                end
        
+               core.clearCommandBuffer()
+               
                pos = (math.floor( blockNo / 4 ) * 12)+1
                key = akeys:sub(pos, pos + 11 )
                cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = blockNo ,arg2 = 0,arg3 = 0, data = key}
@@ -205,18 +212,19 @@ local function main(args)
                
                        if blockNo < 8 then
                                -- Block 0-7 not encrypted
-                               blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata) 
+                               blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata)
                        else
                                -- blocks with zero not encrypted.
                                if string.find(blockdata, '^0+$') then
-                                       blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata) 
+                                       blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata)
                                else
                                        local baseStr = utils.ConvertHexToAscii(tmpHash:format(blockNo))
                                        local key = md5.sumhexa(baseStr)
                                        local aestest = core.aes128_decrypt(key, blockdata)
-                                       local hex = utils.ConvertAsciiToBytes(aestest)                                  
-                                       hex = utils.ConvertBytesToHex(hex)
-                                       blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,hex)                                 
+                                       local hex = utils.ConvertAsciiToHex(aestest)
+                                       
+                                       blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,hex)
+                                       io.write(blockNo..',')
                                end             
                        end
                else
@@ -234,9 +242,7 @@ local function main(args)
 
        for _,s in pairs(blocks) do
                local slice = s:sub(8,#s)
-               local str = utils.ConvertBytesToAscii(
-                                utils.ConvertHexToBytes(slice)
-                               )
+               local str = utils.ConvertHexToAscii(slice)
                emldata = emldata..slice..'\n'
                for c in (str):gmatch('.') do
                        bindata[#bindata+1] = c
@@ -273,5 +279,7 @@ local function main(args)
        print( ('                  UID : 0x%s'):format(uid) )
        print( ('               CARDID : 0x%s'):format(cardid ) )
        print( string.rep('--',20) )
+       
+       core.clearCommandBuffer()
 end
 main(args)
\ No newline at end of file
Impressum, Datenschutz