【调试技术】用户态查看PEB和TEB

概述:适合新手阅读!用户态查看进程 PEB 和 TEB(通过windbg附加或启动调试的exe)

旁白:😅虽然目前 windows 有很多工具可以帮助查看 TEB 和 PEB ,但通过 windbg 去查看可以帮助我们了解 windows 重要结构体的同时,也能加强 windbg 的使用。本篇文章也算是有一点意义的。

0x01 用户态查看 TEB 和 PEB

在双机调试的时候,可以直接使用 !PEB PID!TEB TID 获取进程和线程的相关信息,在用户态这两个命令就会失效。原因就是用户态不支持大写!TEB!PEB 命令。

在用户态调试时获取 tebpeb 的命令是小写的。

windbg 复制代码
 #获取 peb
 !peb
 ​
 # 获取 teb
 !teb

除此之外,这里提供另外一种思路。我们都知道 TEB 结构体中保存了PEB 的地址,因此可以通过TEB获取PEB的相关信息。

这里以 notepad.exe 为例演示。

0x02 演示

准备步骤

  1. 运行 notepad.exeWin+R 输入 notepad 回车即可。
  2. 运行 windbg,并附加到进程 notepad.exe 上。

开始调试

查看当前线程

使用 ~. 查看当前线程(这里其实查看哪个线程都可以,因为当前进程的 PEB 只有一个,所有的 TEB 都指向了同一个 PEB)

yaml 复制代码
 0:007> ~.
 .  7  Id: b8f4.d5a0 Suspend: 1 Teb: 000000a3`b61d1000 Unfrozen
       Start: ntdll!DbgUiRemoteBreakin (00007ff9`ab83c9c0)
       Priority: 0  Priority class: 32  Affinity: ff

可以看到 Teb 地址为 000000a3`b61d1000

查看TEB

windbg 复制代码
 dt ntdll!_Teb 000000a3`b61d1000

输出如下所示,可以看到 0x060 偏移处为 _PEB

windbg 复制代码
 ​
 ​
 0:007> dt ntdll!_Teb 000000a3`b61d1000
    +0x000 NtTib            : _NT_TIB
    +0x038 EnvironmentPointer : (null) 
    +0x040 ClientId         : _CLIENT_ID
    +0x050 ActiveRpcHandle  : (null) 
    +0x058 ThreadLocalStoragePointer : (null) 
    +0x060 ProcessEnvironmentBlock : 0x000000a3`b61b8000 _PEB
    +0x068 LastErrorValue   : 0
    +0x06c CountOfOwnedCriticalSections : 0
    +0x070 CsrClientThread  : (null) 
    +0x078 Win32ThreadInfo  : (null) 
    +0x080 User32Reserved   : [26] 0
    +0x0e8 UserReserved     : [5] 0
    +0x100 WOW32Reserved    : (null) 
    +0x108 CurrentLocale    : 0x804
    +0x10c FpSoftwareStatusRegister : 0
    +0x110 ReservedForDebuggerInstrumentation : [16] (null) 
    +0x190 SystemReserved1  : [30] (null) 
    +0x280 PlaceholderCompatibilityMode : 0 ''
    +0x281 PlaceholderHydrationAlwaysExplicit : 0 ''
    +0x282 PlaceholderReserved : [10]  ""
    +0x28c ProxiedProcessId : 0
    +0x290 _ActivationStack : _ACTIVATION_CONTEXT_STACK
    +0x2b8 WorkingOnBehalfTicket : [8]  ""
    +0x2c0 ExceptionCode    : 0n0
    +0x2c4 Padding0         : [4]  ""
    +0x2c8 ActivationContextStackPointer : 0x000000a3`b61d1290 _ACTIVATION_CONTEXT_STACK
    +0x2d0 InstrumentationCallbackSp : 0
    +0x2d8 InstrumentationCallbackPreviousPc : 0
    +0x2e0 InstrumentationCallbackPreviousSp : 0
    +0x2e8 TxFsContext      : 0xfffe
    +0x2ec InstrumentationCallbackDisabled : 0 ''
    +0x2ed UnalignedLoadStoreExceptions : 0 ''
    +0x2ee Padding1         : [2]  ""
    +0x2f0 GdiTebBatch      : _GDI_TEB_BATCH
    +0x7d8 RealClientId     : _CLIENT_ID
    +0x7e8 GdiCachedProcessHandle : (null) 
    +0x7f0 GdiClientPID     : 0
    +0x7f4 GdiClientTID     : 0
    +0x7f8 GdiThreadLocalInfo : (null) 
    +0x800 Win32ClientInfo  : [62] 0
    +0x9f0 glDispatchTable  : [233] (null) 
    +0x1138 glReserved1      : [29] 0
    +0x1220 glReserved2      : (null) 
    +0x1228 glSectionInfo    : (null) 
    +0x1230 glSection        : (null) 
    +0x1238 glTable          : (null) 
    +0x1240 glCurrentRC      : (null) 
    +0x1248 glContext        : (null) 
    +0x1250 LastStatusValue  : 0
    +0x1254 Padding2         : [4]  ""
    +0x1258 StaticUnicodeString : _UNICODE_STRING ""
    +0x1268 StaticUnicodeBuffer : [261]  ""
    +0x1472 Padding3         : [6]  ""
    +0x1478 DeallocationStack : 0x000000a3`b6400000 Void
    +0x1480 TlsSlots         : [64] (null) 
    +0x1680 TlsLinks         : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
    +0x1690 Vdm              : (null) 
    +0x1698 ReservedForNtRpc : (null) 
    +0x16a0 DbgSsReserved    : [2] (null) 
    +0x16b0 HardErrorMode    : 0
    +0x16b4 Padding4         : [4]  ""
    +0x16b8 Instrumentation  : [11] (null) 
    +0x1710 ActivityId       : _GUID {00000000-0000-0000-0000-000000000000}
    +0x1720 SubProcessTag    : (null) 
    +0x1728 PerflibData      : (null) 
    +0x1730 EtwTraceData     : (null) 
    +0x1738 WinSockData      : (null) 
    +0x1740 GdiBatchCount    : 0
    +0x1744 CurrentIdealProcessor : _PROCESSOR_NUMBER
    +0x1744 IdealProcessorValue : 0x3030000
    +0x1744 ReservedPad0     : 0 ''
    +0x1745 ReservedPad1     : 0 ''
    +0x1746 ReservedPad2     : 0x3 ''
    +0x1747 IdealProcessor   : 0x3 ''
    +0x1748 GuaranteedStackBytes : 0
    +0x174c Padding5         : [4]  ""
    +0x1750 ReservedForPerf  : (null) 
    +0x1758 ReservedForOle   : (null) 
    +0x1760 WaitingOnLoaderLock : 0
    +0x1764 Padding6         : [4]  ""
    +0x1768 SavedPriorityState : (null) 
    +0x1770 ReservedForCodeCoverage : 0
    +0x1778 ThreadPoolData   : (null) 
    +0x1780 TlsExpansionSlots : (null) 
    +0x1788 DeallocationBStore : (null) 
    +0x1790 BStoreLimit      : (null) 
    +0x1798 MuiGeneration    : 0
    +0x179c IsImpersonating  : 0
    +0x17a0 NlsCache         : (null) 
    +0x17a8 pShimData        : (null) 
    +0x17b0 HeapData         : 0
    +0x17b4 Padding7         : [4]  ""
    +0x17b8 CurrentTransactionHandle : (null) 
    +0x17c0 ActiveFrame      : (null) 
    +0x17c8 FlsData          : (null) 
    +0x17d0 PreferredLanguages : (null) 
    +0x17d8 UserPrefLanguages : (null) 
    +0x17e0 MergedPrefLanguages : (null) 
    +0x17e8 MuiImpersonation : 0
    +0x17ec CrossTebFlags    : 0
    +0x17ec SpareCrossTebBits : 0y0000000000000000 (0)
    +0x17ee SameTebFlags     : 8
    +0x17ee SafeThunkCall    : 0y0
    +0x17ee InDebugPrint     : 0y0
    +0x17ee HasFiberData     : 0y0
    +0x17ee SkipThreadAttach : 0y1
    +0x17ee WerInShipAssertCode : 0y0
    +0x17ee RanProcessInit   : 0y0
    +0x17ee ClonedThread     : 0y0
    +0x17ee SuppressDebugMsg : 0y0
    +0x17ee DisableUserStackWalk : 0y0
    +0x17ee RtlExceptionAttached : 0y0
    +0x17ee InitialThread    : 0y0
    +0x17ee SessionAware     : 0y0
    +0x17ee LoadOwner        : 0y0
    +0x17ee LoaderWorker     : 0y0
    +0x17ee SkipLoaderInit   : 0y0
    +0x17ee SpareSameTebBits : 0y0
    +0x17f0 TxnScopeEnterCallback : (null) 
    +0x17f8 TxnScopeExitCallback : (null) 
    +0x1800 TxnScopeContext  : (null) 
    +0x1808 LockCount        : 0
    +0x180c WowTebOffset     : 0n0
    +0x1810 ResourceRetValue : (null) 
    +0x1818 ReservedForWdf   : (null) 
    +0x1820 ReservedForCrt   : 0
    +0x1828 EffectiveContainerId : _GUID {00000000-0000-0000-0000-000000000000}

查看PEB

windbg 复制代码
 dt ntdll!_PEB 0xa3b61b8000
 ​
 # 或者使用 dx 命令
 dx -r1 ((ntdll!_PEB *)0xa3b61b8000)

输出如下所示,到此就看到了 notepad 的 PEB 了。后文补充了 PEB 结构体中 ProcessParameters 变量的分析和查看。

windbg 复制代码
 0:007> dt ntdll!_PEB 0xa3b61b8000
    +0x000 InheritedAddressSpace : 0 ''
    +0x001 ReadImageFileExecOptions : 0 ''
    +0x002 BeingDebugged    : 0x1 ''
    +0x003 BitField         : 0x84 ''
    +0x003 ImageUsesLargePages : 0y0
    +0x003 IsProtectedProcess : 0y0
    +0x003 IsImageDynamicallyRelocated : 0y1
    +0x003 SkipPatchingUser32Forwarders : 0y0
    +0x003 IsPackagedProcess : 0y0
    +0x003 IsAppContainer   : 0y0
    +0x003 IsProtectedProcessLight : 0y0
    +0x003 IsLongPathAwareProcess : 0y1
    +0x004 Padding0         : [4]  ""
    +0x008 Mutant           : 0xffffffff`ffffffff Void
    +0x010 ImageBaseAddress : 0x00007ff7`7ef80000 Void
    +0x018 Ldr              : 0x00007ff9`ab8db4c0 _PEB_LDR_DATA
    +0x020 ProcessParameters : 0x000001a6`50d52540 _RTL_USER_PROCESS_PARAMETERS
    +0x028 SubSystemData    : 0x00007ff9`9f7af1d0 Void
    +0x030 ProcessHeap      : 0x000001a6`50d50000 Void
    +0x038 FastPebLock      : 0x00007ff9`ab8db0e0 _RTL_CRITICAL_SECTION
    +0x040 AtlThunkSListPtr : (null) 
    +0x048 IFEOKey          : (null) 
    +0x050 CrossProcessFlags : 1
    +0x050 ProcessInJob     : 0y1
    +0x050 ProcessInitializing : 0y0
    +0x050 ProcessUsingVEH  : 0y0
    +0x050 ProcessUsingVCH  : 0y0
    +0x050 ProcessUsingFTH  : 0y0
    +0x050 ProcessPreviouslyThrottled : 0y0
    +0x050 ProcessCurrentlyThrottled : 0y0
    +0x050 ProcessImagesHotPatched : 0y0
    +0x050 ReservedBits0    : 0y000000000000000000000000 (0)
    +0x054 Padding1         : [4]  ""
    +0x058 KernelCallbackTable : 0x00007ff9`a9a80070 Void
    +0x058 UserSharedInfoPtr : 0x00007ff9`a9a80070 Void
    +0x060 SystemReserved   : 0
    +0x064 AtlThunkSListPtr32 : 0
    +0x068 ApiSetMap        : 0x000001a6`50c80000 Void
    +0x070 TlsExpansionCounter : 0
    +0x074 Padding2         : [4]  ""
    +0x078 TlsBitmap        : 0x00007ff9`ab8db440 Void
    +0x080 TlsBitmapBits    : [2] 0xffffffff
    +0x088 ReadOnlySharedMemoryBase : 0x00007df4`3dce0000 Void
    +0x090 SharedData       : (null) 
    +0x098 ReadOnlyStaticServerData : 0x00007df4`3dce0750  -> (null) 
    +0x0a0 AnsiCodePageData : 0x00007df5`3fe30000 Void
    +0x0a8 OemCodePageData  : 0x00007df5`3fe30000 Void
    +0x0b0 UnicodeCaseTableData : 0x00007df5`3fe60028 Void
    +0x0b8 NumberOfProcessors : 8
    +0x0bc NtGlobalFlag     : 0
    +0x0c0 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
    +0x0c8 HeapSegmentReserve : 0x100000
    +0x0d0 HeapSegmentCommit : 0x2000
    +0x0d8 HeapDeCommitTotalFreeThreshold : 0x10000
    +0x0e0 HeapDeCommitFreeBlockThreshold : 0x1000
    +0x0e8 NumberOfHeaps    : 6
    +0x0ec MaximumNumberOfHeaps : 0x10
    +0x0f0 ProcessHeaps     : 0x00007ff9`ab8d9d40  -> 0x000001a6`50d50000 Void
    +0x0f8 GdiSharedHandleTable : 0x000001a6`51120000 Void
    +0x100 ProcessStarterHelper : (null) 
    +0x108 GdiDCAttributeList : 0x14
    +0x10c Padding3         : [4]  ""
    +0x110 LoaderLock       : 0x00007ff9`ab8d55c8 _RTL_CRITICAL_SECTION
    +0x118 OSMajorVersion   : 0xa
    +0x11c OSMinorVersion   : 0
    +0x120 OSBuildNumber    : 0x4a65
    +0x122 OSCSDVersion     : 0
    +0x124 OSPlatformId     : 2
    +0x128 ImageSubsystem   : 2
    +0x12c ImageSubsystemMajorVersion : 0xa
    +0x130 ImageSubsystemMinorVersion : 0
    +0x134 Padding4         : [4]  ""
    +0x138 ActiveProcessAffinityMask : 0xff
    +0x140 GdiHandleBuffer  : [60] 0
    +0x230 PostProcessInitRoutine : (null) 
    +0x238 TlsExpansionBitmap : 0x00007ff9`ab8db420 Void
    +0x240 TlsExpansionBitmapBits : [32] 1
    +0x2c0 SessionId        : 1
    +0x2c4 Padding5         : [4]  ""
    +0x2c8 AppCompatFlags   : _ULARGE_INTEGER 0x0
    +0x2d0 AppCompatFlagsUser : _ULARGE_INTEGER 0x0
    +0x2d8 pShimData        : 0x000001a6`50cc0000 Void
    +0x2e0 AppCompatInfo    : (null) 
    +0x2e8 CSDVersion       : _UNICODE_STRING ""
    +0x2f8 ActivationContextData : 0x000001a6`50cb0000 _ACTIVATION_CONTEXT_DATA
    +0x300 ProcessAssemblyStorageMap : 0x000001a6`50d5b5c0 _ASSEMBLY_STORAGE_MAP
    +0x308 SystemDefaultActivationContextData : 0x000001a6`50ca0000 _ACTIVATION_CONTEXT_DATA
    +0x310 SystemAssemblyStorageMap : (null) 
    +0x318 MinimumStackCommit : 0
    +0x320 SparePointers    : [4] (null) 
    +0x340 SpareUlongs      : [5] 0
    +0x358 WerRegistrationData : 0x000001a6`52e00000 Void
    +0x360 WerShipAssertPtr : (null) 
    +0x368 pUnused          : (null) 
    +0x370 pImageHeaderHash : (null) 
    +0x378 TracingFlags     : 0
    +0x378 HeapTracingEnabled : 0y0
    +0x378 CritSecTracingEnabled : 0y0
    +0x378 LibLoaderTracingEnabled : 0y0
    +0x378 SpareTracingBits : 0y00000000000000000000000000000 (0)
    +0x37c Padding6         : [4]  ""
    +0x380 CsrServerReadOnlySharedMemoryBase : 0x00007df4`66cb0000
    +0x388 TppWorkerpListLock : 0
    +0x390 TppWorkerpList   : _LIST_ENTRY [ 0x000000a3`b5f0f860 - 0x000000a3`b63ffb70 ]
    +0x3a0 WaitOnAddressHashTable : [128] (null) 
    +0x7a0 TelemetryCoverageHeader : (null) 
    +0x7a8 CloudFileFlags   : 0xe0
    +0x7ac CloudFileDiagFlags : 0
    +0x7b0 PlaceholderCompatibilityMode : 2 ''
    +0x7b1 PlaceholderCompatibilityModeReserved : [7]  ""
    +0x7b8 LeapSecondData   : 0x00007df5`3fe20000 _LEAP_SECOND_DATA
    +0x7c0 LeapSecondFlags  : 0
    +0x7c0 SixtySecondEnabled : 0y0
    +0x7c0 Reserved         : 0y0000000000000000000000000000000 (0)
    +0x7c4 NtGlobalFlag2    : 0

