2

我正在尝试编写一些 python 代码(使用 ctypes),最终将允许我找到 IAT。我对 PE 结构很熟悉,但从来不需要编写代码来通过数据结构来实现它。我一直在做一些研究,并发现了一些用 C++ 编写的代码,这些代码允许我获取基本映像的句柄,这样我就可以开始通过数据结构取消引用我的方式。我一直在使用这篇文章PE 格式 - IAT 问题作为参考。所以我试图使用这篇文章获取 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 类型声明的其他结构时,我之前使用过“byref”。

另一个问题是,我能够得到我认为从 GetModuleHandleW 调用返回的有效句柄。我假设这是地址,如果是这样,我可以开始通过该 IMAGE_DOS_HEADER 结构工作,而不必创建新的“image_dos_header”结构,然后将返回的句柄转换为它吗?然后通过它进入IAT?任何帮助都是感谢或反馈我试图用来进入 IAT 的方法。谢谢!

4

1 回答 1

1

所以我发现我真正想做的是将一个从 GetModuleHandleW 调用返回的 int(句柄地址)转换为指向结构 (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
于 2013-09-26T20:05:42.137 回答