关于Inline hook check的一些想法与问题

来源:互联网 发布:50知天命是什么意思 编辑:程序博客网 时间:2024/05/29 04:22
          这东西弄了近一周才有点眉目,网络上的资料不是很多。爆搜百度google好久还是发现有一点点资料的:
1.rootkits那本书讲了一点,不过那个太挫了,检测了跟没检测一样。就是搜e9 e8判断跳转模块。

2.sysnap的blog里有一点~~最初给我了不少feel,感谢之~~

在我完成了大部分之后发现了 3.sudami的毕设~~~  里面那个流程图实在很清楚,弥补了不少我没想到的问题~~感谢之~~

后来逆了几个ark,各种ark处理方式不太一样,最悲剧的是很多ark都是把code传到 r3去处理,实在懒得逆向exe(od各种下断至今没玩爽...anti dbg也很烂)

本来想看看国外的网页有没有讨论的或者src,惊艳的很少,于是发现我E文也很挫,构造的关键词不怎么样。

总的来说我就是个“挫”字.....

不过经过一周的愣神和坚持不懈还是弄出点东西来,废话结束 开始记录

1.现代ark的方法想找到模块地址是不现实的~随便加点花指令就看不出来了,检测功能的主要精力应该放在对比磁盘和内存中代码不同。至于模块的检查,检查简单的 jmp call push ret之类的就好,当然有时间可以加点n段跳的检查。。当然遇见个变态来个十段跳。。太xx了

2.内核文件的对照,可以自己NtReadFile写入NonePagedPool,还见过网上某大牛写的Ring 0 PELoader,把大牛名字忘记了,真是抱歉。或者直接MmLoadSystemImage,极其方便....当然要记得重定位,PAGE段重定位的时候记得MmLockPagableCodeSection,不然会蓝死....

3.函数什么时候结束?这个很难弄 有ret未必是函数尾,0xcc大多是情况下可以表示函数结束,但也不是绝对,只好扫面函数头起一段足够的长度,遇到反汇编引擎失败的情况返回

4.检测出Inline也未必是恶意代码,不能随便恢复,微软自己有时也给自己打补丁,比如KeFindConfigurationEntry,系统跑起来之后会把开头变成call。INIT section部分会面目全非,所以我只检测.text和PAGE....

5.从EAT和SDDT的函数出发进行递归可以检测未导出函数,但是要避免重复,sudami的论文里写是用HashTable来存放....想半天也没想出怎么构造合理的哈希函数,处理冲突有很复杂。没在内核用过AVL,现在只是简单的用线性表存储,感觉效率不是很差,这块的算法有待改进

就这么多。。刚刚测试了一下我的code,感觉效果还可以。。xuetr的Inline check似乎会有重复检测到SSDT hook的问题...这跟他的检测方法有关...我逆向太挫...没看出个所以然来...