查看 ProcessParameters

为了进一步了解和查看,这里再查看 ProcessParameters 的变量。

查看 PEB 的输出可以看到 ProcessParameters 的结构体名为 _RTL_USER_PROCESS_PARAMETERS,该结构体保存了进程很多基础信息,如环境变量、命令行等等。查看当前 ProcessParameters

windbg 复制代码
 dx -r1 ((ntdll!_RTL_USER_PROCESS_PARAMETERS *)0x1a650d52540)
 ​
 # 或者
 ​
 dt _RTL_USER_PROCESS_PARAMETERS 0x1a650d52540

输出如下所示:

windbg 复制代码
 0:007> dt _RTL_USER_PROCESS_PARAMETERS 0x1a650d52540
 ntdll!_RTL_USER_PROCESS_PARAMETERS
    +0x000 MaximumLength    : 0x78a
    +0x004 Length           : 0x78a
    +0x008 Flags            : 0x6001
    +0x00c DebugFlags       : 0
    +0x010 ConsoleHandle    : (null) 
    +0x018 ConsoleFlags     : 0
    +0x020 StandardInput    : (null) 
    +0x028 StandardOutput   : (null) 
    +0x030 StandardError    : (null) 
    +0x038 CurrentDirectory : _CURDIR
    +0x050 DllPath          : _UNICODE_STRING ""
    +0x060 ImagePathName    : _UNICODE_STRING "C:\WINDOWS\system32\notepad.exe"
    +0x070 CommandLine      : _UNICODE_STRING ""C:\WINDOWS\system32\notepad.exe" "
    +0x080 Environment      : 0x000001a6`50d50fe0 Void
    +0x088 StartingX        : 0
    +0x08c StartingY        : 0
    +0x090 CountX           : 0
    +0x094 CountY           : 0
    +0x098 CountCharsX      : 0
    +0x09c CountCharsY      : 0
    +0x0a0 FillAttribute    : 0
    +0x0a4 WindowFlags      : 0x801
    +0x0a8 ShowWindowFlags  : 1
    +0x0b0 WindowTitle      : _UNICODE_STRING "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Notepad.lnk"
    +0x0c0 DesktopInfo      : _UNICODE_STRING "Winsta0\Default"
    +0x0d0 ShellInfo        : _UNICODE_STRING ""
    +0x0e0 RuntimeData      : _UNICODE_STRING ""
    +0x0f0 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
    +0x3f0 EnvironmentSize  : 0x154e
    +0x3f8 EnvironmentVersion : 3
    +0x400 PackageDependencyData : (null) 
    +0x408 ProcessGroupId   : 0x3ec
    +0x40c LoaderThreads    : 0
    +0x410 RedirectionDllName : _UNICODE_STRING ""
    +0x420 HeapPartitionName : _UNICODE_STRING ""
    +0x430 DefaultThreadpoolCpuSetMasks : (null) 
    +0x438 DefaultThreadpoolCpuSetMaskCount : 0
    +0x43c DefaultThreadpoolThreadMaximum : 0

到这一步,基本上进程的详细信息就都可以看到了。如果是 windbg preview 版本,点几下就能看到一些信息,但是 Environment 环境变量是一个指针,如果需要查看,还是需要输入命令才行。

查看 Environment

_RTL_USER_PROCESS_PARAMETERS 结构中有三个成员与 Environment 相关

windbg 复制代码
 # 指向环境变量的指针
 +0x080 Environment      : 0x000001a6`50d50fe0 Void
 ​
 # 环境变量的大小
 +0x3f0 EnvironmentSize  : 0x154e
 ​
 # 环境变量的版本
 +0x3f8 EnvironmentVersion : 3

