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 Settings\Administrator\桌\csnbes_1.0.0.8.exe
        7c920000 4802bdc5 Apr 14 10:13:25 2008 C:\WINDOWS\system32\ntdll.dll
        7c800000 4802bdc6 Apr 14 10:13:26 2008 C:\WINDOWS\system32\kernel32.dll
        770f0000 4802bdbd Apr 14 10:13:17 2008 C:\WINDOWS\system32\oleaut32.dll
        77da0000 4802bd89 Apr 14 10:12:25 2008 C:\WINDOWS\system32\ADVAPI32.dll
        77e50000 4802bdae Apr 14 10:13:02 2008 C:\WINDOWS\system32\RPCRT4.dll
        77fc0000 4802bdc1 Apr 14 10:13:21 2008 C:\WINDOWS\system32\Secur32.dll
        77ef0000 4802bd81 Apr 14 10:12:17 2008 C:\WINDOWS\system32\GDI32.dll
        77d10000 4802bdbd Apr 14 10:13:17 2008 C:\WINDOWS\system32\USER32.dll
        77be0000 4802be3f Apr 14 10:15:27 2008 C:\WINDOWS\system32\msvcrt.dll
        76990000 4802bdbc Apr 14 10:13:16 2008 C:\WINDOWS\system32\ole32.dll
        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
        77f40000 4802bdbb Apr 14 10:13:15 2008 C:\WINDOWS\system32\SHLWAPI.dll
    SubSystemData:     00000000
    ProcessHeap:       00150000
    ProcessParameters: 00020000
    CurrentDirectory:  'C:\Program Files\Debugging Tools for Windows (x86)\'
    WindowTitle:  'C:\Documents and Settings\Administrator\桌\csnbes_1.0.0.8.exe'
    ImageFile:    'C:\Documents and Settings\Administrator\桌\csnbes_1.0.0.8.exe'
    CommandLine:  '"C:\Documents and Settings\Administrator\桌\csnbes_1.0.0.8.exe"'
    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'
    Environment:  00010000
        =::=::\
        ALLUSERSPROFILE=C:\Documents and Settings\All Users
        APPDATA=C:\Documents and Settings\Administrator\Application Data
        CLIENTNAME=Console
        CommonProgramFiles=C:\Program Files\Common Files
        COMPUTERNAME=BITGHOST
        ComSpec=C:\WINDOWS\system32\cmd.exe
        FP_NO_HOST_CHECK=NO
        HOMEDRIVE=C:
        HOMEPATH=\Documents and Settings\Administrator
        LOGONSERVER=\\BITGHOST
        NUMBER_OF_PROCESSORS=1
        OS=Windows_NT
        Path=C:\Program Files\Debugging Tools for Windows (x86)\winext\arcade;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
        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~1\ADMINI~1\LOCALS~1\Temp
        TMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
        USERDOMAIN=BITGHOST
        USERNAME=Administrator
        USERPROFILE=C:\Documents and Settings\Administrator
        WINDBG_DIR=C:\Program Files\Debugging 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 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"
   +0x038 ImagePathName    : _UNICODE_STRING "C:\Documents and Settings\Administrator\桌面\csnbes_1.0.0.8.exe"
   +0x040 CommandLine      : _UNICODE_STRING ""C:\Documents and Settings\Administrator\桌面\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 Settings\Administrator\桌面\csnbes_1.0.0.8.exe"
   +0x078 DesktopInfo      : _UNICODE_STRING "WinSta0\Default"
   +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

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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值