lazy linear for rizin objdump
parent
d656d97818
commit
fbb437a809
|
@ -42,7 +42,7 @@ class _CapstoneBase:
|
|||
if disassembly:
|
||||
self.disassembly = disassembly
|
||||
else:
|
||||
logging.debug("disassembly_empty")
|
||||
logging.warning("disassembly_empty")
|
||||
self.disassembly = list()
|
||||
|
||||
def __repr__(self) -> str:
|
||||
|
|
|
@ -5,16 +5,35 @@ import json
|
|||
|
||||
|
||||
class _RizinBase:
|
||||
def __init__(self, path: Path):
|
||||
def __init__(self, path: Path, offset: int = 0):
|
||||
rz_pipe = rzpipe.open(str(path.absolute()))
|
||||
|
||||
for cmd in self.arch_cmds:
|
||||
rz_pipe.cmd(cmd)
|
||||
|
||||
rz_pipe.cmd("aa")
|
||||
result = rz_pipe.cmd("pdj")
|
||||
disassembly = list()
|
||||
|
||||
while offset < path.stat().st_size:
|
||||
result = rz_pipe.cmd(f"s {offset}")
|
||||
result = rz_pipe.cmd("pdj")
|
||||
result = json.loads(result)
|
||||
|
||||
for each in result:
|
||||
new_offset = int(each.get("offset"))
|
||||
|
||||
if offset >= new_offset:
|
||||
break
|
||||
|
||||
offset = new_offset
|
||||
disassembly += result
|
||||
|
||||
rz_pipe.quit()
|
||||
self.disassembly = json.loads(result)
|
||||
|
||||
if disassembly:
|
||||
self.disassembly = disassembly
|
||||
else:
|
||||
logging.warning("disassembly_empty")
|
||||
self.disassembly = list()
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return self.objdump
|
||||
|
@ -38,7 +57,8 @@ class _RizinBase:
|
|||
for each in self.disassembly:
|
||||
offset = each.get("offset")
|
||||
opcode = each.get("opcode")
|
||||
if opcode:
|
||||
|
||||
if not opcode in ["invalid", "nop", None]:
|
||||
_objdump += f"{offset:#02x}:\t{opcode}\n"
|
||||
|
||||
self._objdump = _objdump
|
||||
|
@ -55,7 +75,7 @@ class _RizinBase:
|
|||
offset = each.get("offset")
|
||||
opcode = each.get("opcode")
|
||||
|
||||
if opcode:
|
||||
if not opcode in ["invalid", "nop", None]:
|
||||
mnemonic = opcode.split(" ")[0]
|
||||
opcode = opcode.split(" ")[1:]
|
||||
_disasm.append([offset, mnemonic, opcode])
|
||||
|
@ -263,7 +283,7 @@ class hppa(_RizinBase):
|
|||
|
||||
|
||||
class i4004(_RizinBase):
|
||||
arch_cmds = ["e asm.arch=i4004", "e asm.bits=4"]
|
||||
arch_cmds = ["e asm.arch=i4004"]
|
||||
|
||||
|
||||
class i8080(_RizinBase):
|
||||
|
|
|
@ -233,7 +233,7 @@ def subdisassem_script():
|
|||
)
|
||||
continue
|
||||
|
||||
disasembler = arch(path=args.bin_path)
|
||||
disasembler = arch(path=args.bin_path, offset=offset)
|
||||
row = Disassembly()
|
||||
row.arch = disasembler.__class__.__name__
|
||||
row.checksum = checksum
|
||||
|
|
Loading…
Reference in New Issue