1、首先通过FS寄存器获取到TEB的地址
2、在TEB偏移为0x30处的成员是PEB
3、PEB偏移为0xC处的成员是PEB_LDR_DATA结构体指针
4、PEB_LDR_DATA结构体偏移为0x1C处成员为InInitializationOrderModuleList,初始化模块链表,这个成员保存的是模块链表的头部地址。
5、通过InInitializationOrderModuleList模块链表可以获得按照顺序加载到进程内存空间的模块,其中第一个始终是ntdll.dll,根据系统的不同,可能第二个加载的模块是kernel32.dll或者kernelbase.dll。
6、无论加载的是kernel32.dll还是kernelbase.dll,其导出表中都有GetProcAddress函数的地址。
汇编代码对应如下:
mov esi,dword ptr fs:[0x30] //esi = PEB的地址
mov esi,[esi+0xC] //esi = 指向PEB_LDR_DATA的结构体指针
mov esi,[esi+0x1C] //es