我正在尝试编写一些python代码(使用ctypes),最终允许我找到IAT。我熟悉PE结构,但从来没有必要编写代码来通过数据结构来实现它。我一直在做一些研究,并找到了一些用C ++编写的代码,它允许我获得基本图像的句柄,这样我就可以开始在数据结构中取消引用。我一直在使用这篇文章PE Format - IAT Questions作为参考。所以我试图使用这篇文章来获取IMAGE_DOS_HEADER的句柄Get pointer to IMAGE_DOS_HEADER with GetModuleHandle?我正在使用Python C类型编写这个,所以下面是我正在使用的代码。
class IMAGE_DOS_HEADER(ctypes.Structure):
_fields_ = [
("e_magic", WORD),
("e_cblp", WORD),
("e_cp", WORD),
("e_crlc", WORD),
("e_cparhdr", WORD),
("e_minalloc", WORD),
("e_maxalloc", WORD),
("e_ss", WORD),
("e_sp", WORD),
("e_csum", WORD),
("e_ip", WORD),
("e_cs", WORD),
("e_lfarlc", WORD),
("e_ovno", WORD),
("e_res", WORD * 4),
("e_oemid", WORD),
("e_oeminfo", WORD),
("e_res2", WORD * 10),
("e_lfanew", WORD),
]
kernel32.GetModuleHandleW.restype = wintypes.HMODULE
kernel32.GetModuleHandleW.argtypes = [wintypes.LPCWSTR]
image_dos_header = IMAGE_DOS_HEADER()
hModule = kernel32.GetModuleHandleW(0)
if hModule == 0:
hModule_Error = ctypes.WinError(ctypes.get_last_error())
print("[-] error getting the hModule " + hModule)
system.exit(1)
#Trying to cast the handle to image_dos_header struct
image_dos_header = ctypes.byref(hModule) #Error is here
当我尝试这段代码时,我得到错误,“byref()参数必须是ctypes实例,而不是'int'”。我一直在做一些研究并尝试过一些东西,但我似乎无法找到答案。在使用我使用c-types声明的其他结构之前,我曾使用过“byref”。
另一个问题是,我能够得到我认为是从GetModuleHandleW调用返回的有效句柄。我假设这是地址,如果是这样,我可以开始通过IMAGE_DOS_HEADER结构,而不必创建新的“image_dos_header”结构,然后将返回的句柄转换为它?然后通过它来我的方式去IAT?任何帮助都是我正在尝试用来进入IAT的方法的欣赏或反馈。谢谢!
答案 0 :(得分:1)
所以我发现我真正想要做的是将从GetModuleHandleW调用返回的int(句柄地址)转换为指向struct(IMAGE_DOS_HEADER)的指针。下面是我过去常用的代码。希望它可以帮助别人!
#In C++ this would like this -
#IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*)hModule;
pDOSHeader = ctypes.POINTER(IMAGE_DOS_HEADER)
pDOSHeader = ctypes.cast(hModule, ctypes.POINTER(IMAGE_DOS_HEADER)).contents