Windbg查看进程的_EPROCESS结构

本文介绍如何使用Windbg查看进程的_EPROCESS结构地址,并通过notepad.exe为例演示具体步骤。文章还展示了如何利用_EPROCESS结构查找特定字段,如DebugPort的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近研究某驱动DebugPort清零,学习了使用Windbg查看_EPROCESS结构地址,采用Syser下断查找清零代码。

下面主要写下Windbg查看进程的_EPROCESS结构,便以后查阅。

大家知道,每一个进程都对应一个_EPROCESS结构,我们如何确定一个进程的_EPROCESS地址呢?以notepad.exe为例

使用Windbg的Kernel Debug,输入命令

lkd> !process 0 0    //查看当前进程
PROCESS 8a5e7088 SessionId: 0 Cid: 0ff0    Peb: 7ffdd000 ParentCid: 0324
    DirBase: 0ac40520 ObjectTable: e1a13a30 HandleCount: 65.
    Image: windbg.exe

PROCESS 882f2650 SessionId: 0 Cid: 07d8    Peb: 7ffd7000 ParentCid: 0324
    DirBase: 0ac404e0 ObjectTable: e506af88 HandleCount: 48.
    Image: notepad.exe
。。。。。

可以看到 PROCESS 882f2650,882f2650就是notepad.exe的_EPROCESS结构地址

lkd> dt _eprocess 882f2650   //查看notepad.exe的_EPROCESS
nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER 0x1cb68eb`1575a5ee
   +0x078 ExitTime         : _LARGE_INTEGER 0x0
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId : 0x000007d8 Void
   +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x805648b8 - 0x8a5e7110 ]
   +0x090 QuotaUsage       : [3] 0xc58
   +0x09c QuotaPeak        : [3] 0x1080
   +0x0a8 CommitCharge     : 0x220
   +0x0ac PeakVirtualSize : 0x2453000
   +0x0b0 VirtualSize      : 0x22bf000
   +0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0xba632014 - 0x8a5e713c ]
   +0x0bc DebugPort        : (null)
   +0x0c0 ExceptionPort    : 0xe1be7658 Void
   +0x0c4 ObjectTable      : 0xe506af88 _HANDLE_TABLE
   +0x0c8 Token            : _EX_FAST_REF
   +0x0cc WorkingSetLock   : _FAST_MUTEX
   +0x0ec WorkingSetPage   : 0x7bbc2
   +0x0f0 AddressCreationLock : _FAST_MUTEX
   +0x110 HyperSpaceLock   : 0
   +0x114 ForkInProgress   : (null)
   +0x118 HardwareTrigger : 0
   +0x11c VadRoot          : 0x8a626df0 Void
   +0x120 VadHint          : 0x88380130 Void
   +0x124 CloneRoot        : (null)

_EPROCESS + bc处为Debugprot地址,可以使用Syser下断
bpm 882f2650+bc w 断在notepad.exe的DebugPort处,如有对它的处理就会断住。。

第一次发帖,写得比较简单,留待参考。

### 使用 WinDbg 遍历用户态模块信息的方法 WinDbg 是一种强大的调试工具,可以通过分析 `_EPROCESS` 结构来获取有关进程的信息。以下是关于如何利用 WinDbg 和 `_EPROCESS` 结构遍历用户态模块信息的具体方法。 #### 1. 获取目标进程EPROCESS 地址 在 WinDbg 中,可以使用 `!process` 命令查找特定进程的 `_EPROCESS` 地址。例如: ```plaintext !process 0 0 notepad.exe ``` 上述命令会返回 Notepad 进程的相关信息,其中包括其 `_EPROCESS` 地址[^1]。 #### 2. 查看 EPROCESS 结构中的字段 一旦获得了 `_EPROCESS` 地址,就可以进一步查看结构的内容。例如,假设 `_EPROCESS` 地址为 `fffffa8009c3b060`,则可以运行以下命令: ```plaintext dt nt!_EPROCESS fffffa8009c3b060 ``` 这将显示 `_EPROCESS` 的各个字段及其偏移量。其中一些重要字段包括: - **ImageFileName**: 存储进程名称。 - **ActiveProcessLinks**: 表示活动进程链表(双向链表),用于链接所有活跃进程。 - **SectionObject**: 指向进程映像节对象的指针,可用于访问加载到内存中的模块信息[^3]。 #### 3. 访问 PEB (Process Environment Block) PEB 是每个 Windows 进程的核心数据结构之一,包含了大量与进程执行环境相关的信息。要找到某个进程的 PEB 地址,可以在已知 `_EPROCESS` 地址的情况下查询 `Peb` 字段: ```plaintext dt nt!_EPROCESS -y Peb ffffea800a4d7060 ``` 此命令的结果可能类似于这样: ```plaintext +0x2e0 Peb : 0xfffff8a0`0acdf000 _PEB ``` 接着可以直接转至 PEB 并提取 Ldr 数据成员的位置,Ldr 成员指向的是一个 `_PEB_LDR_DATA` 类型的数据结构,它管理着当前进程中所有的动态库(DLLs)列表: ```plaintext dt nt!_PEB -y Ldr 0xfffff8a00acdf000 ``` #### 4. 列举 DLL 加载器项 通过解析 `_PEB_LDR_DATA`,可以获得正在使用的模块列表。具体来说,需要关注以下几个关键部分: - **InLoadOrderModuleList**, **InMemoryOrderModuleList**, 或者 **InInitializationOrderModuleList** —— 它们都是双联结点数组形式存储了不同顺序排列下的模块节点。 下面是一个例子展示如何打印 InLoadOrderModules 下的所有条目: ```plaintext !pebmodules or equivalently, !list "-e nt!_PEB_LDR_DATA.InLoadOrderModuleList" ``` 这些指令能够列举出每一个被加载进来的DLL文件路径以及基地址等细节[^2]。 #### 总结 综上所述,在 WinDbg 中借助于 `_EPROCESS` 结构体可实现对用户模式下各模块详情的有效检索。先定位所需进程对应的 `_EPROCESS` 实例;再经由这个实例深入挖掘关联的 PEB 资料区进而取得完整的模块清单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值