大家好,本文讨论了ARK工具在XP/WIN7 32位在内核通过ActiveProcessLinks手动遍历进程的方法,文末贴了遍历进程和内核模块的代码。在下新手,不足之处多多包涵~在进行进程附加读写操作之前,我们首先需要找到目标进程,传进程PID给读写函数。遍历系统中的所有进程是ARK工具的基础功能之一,用于:下面看看遍历进程的方法,看雪上有些相关文章:[原创]简单利用_CSR_PROCESS结构枚举出进程-软件逆向-看雪-安全社区|安全招聘|kanxue.com[原创]驱动遍历系统进程-软件逆向-看雪-安全社区|安全招聘|kanxue.com本文讲通过ActiveProcessLinks获取进程链表的方法在Windows内核中,每个进程都对应一个EPROCESS结构体,所有活跃进程通过ActiveProcessLinks字段形成一个双向循环链表。EPROCESS结构简化示意:要遍历进程,我们需要:找到入口点:获取当前进程的EPROCESS结构遍历链表:通过ActiveProcessLinks访问其他进程,只要拿到当前进程在ActiveProcessLinks中的节点,我们就可以遍历列表拿到数据。循环检测:当回到起始进程的节点时停止遍历获取EPROCESS涉及了大量的结构体硬件层面:
FS寄存器 → 指向当前处理器的KPCR内核层面:
KPCR (处理器控制区域)
├── PrcbData → KPRCB (处理器控制块)
└── CurrentThread → ETHREAD (当前执行线程)线程层面:
ETHREAD (执行线程)
├── ApcState → KAPC_STATE (APC状态)
│ └── Process → EPROCESS (所属进程)
└── ThreadsProcess → EPROCESS (直接指向所属进程)进程层面:
EPROCESS (执行进程)
├── Pcb → KPROCESS (内核进程块)
├── ActiveProcessLinks → LIST_ENTRY (进程链表)
├── UniqueProcessId → 进程ID
├── InheritedFromUniqueProcessId → 父进程ID
├── ImageFileName[16] → 进程名
└── 其他进程相关信息关注这条路径:FS → KPCR → KPRCB → ETHREAD → EPROCESS → 找链表遍历其他进程的EPROCESS由于影响观感,截取了部分XP下的结构体贴在文末,建议在windbg中查看这些结构体进行学习,命令:要拿EPROCESS就得计算这些结构体的偏移,然而windows各个版本的结构体是不同的,工作量不小,这里有几种方法:1.人肉计算结构体偏移量,在驱动启动时RtlGetVersion(&versionInfo)获得当前windows版本然后设置对应的偏移量。我刚开始也是这样干的,文末有使用这种方式的代码2.特征API: PsGetCuurentProcessId 、PsGetNextProcess直接拿链表头。缺陷:如果API被hook需要考虑被改jmp的情况,且如果需要的函数没有导出,定位不到函数入口点,需要利用api调用层级进行逐级特征定位。(真有人这么干吗0.0看这个偏移[eax+0x1EC],Cid 可以拿到UniqueProcess和UniqueThread的指针这里可以特征到链表头PsActiveProcessHead3.解析pdb:下载pdb,写工具代码解析pdp获取偏移量。解析pdb很累?其实可以调用symsrv.dll和dbghelp.dll的导出函数解析,也可以使用VS目录下自带的DIA2dump,以及它已经编译好的dll。Dia2dump 示例 - Visual Studio (Windows) | Microsoft Learn有相关文章介绍DIA2DUMP[原创]通过pdb解析SSDT表地址-编程技术-看雪-安全社区|安全招聘|kanxue.comcmd输入regsvr32 msdia140.dll之后就可以在工程里下断点调试?4.调API,哎谁爱解析谁解析,我先调了=。=NtQuerySystemInformation 函数 (winternl.h) - Win32 apps | Microsoft Learn)在文档中找到SYSTEM_PROCESS_INFORMATIONSYSTEM_PROCESS_INFORMATION 算是半公开的结构体,直接查微软文档他会有一些保留字段显示Reserved,可以使用SourceInsight查看WRK1.2的源码观察他。SourceInsight官网: 3e3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6L8%4g2J5j5$3g2A6L8Y4y4A6k6$3S2@1i4K6u0W2j5$3!0E0i4K6u0r3N6s2u0A6j5h3I4Q4x3V1j5`.WRK1.2下载: d81K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2P5i4W2#2j5$3g2V1k6h3#2A6M7X3u0S2M7#2)9J5c8W2N6A6L8X3c8G2N6%4y4Q4x3X3c8d9k6i4y4W2j5i4u0U0K9q4)9J5k6p5E0W2M7X3&6W2L8q4)9J5k6q4N6d9d9#2)9J5k6l9`.`.看一下这个结构体,想要什么自己说(狗头微软自己也会使用这些API,所以直接抄他代码就行。WRK1.2中搜索PerInfoProcessRundown与PerfInfoSysModuleRunDown。文末代码中遍历模块使用了这些API注意
高版本看NT开头的函数都是第一次获取数量,申请缓冲区,第二次获取数据。你直接申请巨大缓冲区也行。这里没有处理头节点? 有个空的
遍历模块列表,看到了一堆sys
遍历进程的代码 检测Windows版本手动设置偏移量 然后遍历ActiveProcessLinks拿进程信息遍历模块的代码 直接调用API挖坑,后续补充一下ARK集成DIA2dump解析PDB的方法~ 前言 为什么要遍历进程 如何遍历进程 数据流动 效果图和代码 XP下的相关结构体
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287620.htm
[原创]实现简易ARK工具(3) 遍历进程和内核模块
159 浏览
19 回复
感谢分享
谢谢分享
谢谢分享
谢谢分享
谢谢分享
感谢分享
谢谢分享
感谢分享
mark
感谢分享
有偿咨询,怎么联系,给个联系方式
very good
牛逼
感谢分享
如果不做ark 简单的做个系统信息查看工具的话. 目前使用 PsLookupProcessByProcessId 去拿信息就行 或者说现在使用这个也算是最优解. 因为隐藏进程断链等骚操作在目前PG状态下.都凉凉. 当然一山还有一山高.对抗无止境. 能满足日常80%的需求也可以 除非特别需要20%. 但这20%会付出更多. 比如上面的 我需要找系统特征码来定位.(更好的是解析pdb)
最后于 2025-7-18 09:51
被TkBinary编辑
,原因: 错别字
最后于 2025-7-18 09:51
被TkBinary编辑
,原因: 错别字