我正在阅读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.所以,在看pImgImportDesc的Name财产,如果没有设置它会去下一个?所以基本上,它正在寻找最后一个?
还有任何书籍或视频的建议,以了解更多关于这样的真正低级别的事情?阅读代码让我感到困惑.
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
Run Code Online (Sandbox Code Playgroud)
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结构的偏移量.这是pImgDosHeaders对BYTE*指针的类型转换,按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].VirtualAddress是IMAGE_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文章了解更多详细信息: