mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-19 04:49:38 -07:00
Made script-based default key check a bit more intelligent, so it works not only on 4k cards. Also added option to save data to a dump-file
This commit is contained in:
parent
0318894e52
commit
05ed5c496a
2 changed files with 91 additions and 8 deletions
|
@ -380,6 +380,8 @@ int CmdHF14AMfDump(const char *Cmd)
|
||||||
}
|
}
|
||||||
if (isOK) {
|
if (isOK) {
|
||||||
fwrite ( data, 1, 16, fout );
|
fwrite ( data, 1, 16, fout );
|
||||||
|
PrintAndLog("Dumped card data into 'dumpkeys.bin'");
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PrintAndLog("Could not get access rights for block %d", i);
|
PrintAndLog("Could not get access rights for block %d", i);
|
||||||
|
@ -393,7 +395,6 @@ int CmdHF14AMfDump(const char *Cmd)
|
||||||
|
|
||||||
fclose(fin);
|
fclose(fin);
|
||||||
fclose(fout);
|
fclose(fout);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
the license.
|
the license.
|
||||||
|
|
||||||
Copyright (C) 2013 m h swende <martin at swende.se>
|
Copyright (C) 2013 m h swende <martin at swende.se>
|
||||||
]]
|
--]]
|
||||||
-- Loads the commands-library
|
-- Loads the commands-library
|
||||||
local cmds = require('commands')
|
local cmds = require('commands')
|
||||||
-- Load the default keys
|
-- Load the default keys
|
||||||
|
@ -15,12 +15,50 @@ local keys = require('mf_default_keys')
|
||||||
-- Ability to read what card is there
|
-- Ability to read what card is there
|
||||||
local reader = require('read14a')
|
local reader = require('read14a')
|
||||||
|
|
||||||
|
|
||||||
local desc =
|
local desc =
|
||||||
("This script implements check keys. It utilises a large list of default keys (currently %d keys).\
|
("This script implements check keys. It utilises a large list of default keys (currently %d keys).\
|
||||||
If you want to add more, just put them inside mf_default_keys.lua. "):format(#keys)
|
If you want to add more, just put them inside mf_default_keys.lua. "):format(#keys)
|
||||||
|
|
||||||
local TIMEOUT = 10000 -- 10 seconds
|
local TIMEOUT = 10000 -- 10 seconds
|
||||||
|
|
||||||
|
--[[This may be moved to a separate library at some point]]
|
||||||
|
local utils =
|
||||||
|
{
|
||||||
|
---
|
||||||
|
-- Asks the user for Yes or No
|
||||||
|
confirm = function(message, ...)
|
||||||
|
local answer
|
||||||
|
message = message .. " [y]/[n] ?"
|
||||||
|
repeat
|
||||||
|
io.write(message)
|
||||||
|
io.flush()
|
||||||
|
answer=io.read()
|
||||||
|
if answer == 'Y' or answer == "y" then
|
||||||
|
return true
|
||||||
|
elseif answer == 'N' or answer == 'n' then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
until false
|
||||||
|
end,
|
||||||
|
---
|
||||||
|
-- Asks the user for input
|
||||||
|
input = function (message , default)
|
||||||
|
local answer
|
||||||
|
if default ~= nil then
|
||||||
|
message = message .. " (default: ".. default.. " )"
|
||||||
|
end
|
||||||
|
message = message .." \n > "
|
||||||
|
io.write(message)
|
||||||
|
io.flush()
|
||||||
|
answer=io.read()
|
||||||
|
if answer == '' then answer = default end
|
||||||
|
|
||||||
|
return answer
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
local function checkCommand(command)
|
local function checkCommand(command)
|
||||||
|
|
||||||
--print("Sending this command : " .. tostring(command))
|
--print("Sending this command : " .. tostring(command))
|
||||||
|
@ -101,8 +139,33 @@ local function placeFirst(akey, list)
|
||||||
end
|
end
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
local function dumptofile(results)
|
||||||
|
local sector, blockNo, keyA, keyB,_
|
||||||
|
|
||||||
local function main()
|
if utils.confirm("Do you wish to save the keys to dumpfile?") then
|
||||||
|
local destination = utils.input("Select a filename to store to", "dumpkeys.bin")
|
||||||
|
local file = io.open(destination, "w")
|
||||||
|
if file == nil then
|
||||||
|
print("Could not write to file ", destination)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local key_a = ""
|
||||||
|
local key_b = ""
|
||||||
|
|
||||||
|
for sector,_ in pairs(results) do
|
||||||
|
blockNo, keyA, keyB = unpack(_)
|
||||||
|
key_a = key_a .. bin.pack("H",keyA);
|
||||||
|
key_b = key_b .. bin.pack("H",keyB);
|
||||||
|
end
|
||||||
|
file:write(key_a)
|
||||||
|
file:write(key_b)
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function main( args)
|
||||||
|
|
||||||
print(desc);
|
print(desc);
|
||||||
|
|
||||||
|
@ -117,12 +180,30 @@ local function main()
|
||||||
core.clearCommandBuffer()
|
core.clearCommandBuffer()
|
||||||
local blockNo
|
local blockNo
|
||||||
local keyType = 0 -- A=0, B=1
|
local keyType = 0 -- A=0, B=1
|
||||||
local result = {}
|
local numSectors = 16
|
||||||
for sector=1,40,1 do
|
|
||||||
|
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
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
for sector=1,numSectors,1 do
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
The mifare Classic 1k card has 16 sectors of 4 data blocks each. The
|
The mifare Classic 1k card has 16 sectors of 4 data blocks each.
|
||||||
first 32 sectors of a mifare Classic 4k card consists of 4 data blocks and the remaining
|
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.
|
8 sectors consist of 16 data blocks.
|
||||||
--]]
|
--]]
|
||||||
local blockNo = sector * 4 -1
|
local blockNo = sector * 4 -1
|
||||||
|
@ -148,7 +229,8 @@ local function main()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
displayresults(result)
|
displayresults(result)
|
||||||
|
dumptofile(result)
|
||||||
end
|
end
|
||||||
|
|
||||||
main()
|
main( args)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue