目前大多数做法似乎是从PsSetCreateProcessNotifyRoutine等导出的地址开始,
用特征码搜索保存Notify的数组来枚举,
缺点是不够通用
我的思路是,先注册一个自己的NotifyRoutine,
然后从CmUnRegisterCallback等导出函数地址开始查找自己登录的函数地址,
从而找到保存Notify的数组,
这样做也有缺点,在XP最多登录8个processnotify,如果超过了,
我这个方法就没法用了~~~
PspLoadImageNotifyRoutine,PspCreateThreadNotifyRoutine,
PspCreateProcessNotifyRoutine
这三个的找法是一样的,xp和win7也没什么区别,都是一个数组
值得一提的是CmpCallback的找法,xp和win7有很大的区别,
xp里面是个数组,到了win7变成了队列了
我的逆向水平很弱,着实花了一段时间,才看出这个队列的结构。。。
唯一的硬编码是数组的最大个数,
比如CreateProcessNotify
代码:
XP: 805d1c59 43 inc ebx 805d1c5a 83c704 add edi,4 805d1c5d 83fb08 cmp ebx,8 805d1c60 72cc jb nt!PsSetCreateProcessNotifyRoutine+0x14 (805d1c2e) win7: 8339a8c6 43 inc ebx 8339a8c7 83fb40 cmp ebx,40h 8339a8ca 72af jb nt!PspSetCreateProcessNotifyRoutine+0x29 (8339a87b)
对照了一下,和xuetr的结果一样: