PEB windbg笔记

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 里面应该怎么看呢?

原文地址:https://www.cnblogs.com/yueyue184/p/2802417.html