因自己工作,可能后面会写ark工具.所以周六周日没事就逆向了一下进程回调数组. 虽然资料很多.但是自己动手自己明白.总比别人给的好.
所以记一下自己的分析思路以及逆向结果.
内核中 PsSetCreateProcessNotifyRoutine回调函数是用来设置进程监控的.
相应的还有一个Ex函数. ex函数没有逆向.简单的看了一下.这里说一下
进程回调的逆向把.
定位反汇编代码如下:
可以看到 里面调用的函数为: PspSetCreateProcessNotifyRoutine
总共三个参数
伪代码
PspSetCreateProcessNotifyRoutine(0,你自己的回调函数地址,是否删除标记)
而逆向Ex系列的函数.发现变得仅仅是第一个函数参数. 0变为1了.


底层函数调用的它,那么就逆向它.
通过上面可以看到 获得的回调函数数组. 并且函数数组入栈. 那么就需要逆向一下新的函数了
首先看下回调函数数组里面的内容.

83f86ce0 = 回调函数数组

找到回调函数数组会发现这个值不是回调函数地址.
下面回调 ExReferenceCallBackBlock 传入回调函数地址.所以肯定有对 其的操作
通过逆向次函数可以得知. 函数数组[0]的内容被修改了. 修改为 -1的值. 如上面看到的数组的内容为:

现在首内容 0x8d408c3f的值会变为 0x8d408c3e
往下有很多分支没有走. 最后会进行解密操作得出函数地址.
如: 0x8d408c3e & 0xFFFFFFF8 = 函数地址表.
如下:

这个函数地址表的第二项就是我们要找的函数地址.
现在是0x83f01d35 去pchunter中查看.

但是上面会有一个问题. 0x8d408c3f的值会变为 0x8d408c3e 直接用 0x8d408c3f & 0xFFFFFFF8 的结果也是一样的.
所以可以忽略上面修改值的事情.
可以得出一个公式 函数地址 = *((数组[n] & 0xFFFFFFF8) + 4);
可以套用一下公式.进行一次计算.

使用代码可以遍历出函数地址表. 表中第二项才是函数地址. 随便找一个举例

它的第二项是8c5f89d8 说明找对了.
通过逆向可以找到数组. 那么可以进行如下操作
1.摘除数组.传入函数地址.调用 PsSetCreateProcessNotifyRoutine 第二个参数为TRUE即可摘掉.你也可以自己摘.就是相当于自己实现了一下这个函数摘除钩子的代码
2.进程回调优先级.可以找到数组.将你的回调写入到数组第一项.这样你的就会优先到来. 这个没试过.算是一个思路吧.
后面逆向下64位的.然后合并到这个帖子里面. 内容会发送到自己博客
f6eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3K9f1u0A6L8X3q4J5P5g2)9J5c8R3`.`.
e5dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7I4P5o6S2Q4x3X3g2U0L8$3#2Q4x3V1j5`.
谢谢支持.
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2019-8-6 13:46
被TkBinary编辑
,原因: 图片丢失,上传图片.