555 lines
12 KiB
Python
555 lines
12 KiB
Python
from pathlib import Path
|
|
import logging
|
|
import rzpipe
|
|
import json
|
|
|
|
|
|
class _RizinBase:
|
|
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)
|
|
|
|
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()
|
|
|
|
if disassembly:
|
|
self.disassembly = disassembly
|
|
else:
|
|
logging.warning("disassembly_empty")
|
|
self.disassembly = list()
|
|
|
|
def __repr__(self) -> str:
|
|
return self.objdump
|
|
|
|
def __len__(self) -> int:
|
|
return len(self.disasm)
|
|
|
|
def __lt__(self, other):
|
|
return len(self) < len(other)
|
|
|
|
def __contains__(self, name: str):
|
|
return hasattr(self, name)
|
|
|
|
@property
|
|
def objdump(self) -> str:
|
|
if "_objdump" in self:
|
|
return self._objdump
|
|
|
|
_objdump = str()
|
|
|
|
for each in self.disassembly:
|
|
offset = each.get("offset")
|
|
opcode = each.get("opcode")
|
|
|
|
if not opcode in ["invalid", "nop", None]:
|
|
_objdump += f"{offset:#02x}:\t{opcode}\n"
|
|
|
|
self._objdump = _objdump
|
|
return self._objdump
|
|
|
|
@property
|
|
def disasm(self) -> list:
|
|
if "_disasm" in self:
|
|
return self._disasm
|
|
|
|
_disasm = list()
|
|
|
|
for each in self.disassembly:
|
|
offset = each.get("offset")
|
|
opcode = each.get("opcode")
|
|
|
|
if not opcode in ["invalid", "nop", None]:
|
|
mnemonic = opcode.split(" ")[0]
|
|
opcode = opcode.split(" ")[1:]
|
|
_disasm.append([offset, mnemonic, opcode])
|
|
|
|
self._disasm = _disasm
|
|
return self._disasm
|
|
|
|
@property
|
|
def rets(self) -> list:
|
|
if "_rets" in self:
|
|
return self._rets
|
|
|
|
_rets = list()
|
|
|
|
for each in self.disasm:
|
|
_, mnemonic, _ = each
|
|
|
|
if mnemonic and "ret" in mnemonic:
|
|
_rets.append(mnemonic)
|
|
|
|
self._rets = _rets
|
|
return self._rets
|
|
|
|
@property
|
|
def ret_rates(self) -> list:
|
|
if "_ret_rates" in self:
|
|
return self._ret_rates
|
|
|
|
rates = dict()
|
|
|
|
for mnemonic in set(self.rets):
|
|
rates[mnemonic] = self.rets.count(mnemonic)
|
|
|
|
_ret_rates = sorted(
|
|
((value, key) for (key, value) in rates.items()), reverse=True
|
|
)
|
|
|
|
self._ret_rates = _ret_rates
|
|
return self._ret_rates
|
|
|
|
@property
|
|
def mnemonic_rates(self) -> list:
|
|
if "_mnemonic_rates" in self:
|
|
return self._mnemonic_rates
|
|
|
|
mnemonics = list()
|
|
|
|
for each in self.disasm:
|
|
_, mnemonic, _ = each
|
|
|
|
if mnemonic:
|
|
mnemonics.append(mnemonic)
|
|
|
|
rates = dict()
|
|
|
|
for mnemonic in set(mnemonics):
|
|
rates[mnemonic] = mnemonics.count(mnemonic)
|
|
|
|
_mnemonic_rates = sorted(
|
|
((value, key) for (key, value) in rates.items()), reverse=True
|
|
)
|
|
|
|
self._mnemonic_rates = _mnemonic_rates
|
|
return self._mnemonic_rates
|
|
|
|
|
|
class _6502_8(_RizinBase):
|
|
arch_cmds = ["e asm.arch=6502", "e asm.bits=8"]
|
|
|
|
|
|
class _6502_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=6502", "e asm.bits=16"]
|
|
|
|
|
|
class _8051(_RizinBase):
|
|
arch_cmds = ["e asm.arch=8051", "e asm.bits=8"]
|
|
|
|
|
|
class amd29k(_RizinBase):
|
|
arch_cmds = ["e asm.arch=amd29k", "e asm.bits=32"]
|
|
|
|
|
|
class arc_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arc", "e asm.bits=16"]
|
|
|
|
|
|
class arc_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arc", "e asm.bits=32"]
|
|
|
|
|
|
class arm_as_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.as", "e asm.bits=16"]
|
|
|
|
|
|
class arm_as_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.as", "e asm.bits=32"]
|
|
|
|
|
|
class arm_as_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.as", "e asm.bits=64"]
|
|
|
|
|
|
class arm_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm", "e asm.bits=16"]
|
|
|
|
|
|
class arm_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm", "e asm.bits=32"]
|
|
|
|
|
|
class arm_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm", "e asm.bits=64"]
|
|
|
|
|
|
class arm_gnu_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.gnu", "e asm.bits=16"]
|
|
|
|
|
|
class arm_gnu_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.gnu", "e asm.bits=32"]
|
|
|
|
|
|
class arm_gnu_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.gnu", "e asm.bits=64"]
|
|
|
|
|
|
class arm_wine_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.winedbg", "e asm.bits=16"]
|
|
|
|
|
|
class arm_wine_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=arm.winedbg", "e asm.bits=32"]
|
|
|
|
|
|
class avr_8(_RizinBase):
|
|
arch_cmds = ["e asm.arch=avr", "e asm.bits=8"]
|
|
|
|
|
|
class avr_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=avr", "e asm.bits=16"]
|
|
|
|
|
|
class bf_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=bf", "e asm.bits=16"]
|
|
|
|
|
|
class bf_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=bf", "e asm.bits=32"]
|
|
|
|
|
|
class bf_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=bf", "e asm.bits=64"]
|
|
|
|
|
|
class bf_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=bf", "e asm.bits=64"]
|
|
|
|
|
|
class chip8(_RizinBase):
|
|
arch_cmds = ["e asm.arch=chip8", "e asm.bits=32"]
|
|
|
|
|
|
class cr_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=cr16", "e asm.bits=16"]
|
|
|
|
|
|
class cris(_RizinBase):
|
|
arch_cmds = ["e asm.arch=cris", "e asm.bits=32"]
|
|
|
|
|
|
class dalvik_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=dalvik", "e asm.bits=32"]
|
|
|
|
|
|
class dalvik_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=dalvik", "e asm.bits=64"]
|
|
|
|
|
|
class dcpu16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=dcpu16", "e asm.bits=16"]
|
|
|
|
|
|
class ebc_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ebc", "e asm.bits=32"]
|
|
|
|
|
|
class ebc_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ebc", "e asm.bits=64"]
|
|
|
|
|
|
class gb(_RizinBase):
|
|
arch_cmds = ["e asm.arch=gb", "e asm.bits=16"]
|
|
|
|
|
|
class h8300(_RizinBase):
|
|
arch_cmds = ["e asm.arch=h8300", "e asm.bits=16"]
|
|
|
|
|
|
class hexagon(_RizinBase):
|
|
arch_cmds = ["e asm.arch=hexagon", "e asm.bits=32"]
|
|
|
|
|
|
class hppa(_RizinBase):
|
|
arch_cmds = ["e asm.arch=hppa", "e asm.bits=32"]
|
|
|
|
|
|
class i4004(_RizinBase):
|
|
arch_cmds = ["e asm.arch=i4004"]
|
|
|
|
|
|
class i8080(_RizinBase):
|
|
arch_cmds = ["e asm.arch=i8080", "e asm.bits=8"]
|
|
|
|
|
|
class java(_RizinBase):
|
|
arch_cmds = ["e asm.arch=java", "e asm.bits=32"]
|
|
|
|
|
|
class lanai(_RizinBase):
|
|
arch_cmds = ["e asm.arch=lanai", "e asm.bits=32"]
|
|
|
|
|
|
class lh5801(_RizinBase):
|
|
arch_cmds = ["e asm.arch=lh5801", "e asm.bits=8"]
|
|
|
|
|
|
class lm32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=lm32", "e asm.bits=32"]
|
|
|
|
|
|
class luac(_RizinBase):
|
|
arch_cmds = ["e asm.arch=luac", "e asm.bits=8"]
|
|
|
|
|
|
class m68k(_RizinBase):
|
|
arch_cmds = ["e asm.arch=m68k", "e asm.bits=32"]
|
|
|
|
|
|
class m680x_8(_RizinBase):
|
|
arch_cmds = ["e asm.arch=m680x", "e asm.bits=8"]
|
|
|
|
|
|
class m680x_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=m680x", "e asm.bits=32"]
|
|
|
|
|
|
# class malbolge(_RizinBase):
|
|
# arch_cmds = ["e asm.arch=malbolge", "e asm.bits=32"]
|
|
|
|
|
|
class mcore(_RizinBase):
|
|
arch_cmds = ["e asm.arch=mcore", "e asm.bits=32"]
|
|
|
|
|
|
class mcs96(_RizinBase):
|
|
arch_cmds = ["e asm.arch=mcs96", "e asm.bits=16"]
|
|
|
|
|
|
class mips_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=mips", "e asm.bits=16"]
|
|
|
|
|
|
class mips_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=mips", "e asm.bits=32"]
|
|
|
|
|
|
class mips_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=mips", "e asm.bits=64"]
|
|
|
|
|
|
class mips_gnu_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=mips.gnu", "e asm.bits=32"]
|
|
|
|
|
|
class mips_gnu_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=mips.gnu", "e asm.bits=64"]
|
|
|
|
|
|
class msp430(_RizinBase):
|
|
arch_cmds = ["e asm.arch=msp430", "e asm.bits=16"]
|
|
|
|
|
|
class nios2(_RizinBase):
|
|
arch_cmds = ["e asm.arch=nios2", "e asm.bits=32"]
|
|
|
|
|
|
class or1k(_RizinBase):
|
|
arch_cmds = ["e asm.arch=or1k", "e asm.bits=32"]
|
|
|
|
|
|
class pic(_RizinBase):
|
|
arch_cmds = ["e asm.arch=pic", "e asm.bits=8"]
|
|
|
|
|
|
class ppc_as_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ppc.as", "e asm.bits=32"]
|
|
|
|
|
|
class ppc_as_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ppc.as", "e asm.bits=64"]
|
|
|
|
|
|
class ppc_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ppc", "e asm.bits=32"]
|
|
|
|
|
|
class ppc_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ppc", "e asm.bits=64"]
|
|
|
|
|
|
class ppc_gnu_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ppc.gnu", "e asm.bits=32"]
|
|
|
|
|
|
class ppc_gnu_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=ppc.gnu", "e asm.bits=64"]
|
|
|
|
|
|
class propeller(_RizinBase):
|
|
arch_cmds = ["e asm.arch=propeller", "e asm.bits=32"]
|
|
|
|
|
|
class pyc_8(_RizinBase):
|
|
arch_cmds = ["e asm.arch=pyc", "e asm.bits=8"]
|
|
|
|
|
|
class pyc_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=pyc", "e asm.bits=16"]
|
|
|
|
|
|
class riscv_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=riscv", "e asm.bits=32"]
|
|
|
|
|
|
class riscv_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=riscv", "e asm.bits=64"]
|
|
|
|
|
|
class rsp(_RizinBase):
|
|
arch_cmds = ["e asm.arch=rsp", "e asm.bits=32"]
|
|
|
|
|
|
class sh(_RizinBase):
|
|
arch_cmds = ["e asm.arch=sh", "e asm.bits=32"]
|
|
|
|
|
|
class snes_8(_RizinBase):
|
|
arch_cmds = ["e asm.arch=snes", "e asm.bits=8"]
|
|
|
|
|
|
class snes_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=snes", "e asm.bits=16"]
|
|
|
|
|
|
class sparc_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=sparc", "e asm.bits=32"]
|
|
|
|
|
|
class sparc_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=sparc", "e asm.bits=64"]
|
|
|
|
|
|
class sparc_gnu_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=sparc.gnu", "e asm.bits=32"]
|
|
|
|
|
|
class sparc_gnu_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=sparc.gnu", "e asm.bits=64"]
|
|
|
|
|
|
class spc700(_RizinBase):
|
|
arch_cmds = ["e asm.arch=spc700", "e asm.bits=16"]
|
|
|
|
|
|
class sysz_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=sysz", "e asm.bits=32"]
|
|
|
|
|
|
class sysz_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=sysz", "e asm.bits=64"]
|
|
|
|
|
|
class tms320(_RizinBase):
|
|
arch_cmds = ["e asm.arch=tms320", "e asm.bits=32"]
|
|
|
|
|
|
class tms320c64x(_RizinBase):
|
|
arch_cmds = ["e asm.arch=tms320c64x", "e asm.bits=32"]
|
|
|
|
|
|
class tricore(_RizinBase):
|
|
arch_cmds = ["e asm.arch=tricore", "e asm.bits=32"]
|
|
|
|
|
|
class v810_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=v810", "e asm.bits=32"]
|
|
|
|
|
|
class v850(_RizinBase):
|
|
arch_cmds = ["e asm.arch=v850", "e asm.bits=32"]
|
|
|
|
|
|
class vax_8(_RizinBase):
|
|
arch_cmds = ["e asm.arch=vax", "e asm.bits=8"]
|
|
|
|
|
|
class vax_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=vax", "e asm.bits=32"]
|
|
|
|
|
|
class wasm_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=wasm", "e asm.bits=32"]
|
|
|
|
|
|
class x86_as_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.as", "e asm.bits=16"]
|
|
|
|
|
|
class x86_as_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.as", "e asm.bits=32"]
|
|
|
|
|
|
class x86_as_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.as", "e asm.bits=64"]
|
|
|
|
|
|
class x86_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86", "e asm.bits=16"]
|
|
|
|
|
|
class x86_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86", "e asm.bits=32"]
|
|
|
|
|
|
class x86_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86", "e asm.bits=64"]
|
|
|
|
|
|
class x86_nasm_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.nasm", "e asm.bits=16"]
|
|
|
|
|
|
class x86_nasm_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.nasm", "e asm.bits=32"]
|
|
|
|
|
|
class x86_nasm_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.nasm", "e asm.bits=64"]
|
|
|
|
|
|
class x86_nz_16(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.nz", "e asm.bits=16"]
|
|
|
|
|
|
class x86_nz_32(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.nz", "e asm.bits=32"]
|
|
|
|
|
|
class x86_nz_64(_RizinBase):
|
|
arch_cmds = ["e asm.arch=x86.nz", "e asm.bits=64"]
|
|
|
|
|
|
class xap(_RizinBase):
|
|
arch_cmds = ["e asm.arch=xap", "e asm.bits=16"]
|
|
|
|
|
|
class xcore(_RizinBase):
|
|
arch_cmds = ["e asm.arch=xcore", "e asm.bits=32"]
|
|
|
|
|
|
class xtensa(_RizinBase):
|
|
arch_cmds = ["e asm.arch=xtensa", "e asm.bits=32"]
|
|
|
|
|
|
class z80(_RizinBase):
|
|
arch_cmds = ["e asm.arch=z80", "e asm.bits=8"]
|