peb结构块解析:
    项目需要获取程序运行的一些状态,目前只能获取寄存器信息,故采用fs寄存器获取peb信息,本文主要探索peb中可以获得的进程信息。
    windbg信息如下:win xp 下,和win7不一样,下面为xp环境

    1. 0:000> !PEB
    2. PEB at 7ffdd000
    3. +0 InheritedAddressSpace: No
    4. +1 ReadImageFileExecOptions: No
    5. +2 BeingDebugged: Yes
    6. ImageBaseAddress: 00400000
    7. Ldr 00251ea0
    8. Ldr.Initialized: Yes
    9. Ldr.InInitializationOrderModuleList: 00251f58 . 00252798
    10. Ldr.InLoadOrderModuleList: 00251ee0 . 00252848
    11. Ldr.InMemoryOrderModuleList: 00251ee8 . 00252850
    12. Base TimeStamp Module
    13. 400000 4ffadf89 Jul 09 21:41:29 2012 C:\Documents and Settings\Administrator\桌\csnbes_1.0.0.8.exe
    14. 7c920000 4802bdc5 Apr 14 10:13:25 2008 C:\WINDOWS\system32\ntdll.dll
    15. 7c800000 4802bdc6 Apr 14 10:13:26 2008 C:\WINDOWS\system32\kernel32.dll
    16. 770f0000 4802bdbd Apr 14 10:13:17 2008 C:\WINDOWS\system32\oleaut32.dll
    17. 77da0000 4802bd89 Apr 14 10:12:25 2008 C:\WINDOWS\system32\ADVAPI32.dll
    18. 77e50000 4802bdae Apr 14 10:13:02 2008 C:\WINDOWS\system32\RPCRT4.dll
    19. 77fc0000 4802bdc1 Apr 14 10:13:21 2008 C:\WINDOWS\system32\Secur32.dll
    20. 77ef0000 4802bd81 Apr 14 10:12:17 2008 C:\WINDOWS\system32\GDI32.dll
    21. 77d10000 4802bdbd Apr 14 10:13:17 2008 C:\WINDOWS\system32\USER32.dll
    22. 77be0000 4802be3f Apr 14 10:15:27 2008 C:\WINDOWS\system32\msvcrt.dll
    23. 76990000 4802bdbc Apr 14 10:13:16 2008 C:\WINDOWS\system32\ole32.dll
    24. 77180000 4802bd6c Apr 14 10:11:56 2008 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
    25. 77f40000 4802bdbb Apr 14 10:13:15 2008 C:\WINDOWS\system32\SHLWAPI.dll
    26. SubSystemData: 00000000
    27. ProcessHeap: 00150000
    28. ProcessParameters: 00020000
    29. CurrentDirectory: 'C:\Program Files\Debugging Tools for Windows (x86)\'
    30. WindowTitle: 'C:\Documents and Settings\Administrator\桌面\csnbes_1.0.0.8.exe'
    31. ImageFile: 'C:\Documents and Settings\Administrator\桌面\csnbes_1.0.0.8.exe'
    32. CommandLine: '"C:\Documents and Settings\Administrator\桌面\csnbes_1.0.0.8.exe"'
    33. DllPath: 'C:\Documents and Settings\Administrator\桌面;C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS;.;C:\Program Files\Debugging Tools for Windows (x86)\winext\arcade;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem'
    34. Environment: 00010000
    35. =::=::\
    36. ALLUSERSPROFILE=C:\Documents and Settings\All Users
    37. APPDATA=C:\Documents and Settings\Administrator\Application Data
    38. CLIENTNAME=Console
    39. CommonProgramFiles=C:\Program Files\Common Files
    40. COMPUTERNAME=BITGHOST
    41. ComSpec=C:\WINDOWS\system32\cmd.exe
    42. FP_NO_HOST_CHECK=NO
    43. HOMEDRIVE=C:
    44. HOMEPATH=\Documents and Settings\Administrator
    45. LOGONSERVER=\\BITGHOST
    46. NUMBER_OF_PROCESSORS=1
    47. OS=Windows_NT
    48. Path=C:\Program Files\Debugging Tools for Windows (x86)\winext\arcade;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
    49. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
    50. PROCESSOR_ARCHITECTURE=x86
    51. PROCESSOR_IDENTIFIER=x86 Family 6 Model 60 Stepping 3, GenuineIntel
    52. PROCESSOR_LEVEL=6
    53. PROCESSOR_REVISION=3c03
    54. ProgramFiles=C:\Program Files
    55. SESSIONNAME=Console
    56. SystemDrive=C:
    57. SystemRoot=C:\WINDOWS
    58. TEMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
    59. TMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
    60. USERDOMAIN=BITGHOST
    61. USERNAME=Administrator
    62. USERPROFILE=C:\Documents and Settings\Administrator
    63. WINDBG_DIR=C:\Program Files\Debugging Tools for Windows (x86)
    64. windir=C:\WINDOWS

    详细解释如下:

    1. 0:000> dt nt!_peb 7ffdd000
    2. ntdll!_PEB
    3. +0x000 InheritedAddressSpace : 0 ''
    4. +0x001 ReadImageFileExecOptions : 0 ''
    5. +0x002 BeingDebugged : 0x1 '' //判断进程是否被调试,true为被调试
    6. +0x003 SpareBool : 0 ''
    7. +0x004 Mutant : 0xffffffff Void
    8. +0x008 ImageBaseAddress : 0x00400000 Void //进程映像基址,就是PE中的IMAGE_OPTIONAL_HEADER->ImageBase对应的值。对于EXE来说,默认的ImageBase为0x400000;对于DLL来说,它是0x10000000,当打开ASLR时应该会变,**待验证**
    9. ----------
    10. +0x00c Ldr : 0x00251ea0 _PEB_LDR_DATA
    11. LoaderData域是PEB中一个很重要的成员域,它是一个指向PEB_LDR_DATA结构体的指针。它由PE Loader(加载器)填充,也就说,在这个指针指向的结构中,可以找到很多在PE中包含的信息。另外,我们在做Buffer OverFlow的时候经常会遇到这个数据结构,枚举用户进程加载的模块就和它密切相关。我们扩展出去,详细学习一下这个结构。
    12. 0:000> dt _PEB_LDR_DATA 0x00251ea0
    13. ntdll!_PEB_LDR_DATA
    14. +0x000 Length : 0x28 //结构长度
    15. +0x004 Initialized : 0x1 '' //进程是否初始化完成
    16. +0x008 SsHandle : (null)
    17. +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x251ee0 - 0x252848 ]
    18. +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x251ee8 - 0x252850 ]
    19. +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x251f58 - 0x252798 ]
    20. //nLoadOrderModuleList、InMemoryOrderModuleList、InInitializationOrderModuleList这三个域都是指向它们各自的双链表中的下一个LDR_MODULE的LIST_ENTRY
    21. +0x024 EntryInProgress : (null)
    22. ----------
    23. +0x010 ProcessParameters : 0x00020000 _RTL_USER_PROCESS_PARAMETERS
    24. // ProcessParameters域是指向 RTL_USER_PROCESS_PARAMETERS 的指针,RTL_USER_PROCESS_PARAMETERS 中是一些进程的参数。如下:
    25. 0:000> dt _RTL_USER_PROCESS_PARAMETERS 0x00020000
    26. ntdll!_RTL_USER_PROCESS_PARAMETERS
    27. +0x000 MaximumLength : 0x1000 //
    28. +0x004 Length : 0x7e4 //结构大小
    29. +0x008 Flags : 0x2001 //是否由RtlNormalizeProcessParams标准化
    30. +0x00c DebugFlags : 0
    31. +0x010 ConsoleHandle : (null) //该进程的窗口句柄,如果有的话
    32. +0x014 ConsoleFlags : 0
    33. +0x018 StandardInput : (null)
    34. +0x01c StandardOutput : 0x00010001 Void
    35. +0x020 StandardError : (null)
    36. +0x024 CurrentDirectory : _CURDIR
    37. +0x030 DllPath : _UNICODE_STRING "C:\Documents and Settings\Administrator\桌面;C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS;.;C:\Program Files\Debugging Tools for Windows (x86)\winext\arcade;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem"
    38. +0x038 ImagePathName : _UNICODE_STRING "C:\Documents and Settings\Administrator\桌面\csnbes_1.0.0.8.exe"
    39. +0x040 CommandLine : _UNICODE_STRING ""C:\Documents and Settings\Administrator\桌\csnbes_1.0.0.8.exe""
    40. +0x048 Environment : 0x00010000 Void
    41. +0x04c StartingX : 0
    42. +0x050 StartingY : 0
    43. +0x054 CountX : 0
    44. +0x058 CountY : 0
    45. +0x05c CountCharsX : 0
    46. +0x060 CountCharsY : 0
    47. +0x064 FillAttribute : 0
    48. +0x068 WindowFlags : 0
    49. +0x06c ShowWindowFlags : 0
    50. +0x070 WindowTitle : _UNICODE_STRING "C:\Documents and Settings\Administrator\桌面\csnbes_1.0.0.8.exe"
    51. +0x078 DesktopInfo : _UNICODE_STRING "WinSta0\Default"
    52. +0x080 ShellInfo : _UNICODE_STRING ""
    53. +0x088 RuntimeData : _UNICODE_STRING ""
    54. +0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
    55. ----------
    56. +0x014 SubSystemData : (null)
    57. +0x018 ProcessHeap : 0x00150000 Void //域指向的是进程堆(默认的那个)的首地址,每个进程在新建的时都会由系统自动创建一个默认堆以供使用。这也就是为什么我们在程序中可以直接使用malloc来动态申请堆内存的时候不需要指定使用的是哪个堆。可用于反调试,进程堆标志,系统创建进程时会将Flags置为0x02(HEAP_GROWABLE),将ForceFlags置为0。但是进程被调试时,这两个标志通常被设置为0x50000062h和0x40000060h。
    58. 如下:0:000> dt _HEAP 0x00150000
    59. ntdll!_HEAP
    60. +0x000 Entry : _HEAP_ENTRY
    61. +0x008 Signature : 0xeeffeeff //HEAP结构的签名
    62. +0x00c Flags : 0x50000062
    63. +0x010 ForceFlags : 0x40000060
    64. +0x014 VirtualMemoryThreshold : 0xfe00 //最大堆块大小
    65. +0x018 SegmentReserve : 0x100000 //段的保留空间大小
    66. +0x01c SegmentCommit : 0x2000 //每次提交内存的大小
    67. +0x020 DeCommitFreeBlockThreshold : 0x200 //解除提交的单块阈值
    68. +0x024 DeCommitTotalFreeThreshold : 0x2000 //解除提交的总空闲块阈值
    69. +0x028 TotalFreeSize : 0x98 //空闲块的总大小
    70. +0x02c MaximumAllocationSize : 0x7ffdefff //可分配的最大值
    71. +0x030 ProcessHeapsListIndex : 1 //本堆在进程堆列表中的索引
    72. +0x032 HeaderValidateLength : 0x608 //头结构的验证长度
    73. +0x034 HeaderValidateCopy : (null)
    74. +0x038 NextAvailableTagIndex : 0 //下一个可用的堆块标记索引
    75. +0x03a MaximumTagIndex : 0 //最大的堆块标记索引
    76. +0x03c TagEntries : (null) //指向用于标记堆块的标记结构
    77. +0x040 UCRSegments : (null) //UnCommitedRange Segments
    78. +0x044 UnusedUnCommittedRanges : 0x00150598 _HEAP_UNCOMMMTTED_RANGE
    79. +0x048 AlignRound : 0x17
    80. +0x04c AlignMask : 0xfffffff8 //用于地址对齐的掩码
    81. +0x050 VirtualAllocdBlocks : _LIST_ENTRY [ 0x150050 - 0x150050 ]
    82. +0x058 Segments : [64] 0x00150640 _HEAP_SEGMENT
    83. +0x158 u : __unnamed
    84. +0x168 u2 : __unnamed
    85. +0x16a AllocatorBackTraceIndex : 0
    86. +0x16c NonDedicatedListLength : 1
    87. +0x170 LargeBlocksIndex : (null)
    88. +0x174 PseudoTagEntries : (null)
    89. +0x178 FreeLists : [128] _LIST_ENTRY [ 0x152b48 - 0x152b48 ]
    90. +0x578 LockVariable : 0x00150608 _HEAP_LOCK //用于串行化控制的同步对象
    91. +0x57c CommitRoutine : (null)
    92. +0x580 FrontEndHeap : 0x00150688 Void //用于快速释放堆块的"前端堆"
    93. +0x584 FrontHeapLockCount : 0 //"前端堆"的锁定计数
    94. +0x586 FrontEndHeapType : 0x1 '' //"前端堆"的类型
    95. +0x587 LastSegmentIndex : 0 ''
    96. ----------
    97. +0x01c FastPebLock : 0x7c99d600 _RTL_CRITICAL_SECTION //FastPebLock域存放的是PEBLOCKROUTINE这个例程函数需要用到的参数。
    98. +0x020 FastPebLockRoutine : 0x7c921000 Void //PEB加锁/解锁回调例程
    99. +0x024 FastPebUnlockRoutine : 0x7c9210e0 Void
    100. +0x028 EnvironmentUpdateCount : 1 //进程的环境变量更改的次数
    101. +0x02c KernelCallbackTable : (null) //KernelCallbackTable域用于从内核"回调"用户空间的函数。
    102. +0x030 SystemReserved : [1] 0
    103. +0x034 AtlThunkSListPtr32 : 0
    104. +0x038 FreeList : (null)
    105. +0x03c TlsExpansionCounter : 0
    106. +0x040 TlsBitmap : 0x7c99d5c0 Void //TlsBitmap域代表TLS位图
    107. +0x044 TlsBitmapBits : [2] 1
    108. +0x04c ReadOnlySharedMemoryBase : 0x7f6f0000 Void
    109. +0x050 ReadOnlySharedMemoryHeap : 0x7f6f0000 Void
    110. +0x054 ReadOnlyStaticServerData : 0x7f6f0688 -> (null)
    111. +0x058 AnsiCodePageData : 0x7ffa0000 Void
    112. +0x05c OemCodePageData : 0x7ffa0000 Void
    113. +0x060 UnicodeCaseTableData : 0x7ffd1000 Void
    114. +0x064 NumberOfProcessors : 1
    115. +0x068 NtGlobalFlag : 0x70 //NtGlobalFlag 也是类似于BeingDebugged的一个标志,在Peb中取出。如果是调试状态下,NtGlobalFlag的值会是0x70,正常情况下不是。之前是利用fs寄存器获得的Peb基地址,这里使用Native API 的方法。
    116. +0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
    117. +0x078 HeapSegmentReserve : 0x100000 //堆的默认保留大小
    118. +0x07c HeapSegmentCommit : 0x2000 //堆的默认提交大小
    119. +0x080 HeapDeCommitTotalFreeThreshold : 0x10000 //解除提交的总空闲块阈
    120. +0x084 HeapDeCommitFreeBlockThreshold : 0x1000 //解除提交的单块阈值
    121. +0x088 NumberOfHeaps : 3 //进程堆的数量
    122. +0x08c MaximumNumberOfHeaps : 0x10 //ProcessHeaps数组目前的大小
    123. +0x090 ProcessHeaps : 0x7c99cfc0 -> 0x00150000 Void //一个数组,记录了每一个堆的地址
    124. +0x094 GdiSharedHandleTable : (null)
    125. +0x098 ProcessStarterHelper : (null)
    126. +0x09c GdiDCAttributeList : 0
    127. +0x0a0 LoaderLock : 0x7c99b178 Void
    128. +0x0a4 OSMajorVersion : 5
    129. +0x0a8 OSMinorVersion : 1
    130. +0x0ac OSBuildNumber : 0xa28
    131. +0x0ae OSCSDVersion : 0x300
    132. +0x0b0 OSPlatformId : 2
    133. +0x0b4 ImageSubsystem : 2
    134. +0x0b8 ImageSubsystemMajorVersion : 5
    135. +0x0bc ImageSubsystemMinorVersion : 0
    136. +0x0c0 ImageProcessAffinityMask : 0
    137. +0x0c4 GdiHandleBuffer : [34] 0
    138. +0x14c PostProcessInitRoutine : (null)
    139. +0x150 TlsExpansionBitmap : 0x7c99d5b8 Void
    140. +0x154 TlsExpansionBitmapBits : [32] 0
    141. +0x1d4 SessionId : 0
    142. +0x1d8 AppCompatFlags : _ULARGE_INTEGER 0x0
    143. +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER 0x0
    144. +0x1e8 pShimData : (null)
    145. +0x1ec AppCompatInfo : (null)
    146. +0x1f0 CSDVersion : _UNICODE_STRING "Service Pack 3"
    147. +0x1f8 ActivationContextData : 0x00140000 Void
    148. +0x1fc ProcessAssemblyStorageMap : 0x001529a8 Void
    149. +0x200 SystemDefaultActivationContextData : 0x00130000 Void
    150. +0x204 SystemAssemblyStorageMap : (null)
    151. +0x208 MinimumStackCommit : 0

    转自:liutianheng654.《PEB结构块解析》. 地址 . https://blog.csdn.net/liutianheng654/article/details/64923350