diff --git a/native_exec/simple_x64.py b/native_exec/simple_x64.py index f970e6e..7199bed 100644 --- a/native_exec/simple_x64.py +++ b/native_exec/simple_x64.py @@ -3,7 +3,8 @@ import struct import sys -from simple_x86 import MultipleInstr +import codecs +from .simple_x86 import MultipleInstr # This code should really be rewritten.. @@ -11,6 +12,8 @@ this_module = sys.modules[__name__] generated_instruction = [] +long = int + def add_instruction(name, instruction): generated_instruction.append((name, instruction)) setattr(this_module, name, instruction) @@ -22,6 +25,12 @@ def generate_module_doc(): this_module.__doc__ = "\n".join(doc_lines) +def decode_hex(s): + return codecs.decode(s.encode(), "hex").decode() + +def encode_hex(s): + return codecs.encode(s.encode(), "hex").decode() + reg_order = ['EAX', 'ECX', 'EDX', 'EBX', 'ESP', 'EBP', 'ESI', 'EDI'] reg_opcode = {v : format(i, "03b") for i, v in enumerate(reg_order)} @@ -52,12 +61,14 @@ class X64Instruction(object): raise ValueError("{0} bindings must be between 0 and 0xffffffffffffffff".format(self.__class__.__name__)) def get_unbinded_code(self): - return self.code.replace(" ", "").decode('hex') + return decode_hex(self.code.replace(" ", "")) def get_code(self): code = self.get_unbinded_code() for i in range(self.biding): - code = code.replace((str(i + 1) * 16).decode('hex'), struct.pack("