菜鸟之驱动开发4
来源:互联网 发布:数控激光切割机编程 编辑:程序博客网 时间:2024/05/23 20:43
在上一节,我们学到了如何读取SSDT表中函数的当前地址与系统地址, 有了这两个地址我们就可以判断该函数是否被inline hook了, 如果NSOpenProcess被hook了,那么我们就无法用od对进程进行载入,从而不能分析之。今天教大家如何绕过它,从而使其可以被od载入,从而被分析。
其原理就是在函数当前地址进行强制调转到系统地址。我们可以用kernel detect这个工具轻松绕过函数的HOOK,但那样没有技术含量, 做为程序员,得写代码。原理就是修改SSDT表,使其函数不被hook. 我们只需要在上一节代码里,驱动入口函数加入以下代码即可。
ULONG cur_Addr,old_Addr;JMPCODE jmpCode; KdPrint(("Hello Driver World 驱动加载成功"));cur_Addr = asmReadSSDT();old_Addr = cReadSSDT();if (cur_Addr != old_Addr){KdPrint(("Have be hooked!")); //保存当前地址前5字节指今curCode = (PJMPCODE)cur_Addr;oldCode.E9 = curCode->E9;oldCode.JMPADDR = curCode->JMPADDR;//初始化跳转指令jmpCode.E9 = 0xE9;jmpCode.JMPADDR = cur_Addr - old_Addr - 5;__asm //去掉页面保护{climov eax,cr0and eax,not 10000h //and eax,0FFFEFFFFhmov cr0,eax}//用初始化的跳转指令修改当前地址的指令curCode->E9 = jmpCode.E9;curCode->JMPADDR = jmpCode.JMPADDR;__asm //恢复页保护 {mov eax,cr0or eax,10000h //or eax,not 0FFFEFFFFhmov cr0,eaxsti }}
因为SSDT是受保护的,所以在修改之前我们要把cr0的CW位置为0(cr0寄存器是32位的,CW是它的第17位,为1则页面受保护,为0则可修改),修改之后要还原之。
在驱动卸载的时候,要记得还原我们的SSDT,还原的时候注意同样是修改SSDT,所以同样要操作cr0.
因为我们采用C语言的方式开发的, 所以在声明变量的时候要放在方法的入口处,不然编译不过。如果你喜欢用C++的方式开发,要记得用extern "C", 因为内核是不是C++写的,extern "C"做什么,网上有答案。
具体参看完整源码。
- 菜鸟之驱动开发4
- 菜鸟之驱动开发1
- 菜鸟之驱动开发2
- 菜鸟之驱动开发3
- 菜鸟之驱动开发5
- 菜鸟之驱动开发6
- 菜鸟之驱动开发7
- 菜鸟之驱动开发8
- 菜鸟之驱动开发9
- 菜鸟之驱动开发10
- 菜鸟之驱动开发11
- 菜鸟之驱动开发12
- 菜鸟之驱动开发13
- 菜鸟学驱动开发系列
- 菜鸟WDF驱动开发系列
- 菜鸟WDF驱动开发系列(4):VS2012驱动开发初体验
- 驱动开发之 DeviceType
- 驱动开发之 FastIO
- 求AOE网的关键路径
- 我在Salira的800天(2009.5.20~2011.7.29)-三.研究与学习篇
- mysql特殊查询
- 一个体现Java接口及工厂模式优点的例子
- 深入浅出C++之private/public/protected
- 菜鸟之驱动开发4
- VC程序的SECTION(3):.text
- 云参考框架 (大图)
- vs2010+wdk7600+XXX环境配置,随后2步最重要,其他和网上搜的大同小异
- CInternetSession的简单使用
- menu.addIntentOptions 添加动态菜单
- 我在Salira的800天(2009.5.20~2011.7.29)-四.总结篇
- Explain plan Oracle优化工具安装及使用
- 【Qt】Web与本地应用的混合开发