科技行者

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

知识库

知识库 安全导航

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

详谈HOOK API的技术(2)

  • 扫一扫
    分享文章到微信

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

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

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

关键字: 病毒 HOOK API NDIS过滤

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

  HOOK API的技术,说起来也不复杂,就是改变程序流程的技术。在CPU的指令里,有几条指令可以改变程序的流程:JMP,CALL,INT,RET,RETF,IRET等指令。理论上只要改变API入口和出口的任何机器码,都可以HOOK,但是实际实现起来要复杂很多,因为要处理好以下问题:

  1,CPU指令长度问题,在32位系统里,一条JMP/CALL指令的长度是5个字节,因此你只有替换API里超过5个字节长度的机器码(或者替换几条指令长度加起来是5字节的指令),否则会影响被更改的小于5个字节的机器码后面的数条指令,甚至程序流程会被打乱,产生不可预料的后果;

  2,参数问题,为了访问原API的参数,你要通过EBP或ESP来引用参数,因此你要非常清楚你的HOOK代码里此时的EBP/ESP的值是多少;

  3,时机的问题,有些HOOK必须在API的开头,有些必须在API的尾部,比如HOOK CreateFilaA(),如果你在API尾部HOOK API,那么此时你就不能写文件,甚至不能访问文件;HOOK RECV(),如果你在API头HOOK,此时还没有收到数据,你就去查看RECV()的接收缓冲区,里面当然没有你想要的数据,必须等RECV()正常执行后,在RECV()的尾部HOOK,此时去查看RECV()的缓冲区,里面才有想要的数据;

  4,上下文的问题,有些HOOK代码不能执行某些操作,否则会破坏原API的上下文,原API就失效了;

  5,同步问题,在HOOK代码里尽量不使用全局变量,而使用局部变量,这样也是模块化程序的需要;

  6,最后要注意的是,被替换的CPU指令的原有功能一定要在HOOK代码的某个地方模拟实现。

  下面以ws2_32.dll里的send()为例子来说明如何HOOK这个函数:

  Exported fn(): send - Ord:0013h

  地址 机器码 汇编代码

  :71A21AF4 55 push ebp //将被HOOK的机器码(第1种方法)

  :71A21AF5 8BEC mov ebp, esp //将被HOOK的机器码(第2种方法)

  :71A21AF7 83EC10 sub esp, 00000010

  :71A21AFA 56 push esi

  :71A21AFB 57 push edi

  :71A21AFC 33FF xor edi, edi

  :71A21AFE 813D1C20A371931CA271 cmp dword ptr [71A3201C], 71A21C93 //将被HOOK的机器码(第4种方法)

  :71A21B08 0F84853D0000 je 71A25893

  :71A21B0E 8D45F8 lea eax, dword ptr [ebp-08]

  :71A21B11 50 push eax

  :71A21B12 E869F7FFFF call 71A21280

  :71A21B17 3BC7 cmp eax, edi

  :71A21B19 8945FC mov dword ptr [ebp-04], eax

  :71A21B1C 0F85C4940000 jne 71A2AFE6

  :71A21B22 FF7508 push [ebp+08]

  :71A21B25 E826F7FFFF call 71A21250

  :71A21B2A 8BF0 mov esi, eax

  :71A21B2C 3BF7 cmp esi, edi

  :71A21B2E 0F84AB940000 je 71A2AFDF

  :71A21B34 8B4510 mov eax, dword ptr [ebp+10]

  :71A21B37 53 push ebx

  :71A21B38 8D4DFC lea ecx, dword ptr [ebp-04]

  :71A21B3B 51 push ecx

  :71A21B3C FF75F8 push [ebp-08]

  :71A21B3F 8D4D08 lea ecx, dword ptr [ebp+08]

  :71A21B42 57 push edi

  :71A21B43 57 push edi

  :71A21B44 FF7514 push [ebp+14]

  :71A21B47 8945F0 mov dword ptr [ebp-10], eax

  :71A21B4A 8B450C mov eax, dword ptr [ebp+0C]

  :71A21B4D 51 push ecx

  :71A21B4E 6A01 push 00000001

  :71A21B50 8D4DF0 lea ecx, dword ptr [ebp-10]

  :71A21B53 51 push ecx

  :71A21B54 FF7508 push [ebp+08]

  :71A21B57 8945F4 mov dword ptr [ebp-0C], eax

  :71A21B5A 8B460C mov eax, dword ptr [esi+0C]

  :71A21B5D FF5064 call [eax+64]

  :71A21B60 8BCE mov ecx, esi

  :71A21B62 8BD8 mov ebx, eax

  :71A21B64 E8C7F6FFFF call 71A21230 //将被HOOK的机器码(第3种方法)

  :71A21B69 3BDF cmp ebx, edi

  :71A21B6B 5B pop ebx

  :71A21B6C 0F855F940000 jne 71A2AFD1

  :71A21B72 8B4508 mov eax, dword ptr [ebp+08]

  :71A21B75 5F pop edi

  :71A21B76 5E pop esi

  :71A21B77 C9 leave

  :71A21B78 C21000 ret 0010

 

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

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

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