一种Windows下通过HOOK技术实现函数热补丁的方法技术

技术编号:21140534 阅读:44 留言:0更新日期:2019-05-18 05:00
本发明专利技术公开了一种Windows下通过HOOK技术实现函数热补丁的方法,涉及通信技术领域,包括以下步骤:准备两个补丁DLL,其中一个为含有替换函数的真补丁DLL,另一个为含有跳转函数的假补丁DLL;将两个补丁DLL注入到目标进程当中;修改系统函数,使其跳转到替换函数;执行跳转函数,跳转回系统函数,继续系统函数API的执行。本发明专利技术在减少不必要的性能损耗的同时,还提高了HOOK的准确性。

A Method of Implementing Hot Patch of Function by HOOK Technology in Windows

【技术实现步骤摘要】
一种Windows下通过HOOK技术实现函数热补丁的方法
本专利技术涉及通信
,尤其涉及一种Windows下通过HOOK技术实现函数热补丁的方法。
技术介绍
HOOK机制又称钩子机制,挂钩机制,是Windows消息处理机制的一个平台,应用程序可以在上面设置子程(回调函数)以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。现有技术之后,在HOOKWindows的系统API函数的情况下,接管系统API函数并完成相应的处理后,需要再调用原有的系统API函数,这时需要执行反HOOK流程,还原系统API函数。每调用一次系统函数,都需要的执行函数替换/函数还原;当系统函数API被多次执行时,函数替换/函数还原会被反复执行,影响整个目标进程的性能;另外,当系统函数API在多线程中调用,会存在系统函数API被还原的一瞬间,目标进程的函数调用直接调用到了原有系统函数,导致HOOK漏掉,HOOK的准确性降低。
技术实现思路
本专利技术的目的在于提供一种Windows下通过HOOK技术实现函数热补丁的方法,在减少不必要的性能损耗的同时,还提高了HOOK的准确性。为实现上述目的,本专利技术提供如下技术方案:一种Windows下通过HOOK技术实现函数热补丁的方法,其特征在于,包括以下步骤:S1,准备两个补丁DLL,其中一个为含有替换函数的真补丁DLL,另一个为含有跳转函数的假补丁DLL;S2,将两个补丁DLL注入到目标进程当中;S3,修改系统函数,使其跳转到替换函数;S4,执行跳转函数,跳转回系统函数,继续系统函数API的执行。进一步的,所述S3的具体内容为:修改系统函数sendto的前五个字节为第一jmp指令,跳转到替换函数MySendTo。进一步的,所述跳转函数的前5个字节为系统函数sendto修改前的前5个字节,跳转函数的第6至第10个字节为第二jmp指令,跳转到系统函数sendto的第6个字节。进一步的,所述S4后还包括S5,当HOOK功能不再需要时,执行DLL反注入,将两个补丁DLL从目标进程中去除。进一步的,所述DLL反注入的执行通过调用UnhookWindowsHookEx函数实现。进一步的,所述S2中补丁DLL注入通过调用SetWindowsHookEx函数实现。与现有技术相比,本专利技术的有益效果是:本专利技术解决了在函数替换过程中反复替换和还原函数现场的问题,可以做到DLL加载后,只做一次函数替换,就能HOOK原有函数,减少不必要的性能损耗;另外本申请可以调用原有系统函数,在多线程环境下,HOOK准确性100%,因为没有函数还原情况发生。附图说明图1为现有技术的HOOK流程图;图2为本专利技术的HOOK流程图;图3为现有技术HOOK前目标进程加载w2_32.dll的sendto函数的内存图;图4为现有技术HOOK后目标进程加载w2_32.dll和补丁DLL的函数跳转图;图5为本专利技术HOOK后目标进程加载w2_32.dll和两个补丁DLL的函数跳转图。具体实施方式下面对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本专利技术保护的范围。请参照图1,现有的HOOK的流程包括以下步骤:S1,准备一个补丁DLL(比如MyHook.dll),DLL中包含替换函数的集合(比如包含MySendto函数);S2,DLL注入:通过调用SetWindowsHookEx函数,将补丁DLL注入到Windows系统的目标进程(比如a.exe)中,如图3为HOOK前目标进程加载w2_32.dll的sendto函数的内存图(ws2_32.dll是一个系统网络DLL,一个Windows应用中有网络操作,都会默认加载这个dll);S4,函数替换:补丁DLL注入后,修改目标函数地址(比如sendto)的前5个字节,利用JMP(跳转)指令,跳转到修改后的函数。如图4所示,将系统函数sendto的前五个字节修改为jmp到替换函数MySendTo。这样目标进程a.exe调用系统APIsendto的时候,会跳转执行替换函数MySendTo;S5,函数还原:替换函数(MySendTo)做了相应的处理后,需要再执行系统APIsendto将报文发送出去。由于此时sendto已经被替换为MySendTo,所以需要将系统函数APIsendto的函数地址的5个字节还原为第3步修改前的内容,否则会陷入死循环调用MySendTo。调用完系统函数APIsendto之后,需要再次执行S3的函数替换,否则HOOK功能就结束了。因此现有的HOOK需要不停地执行函数替换/函数还原,当系统函数API被多次执行时,函数替换/函数还原被反复执行,影响目标进程的性能。且在多线程调用时,有可能在系统函数API被还原的一瞬间,目标进程的函数调用直接调用到了原有系统函数,导致HOOK漏掉,即HOOK的准确性降低;S6,DLL反注入:当HOOK功能不再需要时,可以通过执行UnhookWindowsHookEx执行DLL反注入,将补丁DLL从目标进程a.exe去除。请参照图2,本实施例提供一种Windows下通过HOOK技术实现函数热补丁的方法,包括以下步骤:S1,准备两个补丁DLL(MyHook.dll和MyHook2.dll),其中MyHook.dll为含有替换函数(MySendto函数)的真补丁DLL,MyHook2.dll为含有跳转函数(MySendTo2函数)的假补丁DLL;S2,DLL注入:通过调用SetWindowsHookEx函数将两个补丁DLL都注入到目标进程(a.exe)当中,如图3为HOOK前目标进程加载w2_32.dll的sendto函数的内存图;S3,函数替换:修改系统函数,使其跳转到替换函数;具体的请参照图5,修改系统函数sendto的前五个字节为第一jmp指令,使其跳转到替换函数MySendTo。这样目标进程a.exe调用系统APIsendto的时候,会跳转执行替换函数MySendTo。S4,执行跳转函数,跳转回系统函数,继续系统函数API的执行。替换函数(MySendTo)做了相应的处理后,需要再执行系统APIsendto将报文发送出去。由于此时sendto已经被替换为MySendTo,可以通过执行假补丁DLL中的函数(MySendTo2)来达到执行系统函数sendto的效果。请继续参照图5,修改假补丁DLL的MySendTo2函数的前10个字节,其中前5个字节修改为系统函数sendto修改前的前5个字节,第6至第10个字节为第二jmp指令,使其跳转到系统函数sendto的第6个字节;修改之后,调用假补丁DLL的HOOK函数(MySendTo2)就相当于调用原有的系统函数API(sendto)。免去了现有的函数还原的操作,提高了目标进程的性能同时可防止因还原而导致HOOK被漏掉。S5,当HOOK功能不再需要时,通过调用UnhookWindowsHookEx函数执行DLL反注入,将两个补丁DLL从目标本文档来自技高网...