通过环境变量指针和大小我们就可以看到环境变量的内容了

windbg 复制代码
 db 0x000001a6`50d50fe0 l 0x154e
相关推荐
非凡ghost5 小时前
猫眼浏览器(Chrome内核增强版浏览器)官方便携版
前端·网络·chrome·windows·软件需求
熊文豪10 小时前
Windows安装RabbitMQ保姆级教程
windows·分布式·rabbitmq·安装rabbitmq
搬砖的小码农_Sky11 小时前
Windows操作系统上`ping`命令的用法详解
运维·网络·windows
Kiri霧18 小时前
Rust模式匹配详解
开发语言·windows·rust
程序设计实验室20 小时前
使用命令行删除 Windows 网络映射驱动器
windows
用户31187945592181 天前
Windows 电脑安装 XTerminal 1.25.1 x64 版(带安装包下载关键词)
windows
Logintern091 天前
windows如何设置mongodb的副本集
数据库·windows·mongodb
Chandler241 天前
一图掌握 操作系统 核心要点
linux·windows·后端·系统
ajassi20001 天前
开源 C# 快速开发(十七)进程--消息队列MSMQ
windows·开源·c#
Python私教1 天前
5分钟上手 MongoDB:从零安装到第一条数据插入(Windows / macOS / Linux 全平台图解)
windows·mongodb·macos