import struct import sys this_module = sys.modules[__name__] def add_instruction(name, instruction): setattr(this_module, name, instruction) reg_order = ['EAX', 'ECX', 'EDX', 'EBX', 'ESP', 'EBP', 'ESI', 'EDI'] reg_opcode = {v : format(i, "03b") for i, v in enumerate(reg_order)} class X86Instruction(object): mnemo = "" code = "" biding = 0 def __init__(self, *bind_values): if len(bind_values) != self.biding: raise ValueError("{0} expect {1} values got {2}".format(self.__class__.__name__, self.biding, len(bind_values))) self.bind_values = bind_values for i, v in enumerate(bind_values): if not isinstance(v, (int, long)): raise ValueError("{0} bindings must be 'int' got '{1}' instead".format(self.__class__.__name__, type(v).__name__)) if not 0 <= v <= 0xffffffff: raise ValueError("{0} bindings must be between 0 and 0xffffffff".format(self.__class__.__name__)) def get_unbinded_code(self): return self.code.replace(" ", "").decode('hex') def get_code(self): code = self.get_unbinded_code() for i in range(self.biding): code = code.replace((str(i + 1) * 8).decode('hex'), struct.pack("