[原创](二)通过逆向PCHunter驱动学习64位 windows内核之 识别隐藏进程
相关
[原创](一)通过逆向PCHunter驱动学习64位 windows内核之 精准定位
[原创](二)通过逆向PCHunter驱动学习64位 windows内核之 识别隐藏进程
-----------------------------------------------------------------------------------------------------------------------------------------------------
接第1篇,
根据 第1篇 的通信协议分析,
我在 功能派发断点 处下断,
下图红色位置:

再回到3环在PCHunter的进程栏目,
右键刷新功能显示,
在寄存器rbx所存地址中,
得到如下的协议内容:

在call rax 执行返回后,
查看Retbuffer中返回的内容如下图:

返回数据中:
绿色:进程数量
蓝色:进程的EPROCESS地址
EPROCESS后的字符串是镜像文件路径
返回3环,核实PCHunter结果显示

结果 显示数量相等

进程的 EPROCESS地址 和 路径也匹配上了
核对的结果证实,
定位目标功能函数的目的达到了.
定位 结果如下:
PCHunter进程功能的调用功能号是 15h
进程功能处理函数相对分发基址(g_srvfn), 下标为: 15h - 0fh+90dh = 913h
功能处理函数地址: 0xFFFFF88004AFC500.
下面开始分析功能函数的主要功能的具体实现代码
---------------------------------------------------------------------------------------------------------------------------------------------------------
功能处理函数代码 0xFFFFF88004AFC500 ,
IDA F5还原的伪代码,
在我作了一些命名后如下图:

这个函数先在对用户层传入的buff起始地址通过
MmUserProbeAddress 作了用户层空间检测,
if语句块中ProbeForWrite函数再次对buff作了可写检查,
之后调用2个子函数来实现功能:
其中子函数2: GetProcess2_IDLE_exe()
拿到进程idle.exe进程
子函数1执行完再buff中返回其它的所有进程信息.
下一步目的就是分析子函数1 : GetProcess1()
-------------------------------------------------------------------------------------
下面是 GetProcess1() F5后的伪代码,
我对相关的重要地址作了标记,
如下图

这里非常关键了
重点一:
绿色标记出的g_nt_PspCidTable, 存的是系统句柄表,
是PCHunter 定义的nt模块中nt! PspCidTable (未导出) 的全局指针,
nt! PspCidTable,是指向HANDLE_TABLE的指针,
内部存放所有进程及线程对象指针.
在wrk1.2源码中查看 PspCidTable 的引用,



进程和线程创建时都会在通过ExCreateHandle函数在 nt!PspCidTable表中建立新的结点保存其EPROCESS或ETHREAD,
并将 ExCreateHandle返回值进程和线程的唯一标识ID,
有了此表,所有进程和线程都难以遁形.
重点二:
这段代码在执行完sub_FFFFF88004B19BC0()后,
buff中就取到了所有的进程信息.
-------------------------------------------------------------------------------------
首先由于 sub_FFFFF88004B19BC0函数汇编篇幅和伪代码的篇幅都过大,
其次是发现网上遍历 PspCidTable的优秀文章挺多的,
所以下面只对该函数做了基本结构上的截取:

注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
