IMAGE_DOS_HEADER挂钩

时间:2017-10-04 19:49:17

标签: c++ winapi hook

我正在阅读有关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}}属性,如果没有设置,它会转到下一个属性吗?所以基本上,它正在寻找最后一个?

还有任何书籍或视频的建议,以了解更多关于这样的真正低级别的事情?阅读代码让我感到困惑。

1 个答案:

答案 0 :(得分:5)

PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
  • 进程被加载到OS选择的特定内存地址。进程的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