x86/x64汇编基础11.汇编基础7:了解TEB、PEB与反调试

笔记

学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,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

重要字段:

  • InheretAddressSpaceBeingDebugged 等标志字段控制进程的不同状态。
  • Ldr 指向进程加载器数据,记录进程已加载模块的列表(DLL、EXE 文件等)。
  • ProcessParameters 指向进程的启动参数,包含了命令行、环境变量、启动路径等信息。
  • KernelCallbackTableEventLogSection 等字段包含内核与进程间的调用数据。

反调试技术

  • 图片[1]-x86/x64汇编基础11.汇编基础7:了解TEB、PEB与反调试-汇编语言社区论坛-技术社区-学技术网
请登录后发表评论