windbg 调试进程。
0:001> dg @fs P Si Gr Pr Lo Sel Base Limit Type l ze an es ng Flags ---- -------- -------- ---------- - -- -- -- -- -------- 0038 7ffde000 00000fff Data RW Ac 3 Bg By P Nl 000004f3 <--------------7ffde000 0:001> r $teb $teb=7ffde000 <--------------
fs:[0x30] 就是 PEB结构的指针.
继续分析怎么得出 0x30是peb的。
0:001> dt ntdll!*teb* <----------------------------dt查看结构 使用通配符查处TEB结构的名称 ntdll!_TEB ntdll!_GDI_TEB_BATCH ntdll!_TEB_ACTIVE_FRAME ntdll!_TEB_ACTIVE_FRAME_CONTEXT ntdll!_TEB_ACTIVE_FRAME_CONTEXT 0:001> dt -r -v ntdll!_TEB <------------------------- -r -v 不清楚怎么解释 反正就这样用吧。获取信息更多。 struct _TEB, 66 elements, 0xfb8 bytes +0x000 NtTib : struct _NT_TIB, 8 elements, 0x1c bytes <-------------_NT_TIB结构 +0x018 Self : Ptr32 to struct _NT_TIB, 8 elements, 0x1c bytes <-------------注意这里 结构是 _NT_TIB +0x02c ThreadLocalStoragePointer : Ptr32 to Void +0x030 ProcessEnvironmentBlock : Ptr32 to struct _PEB, 65 elements, 0x210 bytes <--------------可以看见0x30 是 PEB结构。
0x18是_NT_TIB结构 也就是指向自身的 0x0。可以使用命令查看一下。
struct _TEB, 66 elements, 0xfb8 bytes 是 teb结构的第一个。
0:001> r $teb $teb=7ffde000 <--------地址也就是 +0x000 NtTib 0:001> dd $teb+0x18 7ffde018 7ffde000 00000000 00001e18 00001990 <-------------------这里也就是7ffde000
结合上面来个查询 除了
_asm
{
mov eax,fs:[0x30];
}
还可以这样写
{
mov eax,fs:[0x18];
mov eax,[eax+0x30];
}
这样就算得出了 PEB 的结构指针了 。
0:001> !teb TEB at 7ffde000 ExceptionList: 00ffffe4 StackBase: 01000000 StackLimit: 00fff000 SubSystemTib: 00000000 FiberData: 00001e00 ArbitraryUserPointer: 00000000 Self: 7ffde000 EnvironmentPointer: 00000000 ClientId: 00001e18 . 00001990 RpcHandle: 00000000 Tls Storage: 00000000 PEB Address: 7ffd3000
查看下PEB的结构。
0:001> dt -v -r ntdll!_PEB struct _PEB, 65 elements, 0x210 bytes +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar +0x003 SpareBool : UChar +0x004 Mutant : Ptr32 to Void +0x008 ImageBaseAddress : Ptr32 to Void +0x00c Ldr : Ptr32 to struct _PEB_LDR_DATA, 7 elements, 0x28 bytes <--------------通过_PEB的Ldr成员获取_PEB_LDR_DATA结构
得到_PEB_LDR_DATA后查看下 结构 。
0:001> dt ntdll!_PEB_LDR_DATA +0x000 Length : Uint4B +0x004 Initialized : UChar +0x008 SsHandle : Ptr32 Void +0x00c InLoadOrderModuleList : _LIST_ENTRY<------------再通过 _PEB_LDR_DATA结构的成员 InMemoryOrderModuleList获得_LIST_ENTRY +0x014 InMemoryOrderModuleList : _LIST_ENTRY +0x01c InInitializationOrderModuleList : _LIST_ENTRY +0x024 EntryInProgress : Ptr32 Void
得到_LIST_ENTRY后再查看下他
0:001> dt -v ntdll!_LIST_ENTRY struct _LIST_ENTRY, 2 elements, 0x8 bytes +0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes <--------------通过_LIST_ENTRY的Flink成员得到什么呢??? +0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
知道了怎么得到peb地址 和 ldr偏移之类的 对比上面的分析进程看看。
0:001> dd $peb+C l1 <--------------通过_PEB的Ldr(Ldr偏移:0xC)成员获取_PEB_LDR_DATA结构
7ffd300c 00251e90
0:001> dt ntdll!_PEB_LDR_DATA 00251e90 <--------------查看 地址00251e90为_PEB_LDR_DATA的结构。 +0x000 Length : 0x28 +0x004 Initialized : 0x1 '' +0x008 SsHandle : (null) +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x251ec0 - 0x254b90 ] +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x251ec8 - 0x254b98 ] +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x251f28 - 0x254ba0 ] +0x024 EntryInProgress : (null)
0:001> dt ntdll!_LIST_ENTRY 00251e90+C 《--------------再用 _PEB_LDR_DATA(00251e90) 就是得到 InLoadOrderModuleList(偏移:0xC)成员的Flink的_LIST_ENTRY结构地址
[ 0x251ec0 - 0x254b90 ]
+0x000 Flink : 0x00251ec0 _LIST_ENTRY [ 0x251f18 - 0x251e9c ]
+0x004 Blink : 0x00254b90 _LIST_ENTRY [ 0x251e9c - 0x254af0 ]
0:001> dt ntdll!_LIST_ENTRY 00252068 [ 0x252108 - 0x251fc0 ] +0x000 Flink : 0x00252108 _LIST_ENTRY [ 0x2521a8 - 0x252068 ] +0x004 Blink : 0x00251fc0 _LIST_ENTRY [ 0x252068 - 0x251f18 ] 0:001> dt ntdll!_LIST_ENTRY 00252108 [ 0x2521a8 - 0x252068 ] +0x000 Flink : 0x002521a8 _LIST_ENTRY [ 0x2522f0 - 0x252108 ] +0x004 Blink : 0x00252068 _LIST_ENTRY [ 0x252108 - 0x251fc0 ] 0:001> dt ntdll!_LIST_ENTRY 002521a8 [ 0x2522f0 - 0x252108 ] +0x000 Flink : 0x002522f0 _LIST_ENTRY [ 0x252390 - 0x2521a8 ] +0x004 Blink : 0x00252108 _LIST_ENTRY [ 0x2521a8 - 0x252068 ] 0:001> dt ntdll!_LIST_ENTRY 002522f0 [ 0x252390 - 0x2521a8 ] +0x000 Flink : 0x00252390 _LIST_ENTRY [ 0x252430 - 0x2522f0 ] +0x004 Blink : 0x002521a8 _LIST_ENTRY [ 0x2522f0 - 0x252108 ]
仔细看 貌似就是 什么双向链表之类的~
为毛之能看见了表? 网上说的Flink成员是_LDR_DATA_TABLE_ENTRY结构 在WINDBG 里面应该怎么看呢?