Fix 64bits callback stub, i now preserve the return value

This commit is contained in:
Clement Rouault
2015-03-13 10:27:39 +01:00
parent a1ee711a93
commit bcda1ac5c5
2 changed files with 5 additions and 2 deletions
+5
View File
@@ -193,6 +193,7 @@ def generate_stub_64(callback):
c_callback = ctypes.c_ulong.from_address(id(callback._objects['0']) + 3 * ctypes.sizeof(ctypes.c_void_p)).value
gstate_save_addr = allocator.reserve_int()
return_addr_save_addr = allocator.reserve_int()
return_value_save_addr = allocator.reserve_int()
Reserve_space_for_call = MultipleInstr([Push_RDI()] * 4)
Clean_space_for_call = MultipleInstr([Pop_RDI()] * 4)
@@ -250,6 +251,8 @@ def generate_stub_64(callback):
code += Mov_RAX_X(c_callback)
code += Clean_space_for_call
code += Call_RAX()
# Save return value
code += Mov_DX_RAX(return_value_save_addr)
code += Mov_RAX_DX(return_addr_save_addr)
code += Push_RAX()
code += Mov_RAX_X(release)
@@ -267,6 +270,8 @@ def generate_stub_64(callback):
code += Mov_RSI_DRAX()
code += Mov_RAX_X(save_rdi)
code += Mov_DRAX_RDI()
# Restore return value
code += Mov_RAX_DX(return_value_save_addr)
code += Ret()
return code
-2
View File
@@ -108,7 +108,6 @@ def PEFile(baseaddr):
def get_IMPORT_DESCRIPTORS(self):
import_datadir = self.get_DataDirectory()[IMAGE_DIRECTORY_ENTRY_IMPORT]
if import_datadir.VirtualAddress == 0:
print("get_IMPORT_DESCRIPTORS : VirtualAddress == 0")
return []
import_descriptor_addr = RVA(import_datadir.VirtualAddress).addr
current_import_descriptor = self.IMAGE_IMPORT_DESCRIPTOR.from_address(import_descriptor_addr)
@@ -157,7 +156,6 @@ def PEFile(baseaddr):
else:
import_by_name = IMPORT_BY_NAME.from_address(baseaddr + int_entry.AddressOfData)
name = ctypes.c_char_p(ctypes.addressof(import_by_name) + IMPORT_BY_NAME.Name.offset).value
print(name)
res.append((import_by_name.Hint, name))
int_addr += ctypes.sizeof(THUNK_DATA)
int_entry = THUNK_DATA.from_address(int_addr)