使用PEB TEB查找核心模块
如何从一个未知的环境找到并使用我们的Kernel32.dll user32.dll ntdll.dll
知识补充:
Kernel32.dll user32.dll ntdll.dll
- 所有进程无论窗口程序还是控制台程序,都会引用kerne132.dll
- User32.dll窗口程序专用,封装了所有跟窗口操作相关的 API
- Ntdll.dll ! ! !他是ring0 的大门。无论是kernel32还是user32最终都会去调用ntdll, dll
ExceptionList:用于操作系统的SEH (SEH: windows 的异常处理机制大量用于反调试程序!!!)
PEB: Process Envirorment Block
进程环境块:存放进程相关信息,我们需要的东西在这个老东西里面!!
TEB
实验:分析API NtCurrentTeb ( ) ﹔
FS段寄存器存放的是TEB结构体的首地址,我们可以看到这个API主要就是做了一个操作,mov eax,FS:[0x18]
也就是把7FFDE018位置的值给eax,且我们看到这里的值就是FS的指针地址,由此可以知道7FFDE018这个位置就是上面这个NT_TIB结构体指向自己的指针。 而NT_TIB在TEB中又是在0偏移的位置上,所以FS存放的就是TEB结构体的首地址。
FS:[0X30]就是PEB的指针。至此我们找到了PEB的地址
PEB
PEB+0x0c偏移存放了LDR结构体的地址,而LDR结构体中,有分别按不同排序的dll,我们重点看第三个InitalizationOrderMoudleList这个结构体变量是按初始化排序的,第一个存放的是ntdll.dll,第二个是kernel32.dll或者Kernerbase.dll。我们再到这个LIST_ENTRY结构体中看,其中Flink存放着下一个结构体的指针
,Blink存放着上一个结构体的指针,相当于一个双向链表。 而InitalizationOrderMoudleList中的第一个dll文件就是ntdll.dll
,他的Flink指向的就是kernel32.dll。
至此我们有了第一种思路来获取到kernel32.dll。
1. MOV esi,FS:[0x30] 获取PEB地址
2. MOV esi,[esi+0xc] 获取LDR地址
3. MOV esi,[esi+0x1c] 获取InitalizationOrderMoudleList地址
4. MOV esi,[esi] 获取第二个DLL文件信息 即Flink
第二种思路和第一种相差无几,有第二种思路是因为List_entry结构体在外层还有一个结构体。其名为LDR_DATA_TABLE_ENTRY,像我们看到的,他其中也有一个InitalizationOrderMoudleList结构体变量,我们上一种思路第三部调用的其实和这个是一样的。且这个结构体还有个重要的变量DllBase,他就相当于我们模块的基址,相当于GetModouleHandle,这样我们依旧可以靠他找到kernel32.dll来调用LoadLibrary和GetProcAddr这两个API。
1. MOV esi,FS:[0x30] 获取PEB地址
2. MOV esi,[esi+0xc] 获取LDR地址
3. MOV esi,[esi+0x1c] 获取InitalizationOrderMoudleList地址
4. MOV esi,[esi+0x8] 获取dllbase