New cmd added.

This commit is contained in:
dxl
2022-12-29 17:36:43 +08:00
parent 5817d3f778
commit 84b0ad910a
3 changed files with 118 additions and 3 deletions
+3 -1
View File
@@ -80,6 +80,8 @@ class ChameleonCLI:
'decrypt': new_uint(chameleon_cli_unit.HFMFDetectionDecrypt, "Download log and decrypt keys"),
'help': "Mifare Classic detection log"
},
'sim': new_uint(chameleon_cli_unit.HFMFSim, "Simulation a mifare classic card"),
'eload': new_uint(chameleon_cli_unit.HFMFELoad, "Load data to emulator memory"),
'help': "Mifare Classic mini/1/2/4, attack/read/write"
},
'help': "high frequency tag/reader",
@@ -88,7 +90,7 @@ class ChameleonCLI:
'em': {
'read': new_uint(chameleon_cli_unit.LFEMRead, "Scan em410x tag and print id"),
'write': new_uint(chameleon_cli_unit.LFEMWriteT55xx, "Write em410x id to t55xx"),
'sim': new_uint(chameleon_cli_unit.LFEMSim, "Simulation a em410x id card."),
'sim': new_uint(chameleon_cli_unit.LFEMSim, "Simulation a em410x id card"),
'help': "EM410x read/write/emulator",
},
'help': "low frequency tag/reader",
+78 -1
View File
@@ -604,6 +604,82 @@ class HFMFDetectionDecrypt(DeviceRequiredUnit):
return
class HFMFELoad(DeviceRequiredUnit):
def args_parser(self) -> ArgumentParserNoExit or None:
parser = ArgumentParserNoExit()
parser.add_argument('-f', '--file', type=str, required=True, help="file path")
parser.add_argument('-t', '--type', type=str, required=True, help="content type", choices=['bin', 'hex'])
return parser
# hf mf eload -f test.bin -t bin
# hf mf eload -f test.eml -t hex
def on_exec(self, args: argparse.Namespace):
file = args.file
content_type = args.type
buffer = bytearray()
with open(file, mode='rb') as fd:
if content_type == 'bin':
buffer.extend(fd.read())
if content_type == 'hex':
buffer.extend(bytearray.fromhex(fd.read().decode()))
if len(buffer) % 16 != 0:
raise Exception("Data block not align for 16 bytes")
if len(buffer) / 16 > 256:
raise Exception("Data block memory overflow")
index = 0
block = 0
while index < len(buffer):
# split a block from buffer
block_data = buffer[index: index + 16]
index += 16
# load to device
self.cmd_positive.set_mf1_block_data(block, block_data)
print('.', end='')
block += 1
print("\n - Load success")
class HFMFSim(DeviceRequiredUnit):
def args_parser(self) -> ArgumentParserNoExit or None:
parser = ArgumentParserNoExit()
parser.add_argument('--sak', type=str, required=True, help="Select AcKnowledge(hex)", metavar="hex")
parser.add_argument('--atqa', type=str, required=True, help="Answer To Request(hex)", metavar="hex")
parser.add_argument('--uid', type=str, required=True, help="Unique ID(hex)", metavar="hex")
return parser
# hf mf sim --sak 08 --atqa 0400 --uid DEADBEEF
def on_exec(self, args: argparse.Namespace):
sak_str: str = args.sak.strip()
atqa_str: str = args.atqa.strip()
uid_str: str = args.uid.strip()
if re.match('[a-fA-F0-9]{2}', sak_str) is not None:
sak = bytearray.fromhex(sak_str)
else:
raise Exception("SAK must be hex(2byte)")
if re.match('[a-fA-F0-9]{4}', atqa_str) is not None:
atqa = bytearray.fromhex(atqa_str)
else:
raise Exception("ATQA must be hex(4byte)")
if re.match('[a-fA-F0-9]+', uid_str) is not None:
uid_len = len(uid_str)
if uid_len != 8 and uid_len != 14 and uid_len != 20:
raise Exception("UID length error")
uid = bytearray.fromhex(uid_str)
else:
raise Exception("UID must be hex")
self.cmd_positive.set_mf1_anti_collision_res(sak, atqa, uid)
print(" - Set anti-collision resources success")
class LFEMRead(ReaderRequiredUint):
def args_parser(self) -> ArgumentParserNoExit or None:
@@ -716,7 +792,8 @@ class HWSlotTagType(TagTypeRequiredUint, SlotIndexRequireUint):
# hw slot tagtype -t 2
def on_exec(self, args: argparse.Namespace):
tag_type = args.type
self.cmd_positive.set_slot_tag_type(tag_type)
slot_index = args.slot
self.cmd_positive.set_slot_tag_type(slot_index, tag_type)
print(f' - Set slot tag type success.')
+37 -1
View File
@@ -24,6 +24,9 @@ DATA_CMD_MF1_WRITE_ONE_BLOCK = 2009
DATA_CMD_SCAN_EM410X_TAG = 3000
DATA_CMD_WRITE_EM410X_TO_T5577 = 3001
DATA_CMD_LOAD_MF1_BLOCK_DATA = 4000
DATA_CMD_SET_MF1_ANTI_COLLISION_RES = 4001
DATA_CMD_SET_EM410X_EMU_ID = 5000
DATA_CMD_SET_MF1_DETECTION_ENABLE = 5003
DATA_CMD_GET_MF1_DETECTION_COUNT = 5004
@@ -325,6 +328,32 @@ class BaseChameleonCMD:
data.extend(index.to_bytes(4, "big", signed=False))
return self.device.send_cmd_sync(DATA_CMD_GET_MF1_DETECTION_RESULT, 0x00, data)
def set_mf1_block_data(self, block_start: int, block_data: bytearray):
"""
设置MF1的模拟卡的块数据
:param block_start: 开始设置块数据的位置,包含此位置
:param block_data: 要设置的块数据的字节缓冲区,可包含多个块数据,自动从 block_start 递增
:return:
"""
data = bytearray()
data.append(block_start & 0xFF)
data.extend(block_data)
return self.device.send_cmd_sync(DATA_CMD_LOAD_MF1_BLOCK_DATA, 0x00, data)
def set_mf1_anti_collision_res(self, sak: bytearray, atqa: bytearray, uid: bytearray):
"""
设置MF1的模拟卡的防冲撞资源信息
:param sak: sak字节
:param atqa: atqa数组
:param uid: 卡号数组
:return:
"""
data = bytearray()
data.extend(sak)
data.extend(atqa)
data.extend(uid)
return self.device.send_cmd_sync(DATA_CMD_SET_MF1_ANTI_COLLISION_RES, 0X00, data)
class NegativeResponseError(Exception):
"""
@@ -439,6 +468,13 @@ class PositiveChameleonCMD(BaseChameleonCMD):
self.check_status(ret.status, chameleon_status.Device.STATUS_DEVICE_SUCCESS)
return ret
def set_mf1_block_data(self, block_start: int, data: bytearray):
ret = super(PositiveChameleonCMD, self).set_mf1_block_data(block_start, data)
self.check_status(ret.status, chameleon_status.Device.STATUS_DEVICE_SUCCESS)
return ret
def set_mf1_anti_collision_res(self, sak: int, atqa: bytearray, uid: bytearray):
ret = super(PositiveChameleonCMD, self).set_mf1_anti_collision_res(sak, atqa, uid)
self.check_status(ret.status, chameleon_status.Device.STATUS_DEVICE_SUCCESS)
return ret