You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.1 KiB
72 lines
2.1 KiB
#
|
|
# Copyright (c) 2020 Bitdefender
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
"""Interface for disassembling code."""
|
|
|
|
import _pybddisasm
|
|
|
|
class NdInstruction(dict):
|
|
"""Magic wrapper around a dictionary, that makes all the keys available
|
|
through dot notation (recursively). Examples:
|
|
|
|
instruction['Length'] is now instruction.Length
|
|
instruction['InstructionBytes'] is now instruction.InstructionBytes
|
|
|
|
You can still access the fileds the old way."""
|
|
def __init__(self, *args, **kwargs):
|
|
super(NdInstruction, self).__init__(*args, **kwargs)
|
|
self.__dict__ = self
|
|
|
|
# now set all the dict children to be the same
|
|
for key in self.__dict__:
|
|
if not isinstance(self.__dict__[key], dict):
|
|
continue
|
|
|
|
self.__dict__[key] = NdInstruction(self.__dict__[key])
|
|
|
|
if 'Operands' in self.__dict__ and isinstance(self.Operands, dict):
|
|
for op in self.Operands:
|
|
self.Operands[op] = NdInstruction(self.Operands[op])
|
|
|
|
|
|
def nd_to_text(code, arch_code_size, arch_data_size=0, rip=0):
|
|
if not arch_data_size:
|
|
arch_data_size = arch_code_size
|
|
|
|
return _pybddisasm.nd_to_text(code, arch_code_size, arch_data_size, rip)
|
|
|
|
|
|
def nd_decode(code, arch_code_size, arch_data_size=0, rip=0):
|
|
if not arch_data_size:
|
|
arch_data_size = arch_code_size
|
|
|
|
instruction = _pybddisasm.nd_decode_ex(code, arch_code_size, arch_data_size, rip)
|
|
|
|
if not instruction:
|
|
return None
|
|
|
|
return NdInstruction(instruction)
|
|
|
|
|
|
def nd_decode_ex(code, arch_code_size, arch_data_size=0, rip=0):
|
|
if not arch_data_size:
|
|
arch_data_size = arch_code_size
|
|
|
|
instruction = _pybddisasm.nd_decode_ex(code, arch_code_size, arch_data_size, rip)
|
|
|
|
if not instruction:
|
|
return None
|
|
|
|
return NdInstruction(instruction)
|
|
|
|
|
|
def nd_decode_ex2(code, arch_code_size, arch_data_size, arch_stack_size, vendor='intel', rip=0):
|
|
instruction = _pybddisasm.nd_decode_ex2(code, arch_code_size, arch_data_size,
|
|
arch_stack_size, vendor, rip)
|
|
|
|
if not instruction:
|
|
return None
|
|
|
|
return NdInstruction(instruction)
|