欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创](二)通过逆向PCHunter驱动学习64位 windows内核之 识别隐藏进程

[原创](二)通过逆向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函数

-------------------------------------------------------------------------------------

首先由于 sub_FFFFF88004B19BC0函数汇编篇幅和伪代码的篇幅都过大,

其次是发现网上遍历 PspCidTable的优秀文章挺多的,

所以下面只对该函数做了基本结构上的截取:


   此函数在取 nt!PspCidTable第一层的时候,

   根据内核版本作了一个分支,

注意:上传附件及图片大小不得大于30M。

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

0 0 0 举报
复制成功