2017-10-04 344 views
-3

我阅读有关Windows挂钩和Win32可执行程序的内部结构(https://en.wikipedia.org/wiki/Hooking#Windows),看到这个代码块:IMAGE_DOS_HEADER挂钩

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是有点生疏,我可能需要刷(指针总是让我困惑),但我认为这种方式的工作原理是创建一个名为iidIMAGE_IMPORT_DESCRIPTOR指针。 iid指向IMAGE_IMPORT_DESCRIPTOR,并设置为等于名为pImgImportDesc的对象。所以它看着pImgImportDescName属性,如果它没有设置它会去下一个?所以基本上,它正在寻找最后一个?

还有任何关于书籍或视频的建议,以查看更多关于这种真正低级别事情的信息吗?读代码让我感到困惑。

+0

它会去下一个,如果它是** **集。所以它遍布所有这些。 – rkapl

+1

代码解析PE头。没有任何地方挂钩,也没有任何伸展的低水平。询问基本的C语法不是Stack Overflow的意思。 – IInspectable

+0

感谢您的输入,但这不是低级别?我的意思是不处理PE头很低的水平,除非你将它与程序集进行比较(我真的在问,我对此并不熟悉)。对不起,我在任何类型的编程背景下的大部分背景都是高级的java/web开发,我只是想要解决这样的问题。我在这里看到很多问题处理某些事情的基本解释/语法。 – JimmySmithJR

回答

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