笔记
学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师
微信 i-xiaodi
作业讲解
PEB
(Process Environment Block)是每个进程在 Windows 系统中都有的一个数据结构,包含了与进程有关的重要信息。Windows 内核将其保存在进程的虚拟地址空间中,通常位于进程的基址附近。PEB
结构在进程的生命周期中是唯一的。
下面是 PEB
的结构描述,并使用偏移量的形式列出各个字段:
PEB
结构(偏移形式):
typedef struct _PEB {
UCHAR InheritedAddressSpace; // +0x000 是否继承地址空间
UCHAR ReadImageFileExecOptions; // +0x001 读取映像文件执行选项
UCHAR BeingDebugged; // +0x002 是否正在调试
UCHAR Spare; // +0x003 保留字段
ULONG Mutant; // +0x004 进程的 Mutant
ULONG ImageBaseAddress; // +0x008 映像基地址
ULONG Ldr; // +0x00C 加载器的地址
ULONG ProcessParameters; // +0x010 进程参数(指向 `RTL_USER_PROCESS_PARAMETERS`)
ULONG SubSystemData; // +0x014 子系统数据
ULONG ProcessHeap; // +0x018 进程堆
ULONG FastPebLock; // +0x01C 快速 PEB 锁
ULONG FastPebLockRoutine; // +0x020 快速 PEB 锁例程
ULONG FastPebUnlockRoutine; // +0x024 快速 PEB 解锁例程
ULONG EnvironmentUpdateCount; // +0x028 环境更新计数
ULONG KernelCallbackTable; // +0x02C 内核回调表
ULONG SystemReserved; // +0x030 系统保留区域
ULONG Spare2; // +0x034 保留字段
ULONG FreeList; // +0x038 空闲列表
ULONG TlsExpansionCounter; // +0x03C TLS 扩展计数器
ULONG TlsBitmap; // +0x040 TLS 位图
ULONG TlsBitmapBits[2]; // +0x044 TLS 位图位
ULONG ReadOnlySharedMemoryBase; // +0x04C 只读共享内存基址
ULONG HotpatchInformation; // +0x050 热补丁信息
ULONG ReadOnlyStaticServerData; // +0x054 只读静态服务器数据
ULONG AnsiCodePageData; // +0x058 ANSI 代码页数据
ULONG OemCodePageData; // +0x05C OEM 代码页数据
ULONG UnicodeCaseTableData; // +0x060 Unicode 大小写转换表
ULONG NumberOfProcessors; // +0x064 处理器数量
// 以下字段通常位于更高的内存偏移
ULONG NtGlobalFlag; // +0x068 NtGlobalFlag
ULONG CriticalSectionTimeout; // +0x06C 临界区超时
ULONG HeapSegmentReserve; // +0x070 堆段保留空间
ULONG HeapSegmentCommit; // +0x074 堆段提交空间
ULONG HeapDeCommitTotalFreeThreshold; // +0x078 堆释放阈值
ULONG HeapDeCommitFreeBlockThreshold; // +0x07C 堆释放块阈值
ULONG NumberOfHeaps; // +0x080 堆的数量
ULONG MaximumNumberOfHeaps; // +0x084 最大堆数量
ULONG ProcessHeaps; // +0x088 进程堆数组
ULONG GdiSharedHandleTable; // +0x08C GDI 共享句柄表
ULONG ProcessStarterHelper; // +0x090 进程启动助手
ULONG GdiDCAttributeList; // +0x094 GDI DC 属性列表
ULONG LoaderLock; // +0x098 加载器锁
ULONG OSMajorVersion; // +0x09C 操作系统主版本
ULONG OSMinorVersion; // +0x0A0 操作系统次版本
ULONG OSBuildNumber; // +0x0A4 操作系统构建号
ULONG OSPlatformId; // +0x0A8 操作系统平台标识
ULONG ImageSubsystem; // +0x0AC 映像子系统标识
ULONG ImageSubsystemMajorVersion; // +0x0B0 映像子系统主版本
ULONG ImageSubsystemMinorVersion; // +0x0B4 映像子系统次版本
ULONG ImageProcessAffinityMask; // +0x0B8 映像进程亲和性掩码
ULONG GdiHandleBuffer[34]; // +0x0BC GDI 句柄缓冲区
ULONG PostProcessInitRoutine; // +0x100 后处理初始化例程
ULONG TlsExpansionBitmap; // +0x104 TLS 扩展位图
ULONG TlsExpansionBitmapBits[32]; // +0x108 TLS 扩展位图的实际位
ULONG SessionId; // +0x148 会话 ID
} PEB;
总结
附加调试
UCHAR BeingDebugged; // +0x002 是否正在调试 == 0x1
ULONG NtGlobalFlag; // +0x068 NtGlobalFlag 不影响
拖入调试
UCHAR BeingDebugged; // +0x002 是否正在调试 == 0x1
ULONG NtGlobalFlag; // +0x068 NtGlobalFlag 0x70
重要字段:
InheretAddressSpace
、BeingDebugged
等标志字段控制进程的不同状态。Ldr
指向进程加载器数据,记录进程已加载模块的列表(DLL、EXE 文件等)。ProcessParameters
指向进程的启动参数,包含了命令行、环境变量、启动路径等信息。KernelCallbackTable
、EventLogSection
等字段包含内核与进程间的调用数据。