我正在阅读有关Windows Hooking和Win32可执行文件(https://en.wikipedia.org/wiki/Hooking#Windows)内部的内容,并看到了这段代码:
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++)
我的C有点生疏,我可能需要刷新(指针总是让我感到困惑),但我认为这样做的方法是创建一个名为{{1}的IMAGE_IMPORT_DESCRIPTOR
指针}。 iid
指向iid
,并设置为等于名为IMAGE_IMPORT_DESCRIPTOR
的对象。所以它正在查看pImgImportDesc
的{{1}}属性,如果没有设置,它会转到下一个属性吗?所以基本上,它正在寻找最后一个?
还有任何书籍或视频的建议,以了解更多关于这样的真正低级别的事情?阅读代码让我感到困惑。
答案 0 :(得分:5)
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
HMODULE
实例句柄与其加载地址相同。所以这是在加载地址的开头获得指向进程的IMAGE_DOS_HEADER
结构的指针。
PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew);
e_lfanew
字段是进程的IMAGE_NT_HEADERS
结构的偏移量。这是对pImgDosHeaders
指针的类型转换BYTE*
,将其值增加e_lfanew
个字节,然后将结果输入到IMAGE_NT_HEADERS*
。
PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
是进程的Imports表的第一个IMAGE_IMPORT_DESCRIPTOR
结构的偏移量。 pImgDosHeaders
增加了那么多字节,然后输入到IMAGE_IMPORT_DESCRIPTOR*
。
for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++)
iid
指向表中的第一个描述符,循环继续遍历表,直到找到没有分配Name
的描述符,表示表的结尾。阅读此MSDN文章了解更多详情:
Peering Inside the PE: A Tour of the Win32 Portable Executable File Format