详谈HOOK API的技术

利用hook截获进程的API调用 截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows Hook可以帮我们实现这一点。SetWindowsHookEx的声明如下:HHOOK SetWindowsHookEx(  int idHook,        // hook type  HOOKPROC lpfn, 阅读详情
 
详谈HOOK API的技术        上一帖     下一帖    查看完整版本

页: [1]

麦克风 2006-4-6 03:05
详谈HOOK API的技术

HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断, WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻译软件,就是靠HOOK TextOut()或ExtTextOut()这两个函数实现的,在操作系统用这两个函数输出文本之前,就把相应的英文替换成中文而达到即时翻译;IFS 和NDIS过滤也是如此,在读写磁盘和收发数据之前,系统会调用第三方提供的回调函数来判断操作是否可以放行,它与普通HOOK不同,它是操作系统允许 的,由操作系统提供接口来安装回调函数。
    甚至如果没有HOOK,就没有病毒,因为不管是DOS下的病毒或WINDOWS里的病毒,都是靠HOOK系统服务来实现自己的功能的:DOS下的病毒靠 HOOK INT 21来感染文件(文件型病毒),靠HOOK INT 13来感染引导扇区(引导型病毒);WINDOWS下的病毒靠HOOK系统API(包括RING0层的和RING3层的),或者安装IFS(CIH病毒所 用的方法)来感染文件。因此可以说“没有HOOK,就没有今天多姿多彩的软件世界”。
    由于涉及到专利和知识产权,或者是商业机密,微软一直不提倡大家HOOK它的系统API,提供IFS和NDIS等其他过滤接口,也是为了适应杀毒软件和防火墙的需要才开放的。所以在大多数时候,HOOK API要靠自己的力量来完成。
    HOOK API有一个原则,这个原则就是:被HOOK的API的原有功能不能受到任何影响。就象医生救人,如果把病人身体里的病毒杀死了,病人也死了,那么这个 “救人”就没有任何意义了。如果你HOOK API之后,你的目的达到了,但API的原有功能失效了,这样不是HOOK,而是REPLACE,操作系统的正常功能就会受到影响,甚至会崩溃。
    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
    下面用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种方法。
API Hook完全手册 注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章)。最近在论坛上看到有不少人在问关于API Hook的问题,便写成此文,希望能对朋友们在写API Hook代码的时候能够有所帮助。1 基本原理API Hook是什么我就不多说了,直接进入正题。API Hook技术主要有下面的技术难点:1.     如何将自己的的代码Inject到其他进程2.     如何Hoo 阅读详情

相关推荐

HOOK其他进程API和全局HOOK-API

HOOK是一种WINDOWS下存在很久的技术了。 HOOK一般分两种1。HOOK MESSAGE  2。HOOK API 本问讨论的是HOOK API。(如果你是HOOK高手就不要看了) 在最初学HOOK-API的时候通常都是通过覆盖地址和修改IAT的方法。通过这两种技术,我们基本都可以实现对本进程的API函数进行HOOK了。但是在高兴之余会有点遗憾,怎么才能HOOK其他进程的API函数呢?怎么才

4292

hook WSARecv要注意的问题

如果直接在hook的函数中直接调用原始地址的话完全没有问题:int WSAAPI hooked_WSARecv_ws232(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_

冷风 7079

HookRecv 拦截输出

hookrecv拦截输出封包信息 不错的东西

没有HOOK就没有病毒?详谈HOOK API技术(转)

HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻...

cuankuangzhong6373的博客 818

【AAOS】【源码分析】用户管理(五)-- MUMD介绍

MUMD(多用户多屏显示)是Android Automotive OS为车载多乘员场景设计的功能,支持不同座位用户独立操作各自屏幕。

码农的历程 1512

Qt6安装保姆级教程:从国内镜像下载到配置避坑指南(附清华/中科大源)

本文提供详细的Qt6安装与配置指南,重点介绍如何利用清华大学、中国科学技术大学等国内镜像源解决下载速度慢的问题。内容涵盖在线安装器获取、组件选择策略、环境变量配置以及常见编译与部署问题的排查方法,旨在帮助国内开发者高效、顺畅地完成Qt6开发环境搭建。

weixin_29281915的博客 633

IM框架搭建第二阶段:长连接、编解码、分发与存储实战

在即时通讯(IM)系统的技术栈中,长连接与消息传输的可靠性是架构设计的基础。无论是移动端还是服务端,网络波动、断线重连、数据粘包等问题都直接影响用户体验。为解决这些挑战,技术团队通常围绕连接管理、心跳机制、消息编解码、消息分发与本地存储等核心模块搭建可演进的框架骨架。连接管理器维护连接状态机,心跳与指数退避重连保障链路的持续可用;协议层通过长度前缀法解决TCP粘包拆包,并权衡文本与二进制序列化的适用场景;分发器结合线程模型实现消息的有序、幂等处理;本地存储与会话建模则确保离线消息不丢、会话列表高效加载。这些

weixin_34006965的博客 277

批量读取_MCGS触摸屏如何实现批量读取modbus数据的方法?

前两天,在一个QQ群里,有同行的朋友问,在MCGS中如何实现批量读取数据,因为他当时面临设备,通讯协议才是MODBUS RTU,同时厂家说地址不能分开读,必须是连续的。鉴于他提供的消息是能够设置的地方都试过了。为此,我直接告诉通过脚本,批量读取的方案。那么这个方案究竟如何实现?且看我下面慢慢道来。一、工具1.modsim:仿真PLC或者第三方设备。2.MCGS组态软件3.串口软件:在电脑中生成两不...

weixin_32511509的博客 8161

Hook技术之API拦截(API Hook)

Inline Hook就是修改

bobopeng 3万+

AI初识—LLM、Ollama、Llama都是些个啥?

LLM指的是大语言模型(Large Language Model),是一种基于深度学习的模型,能够理解和生成自然语言。它通过大量文本数据进行训练,具备了理解上下文、生成连贯文本和回答问题的能力。著名的LLM包括OpenAI的GPT系列和Google的BERT。在AI技术快速发展的背景下,LLM、Ollama和Llama代表了现代自然语言处理的不同方面。LLM为我们提供了强大的语言理解能力,Ollama为模型的部署和管理提供了便利,而Llama则在效率和多样性上不断推进。

小蜗牛的珍贵百宝箱 4630

uniapp [全端兼容] - 详细实现人脸识别和活体检测功能,实时监测人脸是否进入区域及动作是否正确播报,免费自动提示引导动作及语音,提供提供实名认证、身份证识别、人脸信息采集、刷脸扫脸认证示例代码

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,人脸识别,扫脸认证,人脸认证,活体认证,身份认证,uni-app人脸识别详细教程,如何在app端实现免费人脸识别教程,如何在小程序端做,最好用的插件,安卓ios百度人脸识别、活体检测、人脸采集APP,H5人脸识别带前后摄像头,适合新手看的人脸识别功能教程,详细示例代码源码,有没有免费的,接入百度,阿里云人脸识别,百度,api,活体检测,数据采集,动作提示指引,语音提示指引,报错,无法核验一直出错,根本用

🏆 前端领域优质创作者 1万+

HOOK API技术

HOOk API技术 HOOK学习笔记与心得 奇技淫巧之调试被远程线程注入的DLL windows核心编程_系统消息与自定义钩子hook使用 [Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术] Hook :Microsoft Detours 2.1简介 detours3.0文档 Hook简单实用 detours ...

【黑键】 4583

SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)

本文主要讲述的是三个大的知识点,超详细,涉及到知识点比较多,并且串起来讲解,这也是我在网上搜不到相关资料才自己慢慢研究测试出来的,断断续续耗费了我一周多时间,相信只要你们认真看完,肯定会有所收获; 1、CK11N/CK40N成本发布功能中,系统前台的取数逻辑,涉及到多个采购信息记录、生产版本、货源清单、配额协议等对成本价发布的影响~~!! 2、CK11N与CK40N发布的成本价不一致的问题~~!! 3、如何处理外协加工物料的外协价与BOM组件成本取值不匹配的问题~~!!

风沙的博客 4087

简述API HOOK技术及原理

我们观察内核代码的时候,很多时候一些函数调用都初始化的时候设置成回调函数的,例如上一个例子读取文件目录,那么proc有自己独有的读取目录处理函数,相对于的ext4、ceph、hpfs等等文件系统都有自己的处理函数,那么getdents的时候如何能调用到正确的处理函数呢?而在应用程序建立套接字的时候选择了v4还是v6,都是同一个系统调用(sys_socket),只是传入的参数是不一样的,那么内核根据传参的差异,灵活的选择使用不同函数来初始化套接字,不同的函数又使用各自对应的结构体来初始化后续的调用函数。

bing1564的博客 3309

S32K144 UDSdoCAN 升级刷写实现笔记

本篇旨在描述如何开发“车规级”的软件升级程序,通过在S32K144平台上实现基于UDSdoCAN的刷写升级功能,带你一步步建立安全升级的“工程思维”,在这里既能收获经验还能获得工程源码、测试脚本,助你起飞,避坑提速!

汽车电子软件领域知识分享 811

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 81
上一篇: 如何在Asp.net中使用HtmlArea编辑器
下一篇: My Toy Lua Debugger
skyremember
博客等级 码龄20年 204粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值