科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道详谈HOOK API的技术(3)

详谈HOOK API的技术(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

甚至如果没有HOOK,就没有病毒,因为不管是DOS下的病毒或WINDOWS里的病毒,都是靠HOOK系统服务来实现自己的功能的。

作者:51CTO.COM 2007年10月27日

关键字: 病毒 HOOK API NDIS过滤

  • 评论
  • 分享微博
  • 分享邮件

  下面用4种方法来HOOK这个API:

  1,把API入口的第一条指令是PUSH EBP指令(机器码0x55)替换成INT 3(机器码0xcc),然后用WINDOWS提供的调试函数来执行自己的代码,这中方法被SOFT ICE等DEBUGER广泛采用,它就是通过BPX在相应的地方设一条INT 3指令来下断点的。但是不提倡用这种方法,因为它会与WINDOWS或调试工具产生冲突,而汇编代码基本都要调试;

  2,把第二条mov ebp,esp指令(机器码8BEC,2字节)替换为INT F0指令(机器码CDF0),然后在IDT里设置一个中断门,指向我们的代码。我这里给出一个HOOK代码:

  lea ebp,[esp+12] //模拟原指令mov ebp,esp的功能

  pushfd //保存现场

  pushad //保存现场

  //在这里做你想做的事情

  popad //恢复现场

  popfd //恢复现场

  iretd //返回原指令的下一条指令继续执行原函数(71A21AF7地址处)

  这种方法很好,但缺点是要在IDT设置一个中断门,也就是要进RING0。

  3,更改CALL指令的相对地址(CALL分别在71A21B12、71A21B25、71A21B64,但前面2条CALL之前有一个条件跳转指令,有可能不被执行到,因此我们要HOOK 71A21B64处的CALL指令)。为什么要找CALL指令下手?因为它们都是5字节的指令,而且都是CALL指令,只要保持操作码0xE8不变,改变后面的相对地址就可以转到我们的HOOK代码去执行了,在我们的HOOK代码后面再转到目标地址去执行。

  假设我们的HOOK代码在71A20400处,那么我们把71A21B64处的CALL指令改为CALL 71A20400(原指令是这样的:CALL 71A21230)

  而71A20400处的HOOK代码是这样的:

  71A20400:

  pushad

  //在这里做你想做的事情

  popad

  jmp 71A21230 //跳转到原CALL指令的目标地址,原指令是这样的:call 71A21230

  这种方法隐蔽性很好,但是比较难找这条5字节的CALL指令,计算相对地址也复杂。

  4,替换71A21AFE地址上的cmp dword ptr [71A3201C], 71A21C93指令(机器码:813D1C20A371931CA271,10字节)成为

  call 71A20400

  nop

  nop

  nop

  nop

  nop

  (机器码:E8 XX XX XX XX 90 90 90 90 90,10字节)

  在71A20400的HOOK代码是:

  pushad

  mov edx,71A3201Ch //模拟原指令cmp dword ptr [71A3201C], 71A21C93

  cmp dword ptr [edx],71A21C93h //模拟原指令cmp dword ptr [71A3201C], 71A21C93

  pushfd

  //在这里做你想做的事

  popfd

  popad

  ret

  这种方法隐蔽性最好,但不是每个API都有这样的指令,要具体情况具体操作。

  以上几种方法是常用的方法,值得一提的是很多人都是改API开头的5个字节,但是现在很多杀毒软件用这样的方法检查API是否被HOOK,或其他病毒木马在你之后又改了前5个字节,这样就会互相覆盖,最后一个HOOK API的操作才是有效的,所以提倡用第3和第4种方法。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章