CN113590360A - 一种实现函数hook的方法、装置、计算机设备及存储介质 - Google Patents

一种实现函数hook的方法、装置、计算机设备及存储介质 Download PDF

Info

Publication number
CN113590360A
CN113590360A CN202110884864.4A CN202110884864A CN113590360A CN 113590360 A CN113590360 A CN 113590360A CN 202110884864 A CN202110884864 A CN 202110884864A CN 113590360 A CN113590360 A CN 113590360A
Authority
CN
China
Prior art keywords
function
hook
target function
address
identifier
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.)
Pending
Application number
CN202110884864.4A
Other languages
English (en)
Inventor
袁耀辉
曹智轶
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Bo Hongyuan Data Polytron Technologies Inc
Original Assignee
Beijing Bo Hongyuan Data Polytron Technologies Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Bo Hongyuan Data Polytron Technologies Inc filed Critical Beijing Bo Hongyuan Data Polytron Technologies Inc
Priority to CN202110884864.4A priority Critical patent/CN113590360A/zh
Publication of CN113590360A publication Critical patent/CN113590360A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种实现函数hook的方法、装置、计算机设备及存储介质。所述方法包括:将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;确定所述标识符对应的hook函数;将所述hook函数注入到所述目标函数地址上,实现函数hook。利用该方法,能够有效获取到静态库中的目标函数地址,扩大了hook的范围。

Description

