我是靠谱客的博主 任性保温杯,最近开发中收集的这篇文章主要介绍PEB结构块解析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

0:000> !peb
PEB at 7ffdd000
InheritedAddressSpace:
No
ReadImageFileExecOptions: No
BeingDebugged:
Yes
ImageBaseAddress:
00400000
Ldr
00251ea0
Ldr.Initialized:
Yes
Ldr.InInitializationOrderModuleList: 00251f58 . 00252798
Ldr.InLoadOrderModuleList:
00251ee0 . 00252848
Ldr.InMemoryOrderModuleList:
00251ee8 . 00252850
Base TimeStamp
Module
400000 4ffadf89 Jul 09 21:41:29 2012 C:Documents and SettingsAdministratorcsnbes_1.0.0.8.exe
7c920000 4802bdc5 Apr 14 10:13:25 2008 C:WINDOWSsystem32ntdll.dll
7c800000 4802bdc6 Apr 14 10:13:26 2008 C:WINDOWSsystem32kernel32.dll
770f0000 4802bdbd Apr 14 10:13:17 2008 C:WINDOWSsystem32oleaut32.dll
77da0000 4802bd89 Apr 14 10:12:25 2008 C:WINDOWSsystem32ADVAPI32.dll
77e50000 4802bdae Apr 14 10:13:02 2008 C:WINDOWSsystem32RPCRT4.dll
77fc0000 4802bdc1 Apr 14 10:13:21 2008 C:WINDOWSsystem32Secur32.dll
77ef0000 4802bd81 Apr 14 10:12:17 2008 C:WINDOWSsystem32GDI32.dll
77d10000 4802bdbd Apr 14 10:13:17 2008 C:WINDOWSsystem32USER32.dll
77be0000 4802be3f Apr 14 10:15:27 2008 C:WINDOWSsystem32msvcrt.dll
76990000 4802bdbc Apr 14 10:13:16 2008 C:WINDOWSsystem32ole32.dll
77180000 4802bd6c Apr 14 10:11:56 2008 C:WINDOWSWinSxSx86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83comctl32.dll
77f40000 4802bdbb Apr 14 10:13:15 2008 C:WINDOWSsystem32SHLWAPI.dll
SubSystemData:
00000000
ProcessHeap:
00150000
ProcessParameters: 00020000
CurrentDirectory:
'C:Program FilesDebugging Tools for Windows (x86)'
WindowTitle:
'C:Documents and SettingsAdministratorcsnbes_1.0.0.8.exe'
ImageFile:
'C:Documents and SettingsAdministratorcsnbes_1.0.0.8.exe'
CommandLine:
'"C:Documents and SettingsAdministratorcsnbes_1.0.0.8.exe"'
DllPath:
'C:Documents and SettingsAdministrator面;C:WINDOWSsystem32;C:WINDOWSsystem;C:WINDOWS;.;C:Program FilesDebugging Tools for Windows (x86)winextarcade;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem'
Environment:
00010000
=::=::

ALLUSERSPROFILE=C:Documents and SettingsAll Users
APPDATA=C:Documents and SettingsAdministratorApplication Data
CLIENTNAME=Console
CommonProgramFiles=C:Program FilesCommon Files
COMPUTERNAME=BITGHOST
ComSpec=C:WINDOWSsystem32cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=Documents and SettingsAdministrator
LOGONSERVER=\BITGHOST
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Path=C:Program FilesDebugging Tools for Windows (x86)winextarcade;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 60 Stepping 3, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3c03
ProgramFiles=C:Program Files
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:WINDOWS
TEMP=C:DOCUME~1ADMINI~1LOCALS~1Temp
TMP=C:DOCUME~1ADMINI~1LOCALS~1Temp
USERDOMAIN=BITGHOST
USERNAME=Administrator
USERPROFILE=C:Documents and SettingsAdministrator
WINDBG_DIR=C:Program FilesDebugging Tools for Windows (x86)
windir=C:WINDOWS

详细解释如下:


0:000> dt nt!_peb 7ffdd000
ntdll!_PEB
+0x000 InheritedAddressSpace : 0 ''
+0x001 ReadImageFileExecOptions : 0 ''
+0x002 BeingDebugged
: 0x1 ''
 //判断进程是否被调试,true为被调试
+0x003 SpareBool
: 0 ''
+0x004 Mutant
: 0xffffffff Void
+0x008 ImageBaseAddress : 0x00400000 Void
 //进程映像基址,就是PE中的IMAGE_OPTIONAL_HEADER->ImageBase对应的值。对于EXE来说,默认的ImageBase为0x400000;对于DLL来说,它是0x10000000,当打开ASLR时应该会变,**待验证**
----------
+0x00c Ldr
: 0x00251ea0 _PEB_LDR_DATA
LoaderData域是PEB中一个很重要的成员域,它是一个指向PEB_LDR_DATA结构体的指针。它由PE Loader(加载器)填充,也就说,在这个指针指向的结构中,可以找到很多在PE中包含的信息。另外,我们在做Buffer OverFlow的时候经常会遇到这个数据结构,枚举用户进程加载的模块就和它密切相关。我们扩展出去,详细学习一下这个结构。
0:000> dt _PEB_LDR_DATA 0x00251ea0
ntdll!_PEB_LDR_DATA
+0x000 Length
: 0x28
 //结构长度
+0x004 Initialized
: 0x1 ''
 //进程是否初始化完成
+0x008 SsHandle
: (null)
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x251ee0 - 0x252848 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x251ee8 - 0x252850 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x251f58 - 0x252798 ]
 //nLoadOrderModuleList、InMemoryOrderModuleList、InInitializationOrderModuleList这三个域都是指向它们各自的双链表中的下一个LDR_MODULE的LIST_ENTRY
+0x024 EntryInProgress
: (null)
----------
+0x010 ProcessParameters : 0x00020000 _RTL_USER_PROCESS_PARAMETERS
 // ProcessParameters域是指向 RTL_USER_PROCESS_PARAMETERS 的指针,RTL_USER_PROCESS_PARAMETERS 中是一些进程的参数。如下:
0:000> dt _RTL_USER_PROCESS_PARAMETERS 0x00020000
ntdll!_RTL_USER_PROCESS_PARAMETERS
+0x000 MaximumLength
: 0x1000
 //
+0x004 Length
: 0x7e4
 //结构大小
+0x008 Flags
: 0x2001
 //是否由RtlNormalizeProcessParams标准化
+0x00c DebugFlags
: 0
+0x010 ConsoleHandle
: (null)
 //该进程的窗口句柄,如果有的话
+0x014 ConsoleFlags
: 0
+0x018 StandardInput
: (null)
+0x01c StandardOutput
: 0x00010001 Void
+0x020 StandardError
: (null)
+0x024 CurrentDirectory : _CURDIR
+0x030 DllPath
: _UNICODE_STRING "C:Documents and SettingsAdministrator桌面;C:WINDOWSsystem32;C:WINDOWSsystem;C:WINDOWS;.;C:Program FilesDebugging Tools for Windows (x86)winextarcade;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem"
+0x038 ImagePathName
: _UNICODE_STRING "C:Documents and SettingsAdministrator桌面csnbes_1.0.0.8.exe"
+0x040 CommandLine
: _UNICODE_STRING ""C:Documents and SettingsAdministrator桌面csnbes_1.0.0.8.exe""
+0x048 Environment
: 0x00010000 Void
+0x04c StartingX
: 0
+0x050 StartingY
: 0
+0x054 CountX
: 0
+0x058 CountY
: 0
+0x05c CountCharsX
: 0
+0x060 CountCharsY
: 0
+0x064 FillAttribute
: 0
+0x068 WindowFlags
: 0
+0x06c ShowWindowFlags
: 0
+0x070 WindowTitle
: _UNICODE_STRING "C:Documents and SettingsAdministrator桌面csnbes_1.0.0.8.exe"
+0x078 DesktopInfo
: _UNICODE_STRING "WinSta0Default"
+0x080 ShellInfo
: _UNICODE_STRING ""
+0x088 RuntimeData
: _UNICODE_STRING ""
+0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
----------
+0x014 SubSystemData
: (null)
+0x018 ProcessHeap
: 0x00150000 Void
 //域指向的是进程堆(默认的那个)的首地址,每个进程在新建的时都会由系统自动创建一个默认堆以供使用。这也就是为什么我们在程序中可以直接使用malloc来动态申请堆内存的时候不需要指定使用的是哪个堆。可用于反调试,进程堆标志,系统创建进程时会将Flags置为0x02(HEAP_GROWABLE),将ForceFlags置为0。但是进程被调试时,这两个标志通常被设置为0x50000062h和0x40000060h。