【技术保护点】
1.一种Windows下通过HOOK技术实现函数热补丁的方法,其特征在于,包括以下步骤:S1,准备两个补丁DLL,其中一个为含有替换函数的真补丁DLL,另一个为含有跳转函数的假补丁DLL;S2,将两个补丁DLL注入到目标进程当中;S3,修改系统函数,使其跳转到替换函数;S4,执行跳转函数,跳转回系统函数,继续系统函数API的执行。

【技术特征摘要】
1.一种Windows下通过HOOK技术实现函数热补丁的方法,其特征在于,包括以下步骤:S1,准备两个补丁DLL,其中一个为含有替换函数的真补丁DLL,另一个为含有跳转函数的假补丁DLL;S2,将两个补丁DLL注入到目标进程当中;S3,修改系统函数,使其跳转到替换函数;S4,执行跳转函数,跳转回系统函数,继续系统函数API的执行。2.根据权利要求1所述的Windows下通过HOOK技术实现函数热补丁的方法,其特征在于,所述S3的具体内容为:修改系统函数sendto的前五个字节为第一jmp指令,跳转到替换函数MySendTo。3.根据权利要求1所述的Windows下通过HOOK技术实现函数热补丁的方法,其特征在于,所述跳转函数的前5个字节为...

【专利技术属性】
技术研发人员:李宗宇赵飞郑晓峰
申请(专利权)人:杭州云缔盟科技有限公司
类型:发明
国别省市:浙江,33

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1