一种实现函数hook的方法、装置、计算机设备及存储介质
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种实现函数hook的方法、装置、计算机设备及存储介质。
背景技术
一般hook函数需要两个变量,一个是函数的声明方式,用以声明定义钩子函数;一个是被hook函数的地址。对于函数的地址获取,现有技术是通过查询动态库的函数导出符号表来获取进程中对应函数的地址,再通过一些hook库将钩子注入。
现有技术中,通过查询动态库导出符号表获取函数地址局限性较大,当需要hook的函数是动态库中其他未导出的函数,或者是静态库函数,或者是应用内部函数,都无法有效获取到对应的函数地址,从而无法进行函数hook。
发明内容
本发明实施例提供了一种实现函数hook的方法、装置、计算机设备及存储介质,能够有效获取到静态库中的目标函数地址,扩大了hook的范围。
第一方面,本发明实施例提供了一种实现函数hook的方法,包括:
将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;
在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;
确定所述标识符对应的hook函数;
将所述hook函数注入到所述目标函数地址上,实现函数hook。
第二方面,本发明实施例还提供了一种实现函数hook的装置,包括:
写入模块,用于将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;
获取模块,用于在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;
确定模块,用于确定所述标识符对应的hook函数;
注入模块,用于将所述hook函数注入到所述目标函数地址上,实现函数hook。
第三方面,本发明实施例还提供了一种计算机设备,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序;
所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器用于实现本发明任意实施例中所述的实现函数hook的方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所提供的实现函数hook的方法。
本发明实施例提供了一种实现函数hook的方法、装置、计算机设备及存储介质,首先将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;然后在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;之后确定所述标识符对应的hook函数;最后将所述hook函数注入到所述目标函数地址上,实现函数hook。利用上述技术方案,能够有效获取到静态库中的目标函数地址,扩大了hook的范围。
附图说明
图1为本发明实施例一所提供的一种实现函数hook的方法的流程示意图;
图2为本发明实施例二所提供的一种实现函数hook的方法的示例流程图;
图3为本发明实施例三提供的一种实现函数hook的装置的结构示意图;
图4为本发明实施例四所提供的一种计算机设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本发明的实施例。虽然附图中显示了本发明的某些实施例,然而应当理解的是,本发明可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本发明。应当理解的是,本发明的附图及实施例仅用于示例性作用,并非用于限制本发明的保护范围。
应当理解,本发明的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本发明的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
需要注意,本发明中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本发明中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本发明实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
实施例一
图1为本发明实施例一所提供的一种实现函数hook的方法的流程示意图,该方法可适用于对依赖库中的函数进行hook的情况,该方法可以由一种实现函数hook的装置来执行,其中该装置可由软件和/或硬件实现,并一般集成在计算机设备上。
如图1所示,本发明实施例一提供的一种实现函数hook的方法,包括如下步骤:
S110、将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取。
其中,目标函数可以为用户希望hook的函数,目标函数可以为动态库的导出函数、动态库的未导出函数、类的静态成员函数、类的常规函数等。其中,类可以为面向对象编程的一种抽象概念,可以理解为数据和函数的一种聚合。在本实施例中,对目标函数的个数不作具体限制。
其中,目标函数地址的标识符可以为一种标志性的符号,标识符可以为标识函数地址的函数声明,例如枚举类型。标识符的作用为在之后进行hook函数时可以通过标识符区分目标函数地址的具体类型。需要说明的是,此处仅通过目标函数地址无法识别函数签名,函数签名即函数声明。
在本实施例中,预设前置头文件可以为预先设置好的一个头文件,头文件的主要作用在于多个代码文件全局变量的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。需要说明的是,hook不同的库时引入的预设前置头文件也是不尽相同的。在编译期,用户可以主动引入一个预设前置头文件到主程序中,通过一个预设前置头文件来获取其他非动态库导出的目标函数地址,来配合之后的hook操作。
进一步的,从所述预设前置头文件中获取所述目标函数地址之后,还包括:在所述预设前置头文件中声明一个单例类的静态实例;在所述静态实例初始化时,调用单例类的构造函数;在所述构造函数中,根据目标函数名称获取对应的目标函数地址。
其中,预设前置头文件声明一个单例类的静态实例后,可以依赖应用软件启动初始化全局静态数据的特性,由此可以在构造函数中添加一些主函数之前的执行逻辑。需要解释的是,静态数据是代码定义变量的一种,静态数据可以在进程启动最开始进行初始化,在进程关闭最后进行析构。构造函数为类的一个特殊函数,在单例类的静态实例初始化的时候可以自动调用构造函数。
在本实施例中,共享内存可以为预设前置头文件进行申请后得到的。在获取到目标函数地址后,可以通过预设前置头文件申请一块共享内存。其中,对申请共享内存的方式不作限定,示例性的,可以通过windows的应用程序编程接口申请共享内存。需要说明的是,共享内存是为了共享目标函数地址和目标函数地址的标识符,共享内存内可以包括多个函数地址。
在本实施例中,根据目标函数名称获取对应的目标函数地址是常规手段,此处不作赘述。
S120、在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符。
在本实施例中,hook条件可以为用户想要hook函数。满足hook条件即用户想要hook函数时,在用户希望hook函数的地方,打开共享内存,从共享内存中获取目标函数地址和标识符。需要说明的是,用户希望hook函数的地方通常可以是其他的动态库。
S130、确定所述标识符对应的hook函数。
在本实施例中,hook函数可以为一种用于包装目标函数的函数。在某些业务场景下,需要分析一个函数即目标函数的执行耗,但是又不能更改这个函数内部的代码,那么可以通过hook这个函数来达到这个目的。hook的意思是在这个函数之外再包装一层函数,这样在每个调用目标函数的地方都会首先调用到我们添加的hook函数里,在hook函数里再调用目标函数。
具体的,确定所述标识符对应的hook函数的过程可以为:通过目标函数的标识符找到对应函数签名即对应声明的hook函数。其中,钩子函数与目标函数的函数签名相同才能对该目标函数进行hook。
S140、将所述hook函数注入到所述目标函数地址上,实现函数hook。
在本实施例中,将不同声明的hook函数注入对应的目标函数地址,从而可以实现函数hook。
本发明实施例一提供的一种实现函数hook的方法,首先将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;然后在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;之后确定所述标识符对应的hook函数;最终将所述hook函数注入到所述目标函数地址上,实现函数hook。利用上述方法,能够hook任何编译期能够访问到的函数,在动态库未将函数导出或依赖库未静态库时,依然可以对依赖库中的目标函数进行hook。
进一步的,所述共享内存为通过所述预设前置头文件申请后得到的。
在本实施例中,共享内存可以通过预设前置头文件申请后得到,通过调用预设前置头文件即可以申请一个共享内存。
进一步的,所述预设前置头文件编译在主程序的可执行文件中,所述预设前置头文件为与hook库对应的头文件。
在本实施例中,预设前置头文件编译在主程序的可执行文件中,因此,预设前置头文件可以有效的获取任意在编译期可访问的函数的地址。
进一步的,将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,包括:通过所述预设前置头文件将所述目标函数地址对应的函数声明进行标识,得到标识符;通过所述预设前置头文件将所述标识符写入所述共享内存中。
在本实施例中,将所述目标函数地址对应的函数声明进行标识可以理解为将目标函数地址与声明的标识符即函数签名捆绑在一起。示例性的,若目标函数地址为A=0x2234,声明一个函数类型Func_Type即标识符,写入共享内存中的内容为目标函数地址与标识符的组合{0x2234,Func_Type}。
进一步的,所述目标函数包括:静态库函数、动态库未导出函数、动态库导出函数、全局函数、类的静态成员函数以及类的普通成员函数中的一个或多个。
其中,静态库是动态库的对立,静态库可以在编译期添加到执行文件内,静态库代码可以打包到exe文件中,因此不存在dll文件。动态库未导出函数为动态库中未声明导出的函数。全局函数是定义在类外的函数,可以被其他文件中的函数调用。
在本实施例中,目标函数还包括动态库函数以外的其他类型的函数,目标函数类型的多样性扩大了hook的范围。
进一步的,在所述主程序对应的应用软件关闭时,在单例类的析构函数中释放申请的共享内存。
其中,析构函数为类的一个特殊函数,析构函数在类实例析构的时候可以自动调用。
在本实施例中,当应用软件关闭时,可以依赖应该关闭最后构全局静态数据的特性,在单例类的析构函数中释放申请的共享内存,该操作可以避免造成系统句柄泄露。
本发明实施例一提供的一种实现函数hook和方法,该方法的具体执行过程如下:在预设前置头文件中获取到目标函数地址,然后将目标函数地址和标识函数地址的一个特殊值即标识符一起写入共享内存,共享内存是为了共享目标函数地址和标识符。接着在希望hook函数的地方,打开这个共享内存,拿出目标函数地址和标识符,通过标识符,找到对应函数签名的hook函数,将对应的hook函数注入到对应的目标函数地址上,从而可以实现函数hook。
实施例二
图2为本发明实施例二所提供的一种实现函数hook的方法的示例流程图,本发明实施例二在上述各实施例的技术方案的基础上,提供了一种具体的实施方式。
作为本发明实施的一种具体的实施方式,如图2所示,在编译期,引入一个静态库到主应用中,在主应用的主程序中引入一个前置头文件;在运行期,可以将函数地址即目标函数地址写入共享内存中,获取函数地址进行hook。其中,主应用可以为一种应用软件。
上述过程的具体步骤如下:
1、用户需要主动引入一个头文件即预设前置头文件。
2、在头文件中声明一个单例类的静态实例。
3、在类的构造函数中,通过函数名称主动获取函数地址即目标函数地址。
其中,该函数可以是静态库函数,也可以为动态库未导出的函数,也可以为动态库导出的函数。
4、获取到对应函数地址后,申请一个共享内存,将函数地址打上标识,标识每个函数地址对应的函数声明,将函数地址与对应的标识符写入申请的共享内存中。
5、当想要hook函数时,打开申请的共享内存,从所述共享内存中读取出所有的函数地址,并识别标识,将具有不同标识符的hook函数注入到对应的函数地址中,从而实现函数hook。
6、在主应用关闭时,在单例类的析构函数中,释放申请的共享内存,以免造成系统句柄泄露。
本发明实施例二所提供的一种实现函数hook的方法,通过主动引入的头文件对用户代码只需进行轻量的入侵即可将hook的范围扩大到编译期间任何可访问的函数,从而可以突破现有技术中只能hook动态库导出函数的限制。此外,该方法支持静态库的hook可以为针对hook函数进行性能分析等非嵌入式功能提供更多的想象空间。
实施例三
图3为本发明实施例三提供的一种实现函数hook的装置的结构示意图,该装置可适用于对依赖库中的函数进行hook的情况,其中该装置可由软件和/或硬件实现,并一般集成在计算机设备上。
如图3所示,该装置包括:写入模块310、获取模块320、确定模块330以及注入模块340。
写入模块310,用于将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;
获取模块320,用于在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;
确定模块330,用于确定所述标识符对应的hook函数;
注入模块340,用于将所述hook函数注入到所述目标函数地址上,实现函数hook。
在本实施例中,该装置首先通过写入模块310将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;其次通过获取模块320在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;然后通过确定模块330确定所述标识符对应的hook函数;最后通过注入模块340将所述hook函数注入到所述目标函数地址上,实现函数hook。
本实施例提供了一种实现函数hook的装置,能够有效获取到静态库中的目标函数地址,扩大了hook的范围。
进一步的,所述共享内存为通过所述预设前置头文件申请后得到的。
进一步的,所述预设前置头文件编译在主程序的可执行文件中,所述预设前置头文件为与hook库对应的头文件。
进一步的,从所述预设前置头文件中获取所述目标函数地址之后,还包括:在所述预设前置头文件中声明一个单例类的静态实例;在所述静态实例初始化时,调用单例类的构造函数;在所述构造函数中,根据目标函数名称获取对应的目标函数地址。
进一步的,写入模块310具体用于:通过所述预设前置头文件将所述目标函数地址对应的函数声明进行标识,得到标识符;通过所述预设前置头文件将所述标识符写入所述共享内存中。
进一步的,所述目标函数包括:静态库函数、动态库未导出函数、动态库导出函数、全局函数、类的静态成员函数以及类的普通成员函数中的一个或多个。
进一步的,所述实现函数hook的装置还包括释放模块,释放模块用于在所述主程序对应的应用软件关闭时,在单例类的析构函数中释放申请的共享内存。
上述实现函数hook的装置可执行本发明任意实施例所提供的实现函数hook的方法,具备执行方法相应的功能模块和有益效果。
实施例四
图4为本发明实施例四所提供的一种计算机设备的结构示意图。如图4所示,本发明实施例四提供的计算机设备包括:一个或多个处理器41和存储装置42;该计算机设备中的处理器41可以是一个或多个,图4中以一个处理器41为例;存储装置42用于存储一个或多个程序;所述一个或多个程序被所述一个或多个处理器41执行,使得所述一个或多个处理器41实现如本发明实施例中任一项所述的实现函数hook的方法。
所述计算机设备还可以包括:输入装置43和输出装置44。
计算机设备中的处理器41、存储装置42、输入装置43和输出装置44可以通过总线或其他方式连接,图4中以通过总线连接为例。
该计算机设备中的存储装置42作为一种计算机可读存储介质,可用于存储一个或多个程序,所述程序可以是软件程序、计算机可执行程序以及模块,如本发明实施例一或二所提供的一种实现函数hook的方法对应的程序指令/模块(例如,附图3所示的实现函数hook的装置中的模块,包括:写入模块310、获取模块320、确定模块330以及注入模块340)。处理器41通过运行存储在存储装置42中的软件程序、指令以及模块,从而执行计算机设备的各种功能应用以及数据处理,即实现上述方法实施例中的实现函数hook的方法。
存储装置42可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据计算机设备的使用所创建的数据等。此外,存储装置42可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储装置42可进一步包括相对于处理器41远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置43可用于接收输入的数字或字符信息,以及产生与计算机设备的用户设置以及功能控制有关的键信号输入。输出装置44可包括显示屏等显示设备。
并且,当上述计算机设备所包括一个或者多个程序被所述一个或者多个处理器41执行时,程序进行如下操作:
将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;
在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;
确定所述标识符对应的hook函数;
将所述hook函数注入到所述目标函数地址上,实现函数hook。
实施例五
本发明实施例五提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时用于执行一种实现函数hook的方法,该方法包括:
将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;
在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;
确定所述标识符对应的hook函数;
将所述hook函数注入到所述目标函数地址上,实现函数hook。
可选的,该程序被处理器执行时还可以用于执行本发明任意实施例所提供的一种实现函数hook的方法。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是,但不限于,电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(Random Access Memory,RAM)、只读存储器(Read Only Memory,ROM)、可擦式可编程只读存储器(ErasableProgrammable Read Only Memory,EPROM)、闪存、光纤、便携式CD-ROM、光存储器件、磁存储器件、或者上述的任意合适的组合。计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于:电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、无线电频率(Radio Frequency,RF)等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

