CN115952491B - hook目标函数的方法、装置、电子设备及介质 - Google Patents
hook目标函数的方法、装置、电子设备及介质 Download PDFInfo
- Publication number
- CN115952491B CN115952491B CN202211732560.7A CN202211732560A CN115952491B CN 115952491 B CN115952491 B CN 115952491B CN 202211732560 A CN202211732560 A CN 202211732560A CN 115952491 B CN115952491 B CN 115952491B
- Authority
- CN
- China
- Prior art keywords
- function
- instruction
- designated
- jump
- executing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种hook目标函数的方法、装置、电子设备及介质,涉及数据安全技术领域,在执行目标函数时,根据目标函数中的第一跳转指令跳转至第一指定函数;在执行第一指定函数时,根据第一指定函数中的第二跳转指令跳转至第二指定函数,以通过第二指定函数对目标函数进行hook,其中,目标函数、第一指定函数以及第二指定函数三个函数接口相同,通过hook的方式对目标函数中的数据进行保护。
Description
技术领域
本发明涉及数据安全技术领域,尤其涉及一种hook目标函数的方法、装置、电子设备及介质。
背景技术
随着网络信息化的发展,人们对数据安全的重视程度也越来越高,为了保护计算机软件数据不因偶然和恶意的原因遭到破坏、更改和泄露,需要采取一些措施来确保网络数据的可用性、完整性和保密性。传统的函数保护方法,一般都是基于整个应用或者代码段的,而实际中,可能存在部分应用或部分代码段非常重要,因此,这部分应用或部分代码段被攻击时存在风险需要被保护,而其他应用或代码段则不需要被保护的情况,如果对所有应用和代码段都进行保护,会造成资源的浪费。
例如,Hook(钩子)函数是一个处理消息的代码段,采用Hook函数可以钩住目标函数,此时如果有其他函数向该目标函数发送消息时,不会先运行该目标函数,而是先运行Hook函数,在Hook函数运行过程中,可以先对传递给目标函数的消息进行加工处理再传递给该目标函数,也可以直接将该消息传递给目标函数,也可以强制结束该消息的传递。
由于Go语言动态栈扩容/缩容机制的复杂性,当前并没有一个成的Go语言环境下的机器指令级的hook方案。
发明内容
本发明提供一种hook目标函数的方法、装置、电子设备及介质,旨在解决上述技术问题。
为解决上述技术问题,本发明第一方面提供一种hook目标函数的方法,所述hook目标函数的方法包括:在执行所述目标函数时,根据所述目标函数中的第一跳转指令跳转至第一指定函数;在执行所述第一指定函数时,根据所述第一指定函数中的第二跳转指令跳转至第二指定函数,以通过所述第二指定函数对所述目标函数进行hook,其中,所述目标函数、所述第一指定函数以及所述第二指定函数三个函数接口相同。
通过hook的方式对目标函数中的数据进行保护,上述三个函数中的函数接口一致,确保了hook过程的顺利执行。
可选地,所述在执行所述第一指定函数时,根据所述第一指定函数中的第二跳转指令跳转至第二指定函数,包括:在执行所述第一指定函数时,检测调用对象是否是所述第二指定函数;若所述调用对象不是所述第二指定函数,则根据所述第一指定函数中的所述第二跳转指令跳转至所述第二指定函数。
可选地,所述方法还包括:在执行所述第一指定函数时,检测调用对象是否为所述第二指定函数;若所述调用对象是所述第二指定函数,则根据所述第一指定函数中的第三跳转指令跳转至所述第一指定函数的第一预设字段,执行所述第一指定函数的所述第一预设字段字段中的指令。
上述步骤判断函数后,再执行对应的指令,防止执行函数时出现死循环。
可选地,所述在执行所述目标函数时,跳转至第一指定函数之前,还包括:获取待处理的原函数;获取所述原函数中第二预设字段的代码,并将所述原函数中所述第二预设字段的代码处理为覆盖指令,并将所述覆盖指令写入第一指定函数的第一预设字段;将所述原函数的第二预设字段的代码用第一跳转指令数代替,获得目标函数。
可选地,所述目标函数中依次包括第一跳转指令和原函数机器指令。
可选地,所述第一指定函数的第三预设字段中存储有第四跳转指令,所述第三预设字段为所述第一预设字段后一字段,所述方法还包括:在执行完所述第一预设字段中的覆盖指令后,执行所述第三预设字段中存储的所述第四跳转指令,跳转至所述原函数机器指令的位置,并执行所述原函数机器指令。
可选地,所述在执行所述目标函数时,跳转至第一指定函数之前,还包括:获取栈空间容量;在所述栈空间容量低于预设容量时,触发栈扩容。
栈扩容后的新栈,可以确保后续函数或者指令的执行,不至于在栈上发生拥堵。
本发明第二方面提供一种hook目标函数的装置,所述hook目标函数的装置包括:第一跳转模块,用于在执行所述目标函数时,跳转至第一指定函数;第二跳转模块,用于在执行所述第一指定函数后,跳转至第二指定函数,以通过所述第二指定函数对所述目标函数进行hook,其中,所述目标函数、所述第一指定函数以及所述第二指定函数三个函数接口相同。
本发明第三方面提供一种电子设备,所述电子设备包括:一个或多个处理器;存储器;一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个应用程序配置用于执行第一方面所述的方法。
本发明第四方面提供一种计算机可读存储介质,所述计算机可读取存储介质中存储有程序代码,所述程序代码可被处理器调用执行第一方面所述的方法。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图:
图1示出了现有技术提供的hook函数的方法的流程示意图;
图2示出了本发明一个实施例提供的hook目标函数的方法的流程示意图;
图3示出了本发明另一个实施例提供的hook目标函数的方法的流程示意图;
图4示出了本发明另一个实施例提供的hook目标函数的方法的流程示意图;
图5示出了本申请一实施例提供的hook目标函数的装置的框图;
图6示出了本申请实施例的用于执行根据本申请实施例的hook目标函数的方法的电子设备的框图;
图7示出了本申请实施例的用于保存或者携带实现根据本申请实施例的hook目标函数的方法的程序代码的存储单元。
具体实施方式
下面详细描述本申请的实施方式,实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性地,仅用于解释本申请,而不能理解为对本申请的限制。
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。。
随着网络信息化的发展,人们对数据安全的重视程度也越来越高,为了保护计算机软件数据不因偶然和恶意的原因遭到破坏、更改和泄露,需要采取一些措施来确保网络数据的可用性、完整性和保密性。传统的函数保护方法,一般都是基于整个应用或者代码段的,而实际中,可能存在部分应用或部分代码段非常重要,因此,这部分应用或部分代码段被攻击时存在风险需要被保护,而其他应用或代码段则不需要被保护的情况,如果对所有应用和代码段都进行保护,会造成资源的浪费。
Hook(钩子)函数是一个处理消息的代码段,采用Hook函数可以钩住目标函数,此时如果有其他函数向该目标函数发送消息时,不会先运行该目标函数,而是先运行Hook函数,在Hook函数运行过程中,可以先对传递给目标函数的消息进行加工处理再传递给该目标函数,也可以直接将该消息传递给目标函数,也可以强制结束该消息的传递。因此,现有技术中采用hook的方式对数据进行保护。例如,java语言的编译输出/执行文件.class文件是字节码文件。jvm提供了性能剖析机制,在执行字节码文件前,允许agent程序修改字节码文件。APM(Application Performance Management,应用性能管理)工具程序以agent的方式,将监控代码嵌入目标方法的入口和出口,实现性能监控。具体过程如下:
1).在事务开始时,通过埋点方法捕获,创建一个记录事务执行数据的对象.
2).在事务执行过程中通过埋点抓取相关参数,记录到事务数据对象.
3).在事务的执行过程中,通过埋点方法,在有子过程开始时,创建一个记录子过程执行数据的对象.
4).子过程执行中,通过埋点方法,捕获子过程执行的关键参数,记录到子过程执行数据对象。
5).通过埋点方法,在子过程执行结束时,,得到子过程的执行性能,记录到子过程执行数据对象。
6).通过埋点方法捕获事务事件,得到事务的执行性能。
但是,现有技术中存在如下问题:
1).手动埋点会导致用户业务之外的学习成本增加,引发抵触情绪。
2).由于埋点过程复杂,手动埋点错误容易导致应用程序的内存泄漏等问题。
3).手动埋点的侵入性太强,不利于应用的维护。
4).由于人事变动等原因,没有开发者参与手动嵌码开发,或者外包原因,使用者不了解代码,诸如此类,导致手动埋点可行性很低。
现有技术还提供一种方式,以被hook的函数为原函数为例,如图1所示,图中包括四个组成部分,成为四个角色,角色1为原函数,原函数由JMP指令和原函数机器指令组成。角色2为Hook函数,Hook函数由Hook函数的机器指令组成。角色3为trampoline内存,trampoline内存由被覆盖指令的等效指令、JMP指令、NOP和长跳转指令组成。角色4为访问原函数功能的函数指针组成,函数指针中包括trampoline内存中地址和指令的对应关系。图1中的hook过程为,在原函数的地址前2G或者原函数地址的后2G分配一块内存,作为trampoline内存。在原函数开始部分的代码写入trampoline内存中的开始地址D中。在执行原函数时,根据原函数中的JMP指令,跳转至trampoline内存短地址E。在执行trampoline内存中写入的跳转指令时,跳转至原函数的地址B处。在执行trampoline内存中的长跳转指令时,跳转至Hook函数的地址C处。其中,上述的角色均为Go语言下编写的函数。执行跳转的函数为C语言函数。
但是,上述现有的hook方案中存在如下问题:
1)Go语言的二进制调用接口与C语言的二进制接口不一致,无法用C函数直接hook。
2)在使用trampoline内存时,Go语言在垃圾回收时和栈扩容时会寻找Go语言函数的函数指令描述数据,根据指令指针位置确定当前栈帧。如果在GC(Garbage Collection,垃圾回收)发生时,地址指针恰好在trampoline内存中,受限于trampoline内存本身,这种情况GC过程中无法通过指令地址找到有效的函数信息(因为没有meta数据),也就无法定位当前函数的上一级调用栈帧信息,因此会抛出panic错误。
本发明通过下述实施例对hook目标函数的方法、装置、电子设备及介质进行解释说明。
实施方式一:
本实实施方式提供一种hook目标函数的方法,该方法应用于如图5所示的hook目标函数的装置100、如图6所示的配置有hook目标函数的装置100的电子设备200以及如图7所示的计算机可读存储介质400。本实实施方式以该hook目标函数的方法应用于电子设备为例进行说明,其中,电子设备可以包括但不限于智能手机、平板电脑、膝上型便携计算机、台式计算机、可穿戴式电子设备、物理服务器和云服务器等。下面针对图2所示流程进行详细的阐述,所述hook目标函数的方法具体可以包括如下步骤:
步骤S110、在执行所述目标函数时,根据所述目标函数中的第一跳转指令跳转至第一指定函数。
其中,目标函数指的是被hook的函数。根据hook需求,被hook的函数不能直接执行,或者是不能执行。
电子设备通过监听函数对目标函数进行监听。
在一种实施方式中,对监听函数的参数配置为监听目标函数,可以理解的是,上述配置配置了监听函数的监听对象。例如,监听函数可以为watch函数。当计算机内正在运行目标函数时,监听函数便可监听到该运行事件,以此监听目标函数。监听函数监听到目标函数,可以理解为目标函数正在被执行。
在另一种实施方式中,电子设备上除目标函数,还有很多其他函数。为监听目标函数,可以对监听函数的参数配置为电子设备上所有函数。例如,监听函数可以为watch函数。通过监听函数监听电子设备上的所有函数。当监听到的函数为目标函数时,确定目标函数正在执行。
目标函数是需要被hook的函数,在目标函数执行时,为了对目标函数进行检测,或者不执行目标函数,需要将正在执行的目标函数跳转到到其他函数上。例如,根据目标函数上的第一跳转指令跳转至第一指定函数,其中,第一跳转指令可以为JMP指令。第一指定函数为trampoline函数。
trampoline函数相较于现有技术中的trampoline内存,无需配置地址指针与内存空间之间的对应关系,因此,trampoline函数也不存在trampoline内存带来的GC问题,也不存在因为无meta数据而找不到有效信息的问题。
步骤S120、在执行所述第一指定函数时,根据所述第一指定函数中的第二跳转指令跳转至第二指定函数,以通过所述第二指定函数对所述目标函数进行hook,其中,所述目标函数、所述第一指定函数以及所述第二指定函数三个函数接口相同。
其中,第一指定函数用于跳转,例如,用于跳转至目标函数或第二指定函数,可以理解的是,第一指定函数为第二指定函数与目标函数之间的跳转媒介。
可选地,第二指定函数为hook函数,第二指定函数中包括hook函数机器指令。hook函数机器指令用于实现对目标函数的hook。示例性的,该hook内容为,在跳转至第二指定函数后,执行hook函数机器指令,在该场景下,表示通过执行hook函数机器指令,截断目标函数的执行,可以实现对目标函数的保护。示例性的,该hook内容为,跳转至第二指定函数后,第二指定函数中包括JMP指令,该JMP指令指示跳转至第一指定函数,再由第一指定函数跳回目标函数。该场景下,用于对目标函数的监控,或者延迟目标函数执行。
本实施方式提供一种hook目标函数的方法,在执行目标函数时,根据目标函数中的第一跳转指令跳转至第一指定函数;在执行第一指定函数时,根据第一指定函数中的第二跳转指令跳转至第二指定函数,以通过第二指定函数对目标函数进行hook,其中,目标函数、第一指定函数以及第二指定函数三个函数接口相同,通过hook的方式对目标函数中的数据进行保护,上述三个函数中的函数接口一致,确保了hook过程的顺利执行。第一指定函数使用的栈空间为0,可以避免上述现有技术中trampolin内存导致的GC问题。
实施方式二:
本实施例提供一种hook目标函数的方法,如图3所示,所述hook目标函数的方法具体可以包括如下步骤:
步骤S210、在执行所述目标函数时,根据所述目标函数中的第一跳转指令跳转至第一指定函数。
其中,所述步骤S210的描述可以参见上一实施例中步骤S110的描述,在此不再赘述。
步骤S220、在执行所述第一指定函数时,检测调用对象是否是所述第二指定函数。
若所述调用对象不是所述第二指定函数,表示调用对象为第一指定函数,为了防止死循环,则流程进入步骤S230,执行第二指定函数。反之,若所述调用对象是所述第二指定函数,为了避免死循环,则流程进入步骤S240,执行目标函数。。
步骤S230、根据所述第一指定函数中的所述第二跳转指令跳转至所述第二指定函数。
可以理解的是,将原本需要执行的目标函数切换为执行第二指定函数,实现hook。
步骤S240、根据所述第一指定函数中的第三跳转指令跳转至所述第一指定函数的第一预设字段,执行所述第一指定函数的所述第一预设字段字段中的指令。
实施方式三:
可选地,在步骤S210之前,所述方法还包括:获取待处理的原函数;
获取所述原函数中第二预设字段的代码,并将所述原函数中所述第二预设字段的代码处理为覆盖指令,并将所述覆盖指令写入第一指定函数的第一预设字段。将所述原函数的第二预设字段的代码用第一跳转指令数代替,获得目标函数。可以理解的是,原函数包括在第二预设字段的代码和第二预设字段之后的原函数机器指令。第二预设字段的长度可以为一个跳转指令的长度。将第二预设字段的代码处理为覆盖指令,并且写入第一指定函数的第一预设字段。可以理解的是,在执行第二预设字段代码和执行第一预设字段中的覆盖指令达到的效果是一致的,由于格式等等问题,需要将第二预设字段的代码处理为覆盖指令。
可选地,所述方法还包括:获取栈空间容量;在所述栈空间容量低于预设容量时,为了保证后续函数或指令被顺利执行,触发栈扩容。例如,newstack()函数首先通过栈底地址与栈顶地址计算出旧栈的大小,并计算新栈的大小,新栈大小可以为旧栈的两倍大,实现栈扩容。栈扩容后的新栈,可以确保后续函数或者指令的执行,不至于在栈上发生拥堵。
实施方式四:
本实施例提供一种hook目标函数的方法,原函数包括第一预设字段的代码和原函数机器指令两部分,第一预设字段的代码用第一跳转指令覆盖,也就是说,如图4所示,目标函数包括第一跳转指令和原函数机器指令。第一预设字段的代码处理为覆盖指令后存入第一指定函数的头部,第一指定函数依次包括覆盖指令、第三预设字段中的第四跳转指令、NOP、判断指令、第二跳转指令和第三跳转指令。第二指定函数包括hook函数机器指令。所述第三预设字段为所述第一预设字段后一字段。其中,图4中的目标函数、第一指定函数以及第二指定函数均可以是Go语言编写的。所述hook目标函数的方法包括:
目标函数从地址A处开始执行,在执行目标函数时,根据所述目标函数中的第一跳转指令跳转至第一指定函数,如图4所示,跳转至第二指定函数的地址E处,地址E处为NOP函数,其中NOP函数可以理解为空操作指令。按照第一指定函数中的顺序执行第一指定函数,在执行所述第一指定函数时,根据所述第一指定函数中的第二跳转指令跳转至第二指定函数,即跳转至第二指定函数的C处,通过所述第二指定函数对所述目标函数进行hook,即执行hook函数机器指令。其中,所述目标函数、所述第一指定函数以及所述第二指定函数三个函数接口相同。三个函数接口均可以为ABI接口,接口相同,避免了现有技术中无法hook的问题。
在执行完D处第一预设字段中的覆盖指令后,执行所述第三预设字段中存储的所述第四跳转指令,跳转至所述原函数机器指令的位置,如图4所示,跳转至B处,并执行所述原函数机器指令。
实施方式五:
为实现上述方法类实施例,本发明还提供一种hook目标函数的装置,如图5所示,hook目标函数的装置100包括:第一跳转模块110以及第二跳转模块120;
第一跳转模块110,用于在执行所述目标函数时,跳转至第一指定函数;
第二跳转模块120,用于在执行所述第一指定函数后,跳转至第二指定函数,以通过所述第二指定函数对所述目标函数进行hook,其中,所述目标函数、所述第一指定函数以及所述第二指定函数三个函数接口相同。
可选地,第二跳转模块120包括:第一检测模块以及第一跳转子模块;
第一检测模块,用于在执行所述第一指定函数时,检测调用对象是否是所述第二指定函数;
第一跳转子模块,用于若所述调用对象不是所述第二指定函数,则根据所述第一指定函数中的所述第二跳转指令跳转至所述第二指定函数。
可选地,hook目标函数的装置100还包括:第二检测模块以及第二跳转子模块;
第二检测模块,用于在执行所述第一指定函数时,检测调用对象是否为所述第二指定函数;
第二跳转子模块,用于若所述调用对象是所述第二指定函数,则根据所述第一指定函数中的第三跳转指令跳转至所述第一指定函数的第一预设字段,执行所述第一指定函数的所述第一预设字段字段中的指令。
可选地,hook目标函数的装置100还包括:第一获取模块、第二获取模块以及代替模块;
第一获取模块,用于获取待处理的原函数;
第二获取模块,用于获取所述原函数中第二预设字段的代码,并将所述原函数中所述第二预设字段的代码处理为覆盖指令,并将所述覆盖指令写入第一指定函数的第一预设字段;
代替模块,用于将所述原函数的第二预设字段的代码用第一跳转指令数代替,获得目标函数。
可选地,所述目标函数中依次包括第一预设字段的代码、第一跳转指令和原函数机器指令。
可选地,所述第一指定函数的第三预设字段中存储有第四跳转指令,所述第三预设字段为所述第一预设字段后一字段,hook目标函数的装置100还包括:覆盖模块;
覆盖模块,用于在执行完所述第一预设字段中的覆盖指令后,执行所述第三预设字段中存储的所述第四跳转指令,跳转至所述原函数机器指令的位置,并执行所述原函数机器指令。
可选地,hook目标函数的装置100还包括:容量获取模块以及扩容模块;
容量获取模块,用于获取栈空间容量;
扩容模块,用于在所述栈空间容量低于预设容量时,触发栈扩容。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述装置中模块/单元/子单元/组件的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,所显示或讨论的模块相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
另外,在本申请各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
实施方式六:
图6示出了本申请实施例的用于执行根据本申请实施例的hook目标函数方法的电子设备的框图,请参阅图6,其示出了本申请实施例提供的一种电子设备,该电子设备200可以包括处理器231、通信模块232、存储器233和总线。总线可以是ISA总线、PCI总线、EISA总线、CAN总线等。总线可以分为地址总线、数据总线、控制总线等。其中:
存储器233,用于存放程序。具体地,存储器233可用于存储软件程序以及各种数据。存储器233可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作至少一个功能所需的程序可以包括程序代码,程序代码包括计算机操作指令。除了存放程序之外,存储器233还可以暂存通信模块232需要发送的消息等。存储器233可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个固态硬盘(SolidState Disk,简称SSD)。
处理器231用于执行存储器233存放的程序。程序被处理器执行时实现上述各实施例的页面显示方法的步骤。
本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述各实施例的页面显示方法的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,的计算机可读存储介质,如只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、SSD、带电可擦可编程只读存储器(Electrically Erasable Programmable readonly memory,简称EEPROM)或快闪存储器(Flash Memory,简称Flash)等。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、SSD、Flash)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本申请各个实施例的方法。
实施方式七:
图7示出了本申请实施例的用于保存或者携带实现根据本申请实施例的hook目标函数方法的程序代码的存储单元,请参阅7,其示出了本申请实施例提供的一种计算机可读存储介质的结构框图。该计算机可读介质400中存储有程序代码,所述程序代码可被处理器调用执行上述方法实施例中所描述的方法。
计算机可读存储介质400可以是诸如闪存、EEPROM(电可擦除可编程只读存储器)、EPROM、硬盘或者ROM之类的电子存储器。可选地,计算机可读存储介质400包括非易失性计算机可读介质(non-transitory computer-readable storage medium)。计算机可读存储介质400具有执行上述方法中的任何方法步骤的程序代码410的存储空间。这些程序代码可以从一个或者多个计算机程序产品中读出或者写入到这一个或者多个计算机程序产品中。程序代码410可以例如以适当形式进行压缩。
本申请还提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述步骤。
综上所述,本发明公开了一种hook目标函数的方法、装置、电子设备及介质,在执行目标函数时,根据目标函数中的第一跳转指令跳转至第一指定函数;在执行第一指定函数时,根据第一指定函数中的第二跳转指令跳转至第二指定函数,以通过第二指定函数对目标函数进行hook,其中,目标函数、第一指定函数以及第二指定函数三个函数接口相同,通过hook的方式对目标函数中的数据进行保护。
本发明是通过几个具体实施例进行说明的,本领域技术人员应当明白,在不脱离本发明范围的情况下,还可以对本发明进行各种变换和等同替代。另外,针对特定情形或具体情况,可以对本发明做各种修改,而不脱离本发明的范围。因此,本发明不局限于所公开的具体实施例,而应当包括落入本发明权利要求范围内的全部实施方式。
Claims (8)
1.一种hook目标函数的方法,其特征在于,所述方法包括:
在执行所述目标函数时,根据所述目标函数中的第一跳转指令跳转至第一指定函数,所述目标函数中依次包括所述第一跳转指令和原函数机器指令;
在执行所述第一指定函数时,检测调用对象是否是第二指定函数;
若所述调用对象不是所述第二指定函数,则根据所述第一指定函数中的第二跳转指令跳转至所述第二指定函数,以通过所述第二指定函数对所述目标函数进行hook,其中,所述目标函数、所述第一指定函数以及所述第二指定函数三个函数接口相同;以及
若所述调用对象是所述第二指定函数,则:
根据所述第一指定函数中的第三跳转指令跳转至所述第一指定函数的第一预设字段,执行所述第一预设字段中的指令,其中,所述第一预设字段中的指令为原函数中被所述第一跳转指令覆盖的指令;以及
在执行所述第一预设字段中的指令后,执行第四跳转指令以跳转至所述原函数机器指令,并执行所述原函数机器指令。
2.根据权利要求1所述的hook目标函数的方法,其特征在于,所述在执行所述目标函数时,跳转至第一指定函数之前,还包括:
获取待处理的原函数;
获取所述原函数中第二预设字段的指令,并将所述原函数中所述第二预设字段的指令处理为覆盖指令,并将所述覆盖指令写入第一指定函数的第一预设字段,其中,所述第二预设字段始于所述原函数的入口地址;
将所述原函数的第二预设字段的指令用第一跳转指令代替,获得目标函数,其中,所述第一跳转指令始于所述目标函数的入口地址。
3.根据权利要求1所述的hook目标函数的方法,其特征在于,所述第一跳转指令始于所述目标函数的入口地址。
4.根据权利要求2所述的hook目标函数的方法,其特征在于,所述第一指定函数的第三预设字段中存储有所述第四跳转指令,所述第三预设字段位于所述第一预设字段之后,所述第一预设字段始于所述第一指定函数的入口地址。
5.根据权利要求1所述的hook目标函数的方法,其特征在于,所述在执行所述目标函数时,跳转至第一指定函数之前,还包括:
获取栈空间容量;
在所述栈空间容量低于预设容量时,触发栈扩容。
6.一种hook目标函数的装置,其特征在于,所述装置包括:
第一跳转模块,用于在执行所述目标函数时,根据所述目标函数中的第一跳转指令跳转至第一指定函数,所述目标函数中依次包括所述第一跳转指令和原函数机器指令;
用于在执行所述第一指定函数时,检测调用对象是否是第二指定函数的模块;
第一跳转子模块,用于若所述调用对象不是所述第二指定函数,根据所述第一指定函数中的第二跳转指令跳转至所述第二指定函数,以通过所述第二指定函数对所述目标函数进行hook,其中,所述目标函数、所述第一指定函数以及所述第二指定函数三个函数接口相同;
第二跳转子模块,用于若所述调用对象是所述第二指定函数,则:
根据所述第一指定函数中的第三跳转指令跳转至所述第一指定函数的第一预设字段,执行所述第一预设字段中的指令,其中,所述第一预设字段中的指令为原函数中被所述第一跳转指令覆盖的指令;以及
在执行所述第一预设字段中的指令后,执行第四跳转指令以跳转至所述原函数机器指令,并执行所述原函数机器指令。
7.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个应用程序配置用于执行如权利要求1~5任一项所述的方法。
8.一种计算机可读存储介质,其特征在于,所述计算机可读取存储介质中存储有程序代码,所述程序代码可被处理器调用执行如权利要求1~5任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211732560.7A CN115952491B (zh) | 2022-12-30 | 2022-12-30 | hook目标函数的方法、装置、电子设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211732560.7A CN115952491B (zh) | 2022-12-30 | 2022-12-30 | hook目标函数的方法、装置、电子设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115952491A CN115952491A (zh) | 2023-04-11 |
CN115952491B true CN115952491B (zh) | 2023-09-29 |
Family
ID=87285723
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211732560.7A Active CN115952491B (zh) | 2022-12-30 | 2022-12-30 | hook目标函数的方法、装置、电子设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115952491B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118152044A (zh) * | 2024-05-10 | 2024-06-07 | 海马云(天津)信息技术有限公司 | 非根权限挂钩Java方法的方法与装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106919458A (zh) * | 2015-12-25 | 2017-07-04 | 腾讯科技(深圳)有限公司 | Hook目标内核函数的方法及装置 |
CN107943517A (zh) * | 2017-10-26 | 2018-04-20 | 北京奇虎科技有限公司 | 终端应用的挂钩方法及装置 |
CN110554998A (zh) * | 2018-03-30 | 2019-12-10 | 腾讯科技(深圳)有限公司 | 一种通过替换函数内部指令的钩子方法、装置、终端及存储介质 |
CN115017058A (zh) * | 2022-08-04 | 2022-09-06 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102156661B (zh) * | 2010-02-11 | 2013-06-12 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
US9465717B2 (en) * | 2013-03-14 | 2016-10-11 | Riverbed Technology, Inc. | Native code profiler framework |
-
2022
- 2022-12-30 CN CN202211732560.7A patent/CN115952491B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106919458A (zh) * | 2015-12-25 | 2017-07-04 | 腾讯科技(深圳)有限公司 | Hook目标内核函数的方法及装置 |
CN107943517A (zh) * | 2017-10-26 | 2018-04-20 | 北京奇虎科技有限公司 | 终端应用的挂钩方法及装置 |
CN110554998A (zh) * | 2018-03-30 | 2019-12-10 | 腾讯科技(深圳)有限公司 | 一种通过替换函数内部指令的钩子方法、装置、终端及存储介质 |
CN115017058A (zh) * | 2022-08-04 | 2022-09-06 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115952491A (zh) | 2023-04-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109284217B (zh) | 应用程序异常处理方法、装置、电子设备及存储介质 | |
CN107948744B (zh) | 接口检测方法、接口检测设备及计算机可读存储介质 | |
US10176327B2 (en) | Method and device for preventing application in an operating system from being uninstalled | |
CN103514075B (zh) | 在移动终端中监控api函数调用的方法和装置 | |
CN110413432B (zh) | 一种信息处理方法、电子设备及存储介质 | |
CN110442502B (zh) | 一种埋点的方法、装置、设备及存储介质 | |
CN112445686A (zh) | 内存泄漏检测方法、装置以及计算机可读存储介质 | |
CN108334415A (zh) | 一种容错处理方法、装置、终端及存储介质 | |
CN115952491B (zh) | hook目标函数的方法、装置、电子设备及介质 | |
CN117573418A (zh) | 针对显存访问异常的处理方法、系统、介质及设备 | |
CN111966603B (zh) | 内存泄露的检测方法及装置、可读存储介质及电子设备 | |
CN110704131B (zh) | 一种html5应用调用原生应用的方法和装置 | |
CN113467981A (zh) | 异常处理的方法和装置 | |
CN115543827A (zh) | 一种埋点数据展示方法及装置 | |
CN109784054B (zh) | 行为堆栈信息获取方法及装置 | |
CN109783261B (zh) | 终端应用的崩溃处理方法及装置、电子设备、存储介质 | |
US11630714B2 (en) | Automated crash recovery | |
CN112416698A (zh) | 监控系统的扩展方法及装置、存储介质及电子设备 | |
CN113609478B (zh) | 一种ios平台应用程序篡改检测方法及装置 | |
CN116719696A (zh) | 应用程序接口数据的监控方法、装置、设备及存储介质 | |
CN112989323B (zh) | 进程检测方法、装置、终端及存储介质 | |
CN111124627A (zh) | 应用程序的调起者确定方法、装置、终端及存储介质 | |
CN111475322A (zh) | 定位stuck线程的方法、装置、计算机设备及可读存储介质 | |
CN108959955B (zh) | 文件处理方法及装置 | |
CN104850551A (zh) | 一种数据处理方法、装置及移动终端 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |