C++ 图像_DOS_标题挂钩

C++ 图像_DOS_标题挂钩,c++,winapi,hook,C++,Winapi,Hook,我正在阅读有关Windows挂钩和Win32可执行文件()的内部内容,并看到以下代码块: PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module; PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew); PIMAGE_IMPORT_DESCRIPTOR pImgImpor

我正在阅读有关Windows挂钩和Win32可执行文件()的内部内容,并看到以下代码块:

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有点生疏了,我可能需要重新整理一下(指针总是让我困惑),但我认为它的工作方式是创建一个名为
iid
IMAGE\u IMPORT\u描述符
指针
iid
指向一个
IMAGE\u IMPORT\u描述符
,并被设置为与名为
pImgImportDesc
的对象相等。因此,它正在查看
pImgImportDesc
Name
属性,如果未设置,它将转到下一个属性?所以基本上,它是在寻找最后一个

还有什么关于书籍或视频的建议可以让你更多地了解像这样的低级事物吗?读代码把我弄糊涂了

PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
  • 进程在操作系统选择的特定内存地址加载。进程的
    HMODULE
    实例句柄与其加载地址相同。因此,这将在加载地址的开头获得一个指向进程的
    IMAGE\u DOS\u头
    结构的指针

  • e\u lfanew
    字段是进程的
    IMAGE\u NT\u头的偏移量
    struct。这是将
    pImgDosHeaders
    类型转换为
    BYTE*
    指针,通过
    e\u lfanew
    字节增加其值,然后将结果转换为
    IMAGE\u NT\u HEADERS*

  • 同上
    DataDirectory[IMAGE\u DIRECTORY\u ENTRY\u IMPORT].VirtualAddress
    是进程导入表的第一个
    IMAGE\u IMPORT\u描述符的偏移量
    pImgDosHeaders
    正以如此多的字节递增,然后将类型转换为
    IMAGE\u IMPORT\u DESCRIPTOR*

  • 这将在整个导入表中循环
    iid
    指向表中的第一个描述符,循环继续遍历表,直到找到一个未分配
    名称的描述符,表示表的结束
有关更多详细信息,请阅读此MSDN文章:


如果已设置,则将转到下一步。这段代码正在解析一个PE头。任何地方都没有挂钩,也没有任何伸展的低水平。询问基本C语法并不是堆栈溢出的目的。感谢您的输入,但这怎么不是低级别的呢?我的意思是,处理PE头的级别不是很低,除非您将其与汇编进行比较(我真的在问,我对此不太熟悉)。很抱歉,我在任何编程类型中的大部分背景都是高级java/web开发,我只是想了解如何处理这样的东西。我在这里看到了很多关于某些事物的基本解释/语法的问题。
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++)