-
-
[下载] WIN7 64 SP1 下实现自定义系统函数
-
发表于:
2016-5-27 21:52
6445
-
[下载] WIN7 64 SP1 下实现自定义系统函数
现有的各种保护软件都对程序用到的系统函数进行层层监控和保护。当你的程序调用某些系统函数时,保护软件会先审核你的系统函数的参数。如果它认为你的参数不合法,就不会阻止函数的运行,甚至会关闭计算机。保护软件一般会从ring3层的系统函数库到ring0层的内核函数库都进行监控。
躲避ring3层的监控有很多中方法,其中最直接的就是创建新库,复制需要的一份系统函数代码在新库中运行。或者复制一份系统函数库,然后进行重命名后动态加载。这种方法虽然可以躲避对kenerl32等系统函数库的监控,但ring3层函数调用ring0层内核驱动时,需要通过的系统调用由于是唯一的,则无法用这种方法跳过。跳过系统调用的方法要么修复被保护软件篡改的系统函数(修复后容易被保护软件检测到),要么建立新的系统调用表。
在XP时代,由于windows的SSDT的4个位置中2个被系统占用,另外2个位置处于空闲状态。利用这2个空闲位置建立自己的系统调用表,是一个很好的躲过监控的方法。win7系统中,SSDT表只有2个位置,且都被系统占用,XP下好用的方法就不可用了。
系统调用的目的从根本上讲只是将ring3层函数的参数,转换后传递给ring0层的函数,并将ring0层的执行结果转换后传递出来。既然如此,从ring3层向ring0层进行参数传递的方式有很多种,特定的系统函数被监控了,我们可以考虑其他函数。比如:DeviceIoControl。
这个函数本身的作用就是用来进行设备数据传输的,我们完全可以将需要的参数进行转换后通过该函数传递到ring0层,然后由ring0层的函数还原后,再传递给原定的内核函数。这样我们就绕过了保护软件对系统调用的监控。
下面的代码实现了SendInput、Keybd_event、Mouse_event、GetPixel、BitBlt、GetWindowThreadProcessId、OpenProcess、ReadProcessMemory、WriteProcessMemory系统函数的自定义处理。该代码在win7 64位SP 1简体中文版下测试通过。编译环境:VS2010 sp1,需要安装WTL、VisualDDK-1.5.7。
特别说明:
1. 由于64位的编译器无法识别__asm,因此如果需要修改gobalJmp.asm,修改后请用MASM11中的命令行进行重新编译。
2. 在64位系统中,驱动程序皆为64位,SelfSysFunlib中对32位版本和64位版本的参数定义有所不同。
3. 分享的代码,仅供学习只用。由此产生的任何问题,本人均不负责。
4. 附件中一个是代码,一个是驱动签名工具
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课