Claims (10)

1.一种实现函数hook的方法,其特征在于,所述方法包括:
将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;
在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;
确定所述标识符对应的hook函数;
将所述hook函数注入到所述目标函数地址上,实现函数hook。
2.根据权利要求1所述的方法,其特征在于,所述共享内存为通过所述预设前置头文件申请后得到的。
3.根据权利要求1所述的方法,其特征在于,所述预设前置头文件编译在主程序的可执行文件中,所述预设前置头文件为与hook库对应的头文件。
4.根据权利要求3所述的方法,其特征在于,从所述预设前置头文件中获取所述目标函数地址之后,还包括:
在所述预设前置头文件中声明一个单例类的静态实例;
在所述静态实例初始化时,调用单例类的构造函数;
在所述构造函数中,根据目标函数名称获取对应的目标函数地址。
5.根据权利要求1所述的方法,其特征在于,将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,包括:
通过所述预设前置头文件将所述目标函数地址对应的函数声明进行标识,得到标识符;
通过所述预设前置头文件将所述标识符写入所述共享内存中。
6.根据权利要求1所述的方法,其特征在于,所述目标函数包括:静态库函数、动态库未导出函数、动态库导出函数、全局函数、类的静态成员函数以及类的普通成员函数中的一个或多个。
7.根据权利要求1所述的方法,其特征在于,还包括:
在所述主程序对应的应用软件关闭时,在单例类的析构函数中释放申请的共享内存。
8.一种实现函数hook的装置,其特征在于,所述装置包括:
写入模块,用于将目标函数地址与标识所述目标函数地址的标识符一起写入共享内存中,所述目标函数地址从预设前置头文件中获取;
获取模块,用于在满足hook条件时,从所述共享内存中获取所述目标函数地址和所述标识符;
确定模块,用于确定所述标识符对应的hook函数;
注入模块,用于将所述hook函数注入到所述目标函数地址上,实现函数hook。
9.一种计算机设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序;
所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器用于执行权利要求1-7任一项所述的实现函数hook的方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-7任一项所述的实现函数hook的方法。
CN202110884864.4A 2021-08-03 2021-08-03 一种实现函数hook的方法、装置、计算机设备及存储介质 Pending CN113590360A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110884864.4A CN113590360A (zh) 2021-08-03 2021-08-03 一种实现函数hook的方法、装置、计算机设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110884864.4A CN113590360A (zh) 2021-08-03 2021-08-03 一种实现函数hook的方法、装置、计算机设备及存储介质

Publications (1)

Publication Number Publication Date
CN113590360A true CN113590360A (zh) 2021-11-02

Family

ID=78254145

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110884864.4A Pending CN113590360A (zh) 2021-08-03 2021-08-03 一种实现函数hook的方法、装置、计算机设备及存储介质

Country Status (1)

Country Link
CN (1) CN113590360A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114741131A (zh) * 2022-04-02 2022-07-12 深圳软牛科技有限公司 动态库导出符号的隐藏方法、装置、设备及存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5664061A (en) * 1993-04-21 1997-09-02 International Business Machines Corporation Interactive computer system recognizing spoken commands
CN1728106A (zh) * 2004-07-26 2006-02-01 中兴通讯股份有限公司 一种应用程序故障的定位方法
CN106919458A (zh) * 2015-12-25 2017-07-04 腾讯科技(深圳)有限公司 Hook目标内核函数的方法及装置
WO2020019482A1 (zh) * 2018-07-27 2020-01-30 平安科技(深圳)有限公司 一种函数hook检测方法、检测设备及计算机可读介质
CN112416366A (zh) * 2019-08-23 2021-02-26 华为技术有限公司 一种Java语言动态挂钩子的方法、装置及设备

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5664061A (en) * 1993-04-21 1997-09-02 International Business Machines Corporation Interactive computer system recognizing spoken commands
CN1728106A (zh) * 2004-07-26 2006-02-01 中兴通讯股份有限公司 一种应用程序故障的定位方法
CN106919458A (zh) * 2015-12-25 2017-07-04 腾讯科技(深圳)有限公司 Hook目标内核函数的方法及装置
WO2020019482A1 (zh) * 2018-07-27 2020-01-30 平安科技(深圳)有限公司 一种函数hook检测方法、检测设备及计算机可读介质
CN112416366A (zh) * 2019-08-23 2021-02-26 华为技术有限公司 一种Java语言动态挂钩子的方法、装置及设备

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
NIKOLAOS TOTOSIS, ET.AL: "Android Hooking Revisited", 2018 IEEE 16TH INT. CONF. ON DEPENDABLE, AUTONOMIC, 15 August 2018 (2018-08-15), pages 552 - 559, XP033431557, DOI: 10.1109/DASC/PiCom/DataCom/CyberSciTec.2018.00104 *
刘利,等: "基于驱动的进程创建监控的实现", 电脑学习, no. 3, 1 June 2010 (2010-06-01), pages 119 - 120 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114741131A (zh) * 2022-04-02 2022-07-12 深圳软牛科技有限公司 动态库导出符号的隐藏方法、装置、设备及存储介质
CN114741131B (zh) * 2022-04-02 2023-08-15 深圳软牛科技有限公司 动态库导出符号的隐藏方法、装置、设备及存储介质

Similar Documents

Publication Publication Date Title
CN108027722B (zh) 在编译和部署中动态更新应用
US9530006B2 (en) Method and system for performing a memory safety check of a program written in an unmanaged programming language
Schütte et al. Condroid: Targeted dynamic analysis of android applications
Dahse et al. Code reuse attacks in php: Automated pop chain generation
CN107102944B (zh) 一种调用函数的分析方法及装置
CN109388946B (zh) 恶意进程检测方法、装置、电子设备及存储介质
CN111427782B (zh) 安卓动态链接库的运行方法、装置、设备及存储介质
CN111796865B (zh) 一种字节码文件修改方法、装置、终端设备及介质
CN110609687A (zh) 一种编译方法、装置、电子设备和存储介质
CN110764748A (zh) 代码调用方法、装置、终端及存储介质
CN113703859A (zh) 一种动态链接库注入方法、装置、设备及存储介质
US7802089B2 (en) Analyzing interpretable code for harm potential
CN111914251A (zh) 一种基于混合控制技术的智能终端安全保护方法及系统
US20150067686A1 (en) Auto-Cloudifying Applications Via Runtime Modifications
CN110609703B (zh) 性能检测工具实现方法、装置、可读存储介质及终端设备
CN113590360A (zh) 一种实现函数hook的方法、装置、计算机设备及存储介质
Baradaran et al. A unit-based symbolic execution method for detecting memory corruption vulnerabilities in executable codes
Lancia et al. Java card virtual machine compromising from a bytecode verified applet
US11500982B2 (en) Systems and methods for reliably injecting control flow integrity into binaries by tokenizing return addresses
US8745605B2 (en) Execution contexts with polymorphic type implementations
CN110908882A (zh) 一种应用程序的性能分析方法、装置、终端设备及介质
CN109426546B (zh) 应用启动方法及装置、计算机存储介质及设备
CN114020278A (zh) 数据处理方法、装置、设备及存储介质
CN111625302A (zh) 函数耗时跟踪方法、设备和存储介质
CN112765676B (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