from pathlib import Path import logging import rzpipe import json class _RizinBase: def __init__(self, path: Path): 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") rz_pipe.quit() self.disassembly = json.loads(result) 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 opcode: _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 opcode: 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", "e asm.bits=4"] 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"]