mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 05:13:46 -07:00
UPD: got the latest updates (@badboy) from @zhovner mfdread.
This commit is contained in:
parent
b7e8338d2b
commit
ce1cccd697
1 changed files with 74 additions and 10 deletions
|
@ -9,21 +9,28 @@
|
||||||
|
|
||||||
import codecs
|
import codecs
|
||||||
import sys
|
import sys
|
||||||
|
import copy
|
||||||
from struct import unpack
|
from struct import unpack
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from bitstring import BitArray
|
from bitstring import BitArray
|
||||||
|
|
||||||
|
class Options:
|
||||||
|
FORCE_1K = False
|
||||||
|
|
||||||
if len(sys.argv) == 1:
|
if len(sys.argv) == 1:
|
||||||
print('''
|
print('''
|
||||||
------------------
|
------------------
|
||||||
Usage: mfdread.py ./dump.mfd
|
Usage: mfdread.py ./dump.mfd
|
||||||
Mifare dumps reader.
|
Mifare dumps reader.
|
||||||
|
|
||||||
''')
|
''')
|
||||||
sys.exit();
|
sys.exit();
|
||||||
|
|
||||||
|
def d(bytes):
|
||||||
|
decoded = codecs.decode(bytes, "hex")
|
||||||
|
try:
|
||||||
|
return str(decoded, "utf-8").rstrip('\0')
|
||||||
|
except:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
class bashcolors:
|
class bashcolors:
|
||||||
|
@ -68,6 +75,37 @@ def accbits_for_blocknum(accbits_str, blocknum):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def accbits_to_permission_sector(accbits):
|
||||||
|
permissions = {
|
||||||
|
'000': "- A | A - | A A [read B]",
|
||||||
|
'010': "- - | A - | A - [read B]",
|
||||||
|
'100': "- B | A/B - | - B",
|
||||||
|
'110': "- - | A/B - | - -",
|
||||||
|
'001': "- A | A A | A A [transport]",
|
||||||
|
'011': "- B | A/B B | - B",
|
||||||
|
'101': "- - | A/B B | - -",
|
||||||
|
'111': "- - | A/B - | - -",
|
||||||
|
}
|
||||||
|
if isinstance(accbits, BitArray):
|
||||||
|
return permissions.get(accbits.bin, "unknown")
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def accbits_to_permission_data(accbits):
|
||||||
|
permissions = {
|
||||||
|
'000': "A/B | A/B | A/B | A/B [transport]",
|
||||||
|
'010': "A/B | - | - | - [r/w]",
|
||||||
|
'100': "A/B | B | - | - [r/w]",
|
||||||
|
'110': "A/B | B | B | A/B [value]",
|
||||||
|
'001': "A/B | - | - | A/B [value]",
|
||||||
|
'011': " B | B | - | - [r/w]",
|
||||||
|
'101': " B | - | - | - [r/w]",
|
||||||
|
'111': " - | - | - | - [r/w]",
|
||||||
|
}
|
||||||
|
if isinstance(accbits, BitArray):
|
||||||
|
return permissions.get(accbits.bin, "unknown")
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
def accbit_info(accbits):
|
def accbit_info(accbits):
|
||||||
|
@ -99,6 +137,9 @@ def print_info(data):
|
||||||
print("Wrong file size: %d bytes.\nOnly 1024 or 4096 allowed." % len(data))
|
print("Wrong file size: %d bytes.\nOnly 1024 or 4096 allowed." % len(data))
|
||||||
sys.exit();
|
sys.exit();
|
||||||
|
|
||||||
|
if Options.FORCE_1K:
|
||||||
|
cardsize = 16
|
||||||
|
|
||||||
# read all sectors
|
# read all sectors
|
||||||
for i in range(0, cardsize):
|
for i in range(0, cardsize):
|
||||||
start = i * 64
|
start = i * 64
|
||||||
|
@ -109,6 +150,7 @@ def print_info(data):
|
||||||
sector = str(sector, 'ascii')
|
sector = str(sector, 'ascii')
|
||||||
blocksmatrix.append([sector[x:x+32] for x in range(0, len(sector), 32)])
|
blocksmatrix.append([sector[x:x+32] for x in range(0, len(sector), 32)])
|
||||||
|
|
||||||
|
blocksmatrix_clear = copy.deepcopy(blocksmatrix)
|
||||||
# add colors for each keyA, access bits, KeyB
|
# add colors for each keyA, access bits, KeyB
|
||||||
for c in range(0, len(blocksmatrix)):
|
for c in range(0, len(blocksmatrix)):
|
||||||
# Fill in the access bits
|
# Fill in the access bits
|
||||||
|
@ -126,10 +168,12 @@ def print_info(data):
|
||||||
print("\tSAK: " + blocksmatrix[0][0][10:12])
|
print("\tSAK: " + blocksmatrix[0][0][10:12])
|
||||||
print("\tATQA: " + blocksmatrix[0][0][12:14])
|
print("\tATQA: " + blocksmatrix[0][0][12:14])
|
||||||
print(" %sKey A%s %sAccess Bits%s %sKey B%s" %(bashcolors.RED,bashcolors.ENDC,bashcolors.GREEN,bashcolors.ENDC,bashcolors.BLUE,bashcolors.ENDC))
|
print(" %sKey A%s %sAccess Bits%s %sKey B%s" %(bashcolors.RED,bashcolors.ENDC,bashcolors.GREEN,bashcolors.ENDC,bashcolors.BLUE,bashcolors.ENDC))
|
||||||
print("╔═════════╦═════╦══════════════════════════════════╦═══════════════╗")
|
print("╔═════════╦═════╦══════════════════════════════════╦════════╦═════════════════════════════════════╗")
|
||||||
print("║ Sector ║Block║ Data ║ Access Bits ║")
|
print("║ Sector ║Block║ Data ║ Access ║ A | Acc. | B ║")
|
||||||
|
print("║ ║ ║ ║ ║ r w | r w | r w [info] ║")
|
||||||
|
print("║ ║ ║ ║ ║ r | w | i | d/t/r ║")
|
||||||
for q in range(0, len(blocksmatrix)):
|
for q in range(0, len(blocksmatrix)):
|
||||||
print("╠═════════╬═════╬══════════════════════════════════╬═══════════════╣")
|
print("╠═════════╬═════╬══════════════════════════════════╬════════╬═════════════════════════════════════╣")
|
||||||
|
|
||||||
# z is the block in each sector
|
# z is the block in each sector
|
||||||
for z in range(0, len(blocksmatrix[q])):
|
for z in range(0, len(blocksmatrix[q])):
|
||||||
|
@ -140,21 +184,41 @@ def print_info(data):
|
||||||
else:
|
else:
|
||||||
accbits = bashcolors.WARNING + "ERR" + bashcolors.ENDC
|
accbits = bashcolors.WARNING + "ERR" + bashcolors.ENDC
|
||||||
|
|
||||||
|
if (q == 0 and z == 0):
|
||||||
|
permissions = "-"
|
||||||
|
elif (z == 3):
|
||||||
|
permissions = accbits_to_permission_sector(blockrights[q][z])
|
||||||
|
else:
|
||||||
|
permissions = accbits_to_permission_data(blockrights[q][z])
|
||||||
|
|
||||||
# Add Padding after the sector number
|
# Add Padding after the sector number
|
||||||
padLen = max(1, 5 - len(str(q)))
|
padLen = max(1, 5 - len(str(q)))
|
||||||
padding = " " * padLen
|
padding = " " * padLen
|
||||||
# Only print the sector number in the second third row
|
# Only print the sector number in the second third row
|
||||||
if (z == 2):
|
if (z == 2):
|
||||||
print("║ %d%s║ %d ║ %s ║ %s ║" %(q,padding,z,blocksmatrix[q][z], accbits))
|
print("║ %d%s║ %d ║ %s ║ %s ║ %-35s ║ %s" %(q,padding,z,blocksmatrix[q][z], accbits, permissions, d(blocksmatrix_clear[q][z])))
|
||||||
else:
|
else:
|
||||||
print("║ ║ %d ║ %s ║ %s ║" %(z,blocksmatrix[q][z], accbits))
|
print("║ ║ %d ║ %s ║ %s ║ %-35s ║ %s" %(z,blocksmatrix[q][z], accbits, permissions, d(blocksmatrix_clear[q][z])))
|
||||||
print("╚═════════╩═════╩══════════════════════════════════╩═══════════════╝")
|
print("╚═════════╩═════╩══════════════════════════════════╩════════╩═════════════════════════════════════╝")
|
||||||
|
|
||||||
|
|
||||||
def main(filename):
|
def main(args):
|
||||||
|
if args[0] == '-n':
|
||||||
|
args.pop(0)
|
||||||
|
bashcolors.BLUE = ""
|
||||||
|
bashcolors.RED = ""
|
||||||
|
bashcolors.GREEN = ""
|
||||||
|
bashcolors.WARNING = ""
|
||||||
|
bashcolors.ENDC = ""
|
||||||
|
|
||||||
|
if args[0] == '-1':
|
||||||
|
args.pop(0)
|
||||||
|
Options.FORCE_1K = True
|
||||||
|
|
||||||
|
filename = args[0]
|
||||||
with open(filename, "rb") as f:
|
with open(filename, "rb") as f:
|
||||||
data = f.read()
|
data = f.read()
|
||||||
print_info(data)
|
print_info(data)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main(sys.argv[1])
|
main(sys.argv[1:])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue