菜鸟之驱动开发4

在上一节,我们学到了如何读取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 //去掉页面保护 { cli mov eax,cr0 and eax,not 10000h //and eax,0FFFEFFFFh mov cr0,eax } //用初始化的跳转指令修改当前地址的指令 curCode->E9 = jmpCode.E9; curCode->JMPADDR = jmpCode.JMPADDR; __asm //恢复页保护 { mov eax,cr0 or eax,10000h //or eax,not 0FFFEFFFFh mov cr0,eax sti } }


因为SSDT是受保护的,所以在修改之前我们要把cr0的CW位置为0(cr0寄存器是32位的,CW是它的第17位,为1则页面受保护,为0则可修改),修改之后要还原之。

在驱动卸载的时候,要记得还原我们的SSDT,还原的时候注意同样是修改SSDT,所以同样要操作cr0.

因为我们采用C语言的方式开发的, 所以在声明变量的时候要放在方法的入口处,不然编译不过。如果你喜欢用C++的方式开发,要记得用extern "C", 因为内核是不是C++写的,extern "C"做什么,网上有答案。

具体参看完整源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值