apihook(C#中,如何HOOK一个API函数!)

  API Hook是一个非常重要的话题,如果没有API Hook,很多技术将无法实现,甚至可能根本无法实现。所谓的API,在这里指的是广义上的API,包括DOS下的中断,Windows中的API、中断服务

  API Hook是一个非常重要的话题,如果没有API Hook,很多技术将无法实现,甚至可能根本无法实现。所谓的API,在这里指的是广义上的API,包括DOS下的中断,Windows中的API、中断服务、IFS和NDIS过滤等。比如我们熟悉的即时翻译软件,就是通过Hook TextOut()或ExtTextOut()这两个函数来实现的。在操作系统使用这两个函数输出文本之前,会将相应的英文替换为中文,从而实现即时翻译。IFS和NDIS过滤也是类似的原理,在读写磁盘和收发数据之前,系统会调用第三方提供的回调函数来判断操作是否可执行。与普通的Hook不同,IFS和NDIS过滤是操作系统允许的,并由操作系统提供接口来安装回调函数。

  甚至可以说,如果没有API Hook,就没有病毒存在。因为无论是DOS下的病毒还是Windows下的病毒,都是通过Hook系统服务来实现其功能的。DOS下的病毒通过Hook中断21H来感染文件(文件型病毒),通过Hook中断13H来感染引导扇区(引导型病毒);而Windows下的病毒通过Hook系统API(包括RING0层和RING3层)或者安装IFS(CIH病毒所使用的方法)来感染文件。所以可以说,没有API Hook,就没有今天多姿多彩的软件世界。

  由于涉及到专利、知识产权或商业机密的问题,微软一直不鼓励大家Hook其操作系统的API,也提供了IFS和NDIS等其他过滤接口,以满足杀毒软件和防火墙的需求。所以大多数情况下,我们需要自己动手实现API Hook。

  API Hook有一个原则,即被Hook的API的原有功能不能受到任何影响。就像医生救人一样,如果把病人体内的病毒杀死了,但同时也导致病人死亡,那这种“救人”就没有任何意义了。如果你Hook了API,达到了你的目的,但是API的原有功能失效了,那不是Hook,而是替换,操作系统的正常功能就会受到影响,甚至可能导致系统崩溃。

  从技术上讲,API Hook并不复杂,它是一种改变程序流程的技术。在CPU的指令中,有几条可以改变程序流程的指令,比如JMP、CALL、INT、RET、RETF、IRET等。理论上说,只要修改API入口和出口的机器码,就可以实现Hook。但实际上要处理的问题更复杂。首先是CPU指令长度的问题,在32位系统中,一条JMP/CALL指令的长度为5个字节。因此,只有替换长度超过5个字节的机器码,或者替换多条指令长度总和为5个字节的指令,否则会影响被修改的小于5个字节的机器码后面的指令,甚至会打乱程序的流程,产生不可预料的后果。其次是参数的问题,为了访问原有API的参数,需要通过EBP或ESP引用参数,所以必须清楚HOOK代码中的EBP/ESP的值。还有时机的问题,有些Hook必须在API的开头执行,而有些则必须在API的结尾执行。例如,如果在CreateFileA()的结尾处Hook API,那么此时就无法写文件,甚至无法访问文件。又如HOOK RECV(),如果在API头部Hook,此时还没有收到数据,就去查看RECV()的接收缓冲区,里面自然没有想要的数据,必须等RECV()正常执行后,在RECV()的尾部Hook,此时才能查看到缓冲区内的数据。此外,还要考虑上下文的问题,某些Hook代码不能执行某些操作,否则会破坏原API的上下文,导致原API失效。同步问题也要注意,在Hook代码中尽量避免使用全局变量,而是使用局部变量,以满足程序模块化的需求。最后,需要注意的是,被替换的CPU指令的原有功能必须在Hook代码的某个地方模拟实现。

  以上是对API Hook的一些说明。接下来,以ws2_32.dll中的send()函数为例,说明如何Hook这个函数。send()函数的导出函数名为send,序号为0013H,地址为71A21AF4。下面是一些机器码和对应的汇编代码。

  71A21AF4: 55 push ebp

  71A21AF5: 8BEC mov ebp, esp

  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

  71A21B08: 0F84853D0000 je 71A25893

本文来自投稿,不代表本站立场,如若转载,请注明出处:https://www.misoho.com/showinfo-1-2854-0.html

(130)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

如果您有好的建议,请告诉我们。

上一篇 2023-09-18
下一篇 2023-10-09

apihook(C#中,如何HOOK一个API函数!)相关推荐

    22

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
您关注的是操作系统乐园《apihook(C#中,如何HOOK一个API函数!)》话题,敬请收藏。