您的位置:首页 > 移动开发 > Objective-C

内核级利用通用Hook函数方法检测进程

2007-06-08 18:41 357 查看
[align=center]内核级利用通用Hook函数方法检测进程

www.hackbase.com 2007-1-5 0 黑客基地
 [/align]
介绍通用hook的一点思想:
在系统内核级中,ms的很多信息都没公开,包括函数的参数数目,每个参数的类型等。在系统内核中,访问了大量的寄存器,而很多寄存器的值,是上层调用者提供的。如果值改变系统就会变得不稳定。很可能出现不可想象的后果。另外有时候对需要hook的函数的参数不了解,所以不能随便就去改变它的堆栈,如果不小心也有可能导致蓝屏。所以hook的最佳原则是在自己的hook函数中呼叫原函数的时候,所有的寄存器值,堆栈里面的值和hook前的信息一样。这样就能保证在原函数中不会出错。一般我们自己的hook的函数都是写在c文件里面的。例如hook的目标函数kireadythread。
那么一般就自己实现一个:


但是用c编译器编译出来的代码会出现一个堆栈帧:


这就和我们的初衷不改变寄存器的数违背了,所以我们可以自己用汇编来实现mykireadythread。


当我们要拦截目标api的时候,只要修改原函数头5个字节的机器为一个jmp_func就行了。然后把原来的5字节保存,在跳入原函数时,恢复那5个字节即可。
hook kireadythread检测系统中的进程:
在线程调度抢占的的时候会调用kireadythread,它的原型为void fastcall kireadythread (in prkthread thread),在进入kireadythread时,ecx指向thread。所以完全可以hook kireadythread 然后用ecx的值得到但前线程的进程信息。kireadythread没被ntosknrl.exe导出,所以通过硬编码来。在2000sp4中地址为0x8043141f。
具体实现:


试验结果:


测试、编译环境windows2000 sp4、windows2000 ddk。没写出线程的隐藏进程代码,不过基本上实现得差不多了,只需要把返回的信息,和ring3级查询得到的信息进行适时对比就能查出异常进程了。

(完)
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息