如下:0:000> dt _HEAP 0x00150000
ntdll!_HEAP
+0x000 Entry
: _HEAP_ENTRY
+0x008 Signature
: 0xeeffeeff
 //HEAP结构的签名
+0x00c Flags
: 0x50000062
+0x010 ForceFlags
: 0x40000060
+0x014 VirtualMemoryThreshold : 0xfe00
 //最大堆块大小
+0x018 SegmentReserve
: 0x100000
 //段的保留空间大小
+0x01c SegmentCommit
: 0x2000
 //每次提交内存的大小
+0x020 DeCommitFreeBlockThreshold : 0x200
 //解除提交的单块阈值
+0x024 DeCommitTotalFreeThreshold : 0x2000
 //解除提交的总空闲块阈值
+0x028 TotalFreeSize
: 0x98
 //空闲块的总大小
+0x02c MaximumAllocationSize : 0x7ffdefff
 //可分配的最大值
+0x030 ProcessHeapsListIndex : 1
 //本堆在进程堆列表中的索引
+0x032 HeaderValidateLength : 0x608
 //头结构的验证长度
+0x034 HeaderValidateCopy : (null)
+0x038 NextAvailableTagIndex : 0
 //下一个可用的堆块标记索引
+0x03a MaximumTagIndex
: 0
 //最大的堆块标记索引
+0x03c TagEntries
: (null)
 //指向用于标记堆块的标记结构
+0x040 UCRSegments
: (null)
 //UnCommitedRange Segments
+0x044 UnusedUnCommittedRanges : 0x00150598 _HEAP_UNCOMMMTTED_RANGE
+0x048 AlignRound
: 0x17
+0x04c AlignMask
: 0xfffffff8
 //用于地址对齐的掩码
+0x050 VirtualAllocdBlocks : _LIST_ENTRY [ 0x150050 - 0x150050 ]
+0x058 Segments
: [64] 0x00150640 _HEAP_SEGMENT
+0x158 u
: __unnamed
+0x168 u2
: __unnamed
+0x16a AllocatorBackTraceIndex : 0
+0x16c NonDedicatedListLength : 1
+0x170 LargeBlocksIndex : (null)
+0x174 PseudoTagEntries : (null)
+0x178 FreeLists
: [128] _LIST_ENTRY [ 0x152b48 - 0x152b48 ]
+0x578 LockVariable
: 0x00150608 _HEAP_LOCK
 //用于串行化控制的同步对象
+0x57c CommitRoutine
: (null)
+0x580 FrontEndHeap
: 0x00150688 Void
 //用于快速释放堆块的"前端堆"
+0x584 FrontHeapLockCount : 0
 //"前端堆"的锁定计数
+0x586 FrontEndHeapType : 0x1 ''
 //"前端堆"的类型
+0x587 LastSegmentIndex : 0 ''
----------
+0x01c FastPebLock
: 0x7c99d600 _RTL_CRITICAL_SECTION
 //FastPebLock域存放的是PEBLOCKROUTINE这个例程函数需要用到的参数。
+0x020 FastPebLockRoutine : 0x7c921000 Void
 //PEB加锁/解锁回调例程
+0x024 FastPebUnlockRoutine : 0x7c9210e0 Void
+0x028 EnvironmentUpdateCount : 1
 //进程的环境变量更改的次数
+0x02c KernelCallbackTable : (null) //KernelCallbackTable域用于从内核"回调"用户空间的函数。
+0x030 SystemReserved
: [1] 0
+0x034 AtlThunkSListPtr32 : 0
+0x038 FreeList
: (null)
+0x03c TlsExpansionCounter : 0
+0x040 TlsBitmap
: 0x7c99d5c0 Void
 //TlsBitmap域代表TLS位图
+0x044 TlsBitmapBits
: [2] 1
+0x04c ReadOnlySharedMemoryBase : 0x7f6f0000 Void
+0x050 ReadOnlySharedMemoryHeap : 0x7f6f0000 Void
+0x054 ReadOnlyStaticServerData : 0x7f6f0688
-> (null)
+0x058 AnsiCodePageData : 0x7ffa0000 Void
+0x05c OemCodePageData
: 0x7ffa0000 Void
+0x060 UnicodeCaseTableData : 0x7ffd1000 Void
+0x064 NumberOfProcessors : 1
+0x068 NtGlobalFlag
: 0x70
 //NtGlobalFlag 也是类似于BeingDebugged的一个标志,在Peb中取出。如果是调试状态下,NtGlobalFlag的值会是0x70,正常情况下不是。之前是利用fs寄存器获得的Peb基地址,这里使用Native API 的方法。
+0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
+0x078 HeapSegmentReserve : 0x100000
 //堆的默认保留大小
+0x07c HeapSegmentCommit : 0x2000
 //堆的默认提交大小
+0x080 HeapDeCommitTotalFreeThreshold : 0x10000
 //解除提交的总空闲块阈
+0x084 HeapDeCommitFreeBlockThreshold : 0x1000
 //解除提交的单块阈值
+0x088 NumberOfHeaps
: 3
 //进程堆的数量
+0x08c MaximumNumberOfHeaps : 0x10
 //ProcessHeaps数组目前的大小
+0x090 ProcessHeaps
: 0x7c99cfc0
-> 0x00150000 Void
 //一个数组,记录了每一个堆的地址
+0x094 GdiSharedHandleTable : (null)
+0x098 ProcessStarterHelper : (null)
+0x09c GdiDCAttributeList : 0
+0x0a0 LoaderLock
: 0x7c99b178 Void
+0x0a4 OSMajorVersion
: 5
+0x0a8 OSMinorVersion
: 1
+0x0ac OSBuildNumber
: 0xa28
+0x0ae OSCSDVersion
: 0x300
+0x0b0 OSPlatformId
: 2
+0x0b4 ImageSubsystem
: 2
+0x0b8 ImageSubsystemMajorVersion : 5
+0x0bc ImageSubsystemMinorVersion : 0
+0x0c0 ImageProcessAffinityMask : 0
+0x0c4 GdiHandleBuffer
: [34] 0
+0x14c PostProcessInitRoutine : (null)
+0x150 TlsExpansionBitmap : 0x7c99d5b8 Void
+0x154 TlsExpansionBitmapBits : [32] 0
+0x1d4 SessionId
: 0
+0x1d8 AppCompatFlags
: _ULARGE_INTEGER 0x0
+0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER 0x0
+0x1e8 pShimData
: (null)
+0x1ec AppCompatInfo
: (null)
+0x1f0 CSDVersion
: _UNICODE_STRING "Service Pack 3"
+0x1f8 ActivationContextData : 0x00140000 Void
+0x1fc ProcessAssemblyStorageMap : 0x001529a8 Void
+0x200 SystemDefaultActivationContextData : 0x00130000 Void
+0x204 SystemAssemblyStorageMap : (null)
+0x208 MinimumStackCommit : 0

暂时先写这么多吧,下午再写。。有什么更详细的留言告诉我呀,谢啦。。

最后

以上就是任性保温杯为你收集整理的PEB结构块解析的全部内容,希望文章能够帮你解决PEB结构块解析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部