一、模块隐藏的实现原理
普通API查找模块实现思路:其通过查询在R3中的PEB(Process Environment Block 进程环境块)与TEB(Thread Environment Block 进程环境块)来找到一个双向链表,通过遍历双向链表中某一成员(字符串)来查找全部模块。
模块隐藏实现思路:在R3层的模块隐藏,我们需要做的就是将其该链表断链,将某一模块从这个双向链表中摘除,这样再调用传统的API时就会搜索不到。
二、结构体成员详细介绍
<1> TEB结构体 -- 内存地址为 fs:[0] 处。
使用Windbg的 "dt _TEB"命令来查看TEB结构体
kd> dt _TEB
ntdll!_TEB
+0x000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0x020 ClientId : _CLIENT_ID
+0x028 ActiveRpcHandle : Ptr32 Void
+0x02c ThreadLocalStoragePointer : Ptr32 Void
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB
+0x034 LastErrorValue : Uint4B
1. 属性介绍
1.1)_NT_TIB:重点两个属性,栈顶与栈大小。
1.2) _CLIENT_ID: 存储该进程ID与当前主线程ID。
1.3) _PEB:进程环境块 ,记住其在 TEB 偏移 0x30处即可。
2. 通过olldbg查看该结构体
2.1) 打开任意进程,在寄存器窗口找到 fs:[0],查看其内存地址。
2.2) 在内存窗口使用命令 "db 5E7000" 跳转到该内存,使用地址格式(长型-地址)显示。
<2> PEB结构体 -- fs:[0x30]
使用 Windbg 指令 dt _PEB 查看 PEB结构体,重点