TEB偏移0x30处,即FS:[0x30]地址处保存着一个指针,指向PEB,PEB结构的偏移0xC处保存着另外一个指针ldr,该指针执行PEB_LDR_DATA
该结构的后三个成员是指向LDR_MODULE链表结构中相应三条双向链表头的指针,分别是按照加载顺序、在内存中地址顺序和初始化顺序排列的模块信息结构的指针。
Peb->Ldr->InitializationOrderModuleList指向按照初始化顺序排序的第一个LDR_MODULE节点的InInitializationOrderModuleList成员的指针,在WinNT平台下,该链表头节点的LDR_MODULE结构包含的是NTDLL.DLL,而链表的下一个节点所包含的就是Kernel32.dll相关的信息。
汇编核心代码:
MOV EAX, DWORD PTR FS:[30] ;获取PEB基址
MOV EAX, DWORD PTR DS:[EAX+C] ;获取PEB_LDR_DATA结构指针
MOV ESI, DWORD PTR DS:[EAX+1C] ;获取InInitializationOrderModuleList成员指针
LODS DWORD PTR DS:[ESI] ;获取双向链表当前节点的后继指针
MOV EBX, DWORD PTR DS:[EAX+8] ;取其基地址,该结构当前包含的是kernel32.dll