IMAGE_DOS_HEADER挂钩

Jim*_*hJR -3 c++ hook winapi

我正在阅读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++)
Run Code Online (Sandbox Code Playgroud)

我的C有点生疏,我可能需要刷新(指针总是让我困惑),但我认为这样做的方法是创建一个IMAGE_IMPORT_DESCRIPTOR名为的指针iid.iid指向an IMAGE_IMPORT_DESCRIPTOR,并设置为等于名为的对象pImgImportDesc.所以,在看pImgImportDescName财产,如果没有设置它会去下一个?所以基本上,它正在寻找最后一个?

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

Rem*_*eau 6

PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
Run Code Online (Sandbox Code Playgroud)
  • 进程被加载到OS选择的特定内存地址.HMODULE进程的实例句柄与其加载地址相同.所以这是IMAGE_DOS_HEADER在加载地址的开头获得指向进程结构的指针.

PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew);
Run Code Online (Sandbox Code Playgroud)
  • e_lfanew字段是进程IMAGE_NT_HEADERS结构的偏移量.这是pImgDosHeadersBYTE*指针的类型转换,按e_lfanew字节递增其值,然后将结果类型转换为IMAGE_NT_HEADERS*.

PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
Run Code Online (Sandbox Code Playgroud)
  • 与上述相同. DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddressIMAGE_IMPORT_DESCRIPTOR进程的Imports表的第一个结构的偏移量. pImgDosHeaders正在增加那么多字节,然后输入到IMAGE_IMPORT_DESCRIPTOR*.

for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++)
Run Code Online (Sandbox Code Playgroud)
  • 这循环遍历整个导入表. iid指向表中的第一个描述符,循环继续遍历表,直到找到没有Name赋值的描述符,表示表的结尾.

阅读此MSDN文章了解更多详细信息:

PE内部对等:Win32可移植可执行文件格式之旅