CN108536434B - 一种基于高级程序设计语言实现钩子函数的方法及装置 - Google Patents

一种基于高级程序设计语言实现钩子函数的方法及装置 Download PDF

Info

Publication number
CN108536434B
CN108536434B CN201810018747.8A CN201810018747A CN108536434B CN 108536434 B CN108536434 B CN 108536434B CN 201810018747 A CN201810018747 A CN 201810018747A CN 108536434 B CN108536434 B CN 108536434B
Authority
CN
China
Prior art keywords
function
hook
copy
programming language
target
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
Application number
CN201810018747.8A
Other languages
English (en)
Other versions
CN108536434A (zh
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.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
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 Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201810018747.8A priority Critical patent/CN108536434B/zh
Priority to PCT/CN2018/082504 priority patent/WO2019136861A1/zh
Publication of CN108536434A publication Critical patent/CN108536434A/zh
Application granted granted Critical
Publication of CN108536434B publication Critical patent/CN108536434B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring
    • 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files

Landscapes

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

Abstract

本发明公开了一种基于高级程序设计语言实现钩子函数的方法,包括:创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。本发明实现了简化钩子函数的实现过程,并且可以广泛通用的技术效果。同时,本发明还公开了一种基于高级程序设计语言实现钩子函数的装置。

Description

一种基于高级程序设计语言实现钩子函数的方法及装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种基于高级程序设计语言实现钩子函数的方法及装置。
背景技术
钩子函数(即:hook函数)指的是在程序启动后插入的代码段,使程序运行新加入的代码来获取目标函数的运行时信息,比如,执行的参数,函数运行时间,返回值等。
目前较为常规的实现钩子函数的方法,是使用.net framework自带的非托管接口,在.net framework层解析运行时的元数据。但是,使用这种方式,不仅实现非常繁琐(需要根据底层元数据信息解析数据),而且需要对每个函数分别编码,很难实现通用化的解决方案。
发明内容
本申请实施例通过提供一种基于高级程序设计语言实现钩子函数的方法及装置,解决了现有技术中在实现钩子函数时,存在的过程繁琐,且无法广泛通用的技术问题,实现了简化钩子函数的实现过程,并且可以广泛通用的技术效果。
第一方面,本申请通过本申请的一实施例提供如下技术方案:
一种基于高级程序设计语言实现钩子函数的方法,包括:
创建目标函数的拷贝函数;
将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;
基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
优选地,所述创建目标函数的拷贝函数,包括:
获取所述目标函数的全部元数据信息,并基于所述全部元数据信息,创建新函数的声明信息,所述新函数与所述目标函数的元数据信息相同;
保存所述目标函数的函数体,并将所述目标函数的函数体载入到所述新函数中,以使得调用所述新函数与调用所述目标函数相同,其中,所述新函数即为所述目标函数的拷贝函数。
优选地,所述将钩子函数引入到所述目标函数的程序集中,包括:
基于IMetaDataImport接口,将所述钩子输入函数和所述钩子输出函数引入到所述目标函数的程序集中。
优选地,所述高级程序设计语言,具体为:
C#语言。
优选地,所述基于所述拷贝函数,重写所述目标函数,包括:
创建profiler实例;
对所述拷贝函数进行反编译,获得所述钩子函数的源代码;
在所述目标函数被CProfilerCallback::JITCompilationStarted函数回调时,将所述钩子函数的源代码注入到所述高级程序设计语言的运行时中。
优选地,所述将所述钩子函数的源代码注入到所述高级程序设计语言的运行时中,包括:
基于ICorProfilerInfo接口和ICorProfilerCallback接口,将所述钩子函数的源代码注入到所述高级程序设计语言的运行时中。
第二方面,本申请通过本申请的一实施例提供如下技术方案:
一种基于高级程序设计语言实现钩子函数的装置,包括:
创建单元,用于创建目标函数的拷贝函数;
引入单元,用于将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;
重写单元,用于基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
优选地,所述创建单元,具体用于:
获取所述目标函数的全部元数据信息,并基于所述全部元数据信息,创建新函数的声明信息,所述新函数与所述目标函数的元数据信息相同;保存所述目标函数的函数体,并将所述目标函数的函数体载入到所述新函数中,以使得调用所述新函数与调用所述目标函数相同,其中,所述新函数即为所述目标函数的拷贝函数。
优选地,所述引入单元,具体用于:
基于IMetaDataImport接口,将所述钩子输入函数和所述钩子输出函数引入到所述目标函数的程序集中。
优选地,所述高级程序设计语言,具体为:C#语言。
优选地,所述重写单元,具体用于:
创建profiler实例;对所述拷贝函数进行反编译,获得所述钩子函数的源代码;在所述目标函数被CProfilerCallback::JITCompilationStarted函数回调时,将所述钩子函数的源代码注入到所述高级程序设计语言的运行时中。
优选地,所述重写单元,具体用于:
基于ICorProfilerInfo接口和ICorProfilerCallback接口,将所述钩子函数的源代码注入到所述高级程序设计语言的运行时中。
第三方面,本申请通过本申请的一实施例提供如下技术方案:
一种基于高级程序设计语言实现钩子函数的装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
第四方面,本申请通过本申请的一实施例提供如下技术方案:
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
在本申请实施例中,公开了一种基于高级程序设计语言实现钩子函数的方法,包括:创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。如此,解决了现有技术中在实现钩子函数时,存在的过程繁琐,且无法广泛通用的技术问题,实现了简化钩子函数的实现过程,并且可以广泛通用的技术效果。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中一种基于高级程序设计语言实现钩子函数的方法的流程图;
图2为本申请实施例中一种基于高级程序设计语言实现钩子函数的装置200的结构图;
图3为本申请实施例中一种基于高级程序设计语言实现钩子函数的装置300的结构图;
图4为本申请实施例中一种计算机可读存储介质的结构图。
具体实施方式
本申请实施例通过提供一种基于高级程序设计语言实现钩子函数的方法及装置,解决了现有技术中在实现钩子函数时,存在的过程繁琐,且无法广泛通用的技术问题,实现了简化钩子函数的实现过程,并且可以广泛通用的技术效果。
本申请实施例的技术方案为解决上述技术问题,总体思路如下:
一种基于高级程序设计语言实现钩子函数的方法,包括:创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。
首先说明,本文中出现的术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
实施例一
本实施例提供了一种基于高级程序设计语言实现钩子函数的方法,应用于终端设备中,所述终端设备可以是PC(Personal Computer,个人电脑)、或智能手机、或平板电脑、等等,此处,对于所述终端设备具体是何种设备,本实施例不做具体限定。
如图1所示,所述基于高级程序设计语言实现钩子函数的方法,包括:
步骤S101:创建目标函数的拷贝函数。
在具体实施过程中,需要先创建目标函数的copy(即:拷贝函数)。
作为一种可选的实施例,在创建目标函数的copy时,可以:获取目标函数的全部元数据信息,并基于全部元数据信息,创建新函数的声明信息,新函数与目标函数的元数据信息相同;保存目标函数的函数体,并将目标函数的函数体载入到新函数中,以使得调用新函数与调用目标函数相同,其中,新函数即为目标函数的拷贝函数。
在具体实施过程中,可以获取目标函数Func()的所有元数据信息(包括函数签名等),再使用这些元数据信息,创建新函数Func_copy()的声明信息。该新函数Func_copy()与目标函数Func()的元数据信息完全一样,新函数Func_copy()即为目标函数Func()的copy。进一步,保存目标函数Func()的函数体,在将该函数体载入到新创建的函数Func_copy()中,如此,则调用拷贝函数Func_copy()与调用目标函数Func()完全一致。
步骤S102:将钩子函数引入到目标函数的程序集中,其中,钩子函数包括钩子输入函数和钩子输出函数,钩子输入函数和钩子输出函数是基于高级程序设计语言编写的。
作为一种可选的实施例,所述高级程序设计语言,具体为:C#语言。
其中,C#是一种最新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft.NET平台的应用程序,Microsoft.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。正是由于C#面向对象的卓越设计,使它成为构建各类组件的理想之选。使用简单的C#语言结构,这些组件可以方便的转化为XML网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用。最重要的是,C#使得C++,程序员可以高效的开发程序,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。
在具体实施过程中,可以直接使用C#语言编写hook函数(钩子函数)的钩子输入函数hook_enter和钩子输出函数hook_leave。其中,可以将hook_enter函数设置在目前函数前面,用于获取传入目标函数的参数,可以将hook_leave函数设置在目前函数后面,用于获取目标函数的返回值。
此处,由于可以将复杂的函数hook由修改底层语言,解析底层元数据信息,转变为修改高级语言C#本身,数据获取和处理也都只需要改变上层的C#代码,大大简化了后续编码的难度,同时极大的提升了稳定性。
在具体实施过程中,可以通过调用IMetaDataImport接口,将钩子输入函数和钩子输出函数引入到目标函数的程序集中,以便在重写目标函数IL指令时调用。
步骤S103:基于拷贝函数,重写目标函数,从而将目标函数的参数传入到钩子输入函数中,将目标函数的返回值传入到钩子输出函数中。
作为一种可选的实施例,步骤S103,包括:
创建profiler实例;对拷贝函数进行反编译,获得钩子函数的源代码;在目标函数被CProfilerCallback::JITCompilationStarted函数回调时,将钩子函数的源代码注入到高级程序设计语言的运行时(runtime)中。
在具体实施过程中,需要创建SQLServer分析器(Profiler)实例,具体可以参考windows官方例子,此处不再赘述。
在具体实施过程中,可以利用ILspy软件反编译步骤S101中的Func_copy()函数(即:目标函数的copy),获得钩子函数的源代码(该钩子函数的源代码即为hook函数注入后的IL代码)。其中,ILspy软件是一个开源的.net反编译软件,支持C#语言和vb语言。
在具体实施过程中,在检测到目标函数被profiler实例中的CProfilerCallback::JITCompilationStarted函数回调时,则可以基于.net framework中的ICorProfilerInfo接口和ICorProfilerCallback接口,将钩子函数的源代码注入到高级程序设计语言的运行时(runtime)中。
其中,运行时(runtime)是指一个程序在运行的状态。也就是说,当打开一个程序使它运行的时候,那个程序就是处于运行时刻。在一些编程语言中,把某些可以重用的程序或者实例打包或者重建成为“运行库”。这些实例可以在它们运行的时候被链接或者被任何程序调用。
举例来讲,在将钩子函数的源代码注入到高级程序设计语言的运行时中后,则可以获得如下形式的代码:
T1Func(T1a,T2b,T3c)
{
call1(a,b,c)
T1t=call2(a,b,c)
return call3(t);
}
其中,T1、T2、T3为数据类型,call1用于调用hook_enter函数,将参数a、b、c等导出;call2用于调用目标函数的copy,确保不影响原有的代码逻辑;call3用于调用hook_leave函数,将返回值t传出。
在具体实施过程中,在重写目标函数完成后,即可将目标函数的参数传入到外部可以随便改动的hook_enter函数中,返回值传入到hook_leave函数中,整个过程完成后。其中,可以在外部使用C#原生的代码,完成hook函数(例如:钩子输入函数hook_enter和钩子输出函数hook_leave),获取运行时参数,函数运行时间等。
通过上述的方法,通过自动插入所需的IL代码,可以配置化的替换不同运行时函数,对函数的hook只需要正常的C#编码即可完成,而不需要解析底层元数据。可以将复杂的函数hook由修改底层语言、解析底层元数据信息,转变为修改高级语言C#本身,数据获取和处理也都只需要改变上层的C#代码,大大简化了后续编码的难度,简化钩子函数的实现过程,同时极大的提升了稳定性,可以广泛通用。
上述本申请实施例中的技术方案,至少具有如下的技术效果或优点:
在本申请实施例中,公开了一种基于高级程序设计语言实现钩子函数的方法,包括:创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。如此,解决了现有技术中在实现钩子函数时,存在的过程繁琐,且无法广泛通用的技术问题,实现了简化钩子函数的实现过程,并且可以广泛通用的技术效果。
实施例二
基于同一发明构思,如图2所示,本实施例提供了一种基于高级程序设计语言实现钩子函数的装置200,包括:
创建单元201,用于创建目标函数的拷贝函数;
引入单元202,用于将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;
重写单元203,用于基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
作为一种可选的实施例,创建单元201,具体用于:
获取所述目标函数的全部元数据信息,并基于所述全部元数据信息,创建新函数的声明信息,所述新函数与所述目标函数的元数据信息相同;保存所述目标函数的函数体,并将所述目标函数的函数体载入到所述新函数中,以使得调用所述新函数与调用所述目标函数相同,其中,所述新函数即为所述目标函数的拷贝函数。
作为一种可选的实施例,引入单元202,具体用于:
基于IMetaDataImport接口,将所述钩子输入函数和所述钩子输出函数引入到所述目标函数的程序集中。
作为一种可选的实施例,所述高级程序设计语言,具体为:C#语言。
作为一种可选的实施例,重写单元203,具体用于:
创建profiler实例;对所述拷贝函数进行反编译,获得所述钩子函数的源代码;在所述目标函数被CProfilerCallback::JITCompilationStarted函数回调时,将所述源代码注入到所述高级程序设计语言的运行时中。
作为一种可选的实施例,重写单元203,具体用于:
基于ICorProfilerInfo接口和ICorProfilerCallback接口,将所述钩子函数的源代码注入到所述高级程序设计语言的运行时中。
由于本实施例所介绍的基于高级程序设计语言实现钩子函数的装置为实施本申请实施例中基于高级程序设计语言实现钩子函数的方法所采用的装置,故而基于本申请实施例中所介绍的基于高级程序设计语言实现钩子函数的方法,本领域所属技术人员能够了解本实施例的基于高级程序设计语言实现钩子函数的装置的具体实施方式以及其各种变化形式,所以在此对于该基于高级程序设计语言实现钩子函数的装置如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中基于高级程序设计语言实现钩子函数的方法所采用的装置,都属于本申请所欲保护的范围。
上述本申请实施例中的技术方案,至少具有如下的技术效果或优点:
在本申请实施例中,公开了一种基于高级程序设计语言实现钩子函数的装置,包括:创建单元,用于创建目标函数的拷贝函数;引入单元,用于将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;重写单元,用于基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。如此,解决了现有技术中在实现钩子函数时,存在的过程繁琐,且无法广泛通用的技术问题,实现了简化钩子函数的实现过程,并且可以广泛通用的技术效果。
实施例三
基于同一发明构思,如图3所示,本实施例提供了一种基于高级程序设计语言实现钩子函数的装置300,包括存储器310、处理器320及存储在存储器310上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:
创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
在具体实施过程中,处理器320执行计算机程序311时,可以实现实施例一中的任一实施方式。
实施例四
基于同一发明构思,如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,计算机程序411被处理器执行时实现以下步骤:
创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中。
在具体实施过程中,计算机程序411被处理器执行时,可以实现实施例一中的任一实施方式。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (7)

1.一种基于高级程序设计语言实现钩子函数的方法,其特征在于,包括:
创建目标函数的拷贝函数;
将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的,所述高级程序设计语言具体为C#语言;
基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中;
其中,所述基于所述拷贝函数,重写所述目标函数,包括:创建profiler实例;对所述拷贝函数进行反编译,获得所述拷贝函数的源代码;在所述目标函数被CProfilerCallback::JITCompilationStarted函数回调时,基于ICorProfilerInfo接口和ICorProfilerCallback接口,将所述拷贝函数的源代码注入到所述高级程序设计语言的运行时中。
2.如权利要求1所述的基于高级程序设计语言实现钩子函数的方法,其特征在于,所述创建目标函数的拷贝函数,包括:
获取所述目标函数的全部元数据信息,并基于所述全部元数据信息,创建新函数的声明信息,所述新函数与所述目标函数的元数据信息相同;
保存所述目标函数的函数体,并将所述目标函数的函数体载入到所述新函数中,以使得调用所述新函数与调用所述目标函数相同,其中,所述新函数即为所述目标函数的拷贝函数。
3.如权利要求1所述的基于高级程序设计语言实现钩子函数的方法,其特征在于,所述将钩子函数引入到所述目标函数的程序集中,包括:
基于IMetaDataImport接口,将所述钩子输入函数和所述钩子输出函数引入到所述目标函数的程序集中。
4.一种基于高级程序设计语言实现钩子函数的装置,其特征在于,包括:
创建单元,用于创建目标函数的拷贝函数;
引入单元,用于将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的,所述高级程序设计语言具体为C#语言;
重写单元,用于基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中;
其中,所述重写单元,具体用于:创建profiler实例;对所述拷贝函数进行反编译,获得所述拷贝函数的源代码;在所述目标函数被CProfilerCallback::JITCompilationStarted函数回调时,基于ICorProfilerInfo接口和ICorProfilerCallback接口,将所述拷贝函数的源代码注入到所述高级程序设计语言的运行时中。
5.如权利要求4所述的基于高级程序设计语言实现钩子函数的装置,其特征在于,所述创建单元,具体用于:
获取所述目标函数的全部元数据信息,并基于所述全部元数据信息,创建新函数的声明信息,所述新函数与所述目标函数的元数据信息相同;保存所述目标函数的函数体,并将所述目标函数的函数体载入到所述新函数中,以使得调用所述新函数与调用所述目标函数相同,其中,所述新函数即为所述目标函数的拷贝函数。
6.一种基于高级程序设计语言实现钩子函数的装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的,所述高级程序设计语言具体为C#语言;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中;其中,所述基于所述拷贝函数,重写所述目标函数,包括:创建profiler实例;对所述拷贝函数进行反编译,获得所述拷贝函数的源代码;在所述目标函数被CProfilerCallback::JITCompilationStarted函数回调时,基于ICorProfilerInfo接口和ICorProfilerCallback接口,将所述拷贝函数的源代码注入到所述高级程序设计语言的运行时中。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
创建目标函数的拷贝函数;将钩子函数引入到所述目标函数的程序集中,其中,所述钩子函数包括钩子输入函数和钩子输出函数,所述钩子输入函数和所述钩子输出函数是基于高级程序设计语言编写的,所述高级程序设计语言具体为C#语言;基于所述拷贝函数,重写所述目标函数,从而将所述目标函数的参数传入到所述钩子输入函数中,将所述目标函数的返回值传入到所述钩子输出函数中;其中,所述基于所述拷贝函数,重写所述目标函数,包括:创建profiler实例;对所述拷贝函数进行反编译,获得所述拷贝函数的源代码;在所述目标函数被CProfilerCallback::JITCompilationStarted函数回调时,基于ICorProfilerInfo接口和ICorProfilerCallback接口,将所述拷贝函数的源代码注入到所述高级程序设计语言的运行时中。
CN201810018747.8A 2018-01-09 2018-01-09 一种基于高级程序设计语言实现钩子函数的方法及装置 Active CN108536434B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201810018747.8A CN108536434B (zh) 2018-01-09 2018-01-09 一种基于高级程序设计语言实现钩子函数的方法及装置
PCT/CN2018/082504 WO2019136861A1 (zh) 2018-01-09 2018-04-10 一种基于高级程序设计语言实现钩子函数的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810018747.8A CN108536434B (zh) 2018-01-09 2018-01-09 一种基于高级程序设计语言实现钩子函数的方法及装置

Publications (2)

Publication Number Publication Date
CN108536434A CN108536434A (zh) 2018-09-14
CN108536434B true CN108536434B (zh) 2020-03-17

Family

ID=63485375

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810018747.8A Active CN108536434B (zh) 2018-01-09 2018-01-09 一种基于高级程序设计语言实现钩子函数的方法及装置

Country Status (2)

Country Link
CN (1) CN108536434B (zh)
WO (1) WO2019136861A1 (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111381905B (zh) * 2018-12-27 2023-07-18 北京华为数字技术有限公司 一种程序处理方法、装置及设备
CN110737637B (zh) * 2019-09-26 2022-12-16 抖音视界有限公司 功能扩展方法、装置、电子设备及计算机可读存储介质
CN111290747B (zh) * 2020-03-07 2022-06-24 苏州浪潮智能科技有限公司 一种创建函数钩子的方法、系统、设备及介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103885750A (zh) * 2014-04-04 2014-06-25 深圳市大成天下信息技术有限公司 在目标函数中挂钩新函数的装置、方法以及电子设备
CN106326694A (zh) * 2016-08-30 2017-01-11 北京鼎源科技有限公司 一种基于C源代码的混淆的Android应用加固方法
CN106909458A (zh) * 2015-12-23 2017-06-30 北京奇虎科技有限公司 内存管理方法及装置

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8176480B1 (en) * 2006-02-27 2012-05-08 Symantec Operating Corporation Adaptive instrumentation through dynamic recompilation
US8793662B2 (en) * 2008-03-25 2014-07-29 Microsoft Corporation Runtime code hooking for print driver and functionality testing
CN104699503A (zh) * 2015-02-28 2015-06-10 深圳市同洲电子股份有限公司 一种替换安卓系统中函数的执行逻辑的方法及装置
CN105550080A (zh) * 2015-11-26 2016-05-04 广州华多网络科技有限公司 一种基于Linux进行服务器程序故障注入方法、装置及系统
CN105373729B (zh) * 2015-12-24 2018-04-13 北京奇虎科技有限公司 一种信息处理方法和系统
CN106295326B (zh) * 2016-08-12 2020-02-07 武汉斗鱼网络科技有限公司 一种用于获取显卡内容的内联hook方法和系统

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103885750A (zh) * 2014-04-04 2014-06-25 深圳市大成天下信息技术有限公司 在目标函数中挂钩新函数的装置、方法以及电子设备
CN106909458A (zh) * 2015-12-23 2017-06-30 北京奇虎科技有限公司 内存管理方法及装置
CN106326694A (zh) * 2016-08-30 2017-01-11 北京鼎源科技有限公司 一种基于C源代码的混淆的Android应用加固方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
"Android下的挂钩(hook)和代码注入(inject)";wangwalfred;《https://blog.csdn.net/wang_walfred/article/details/48245283?utm_source=copy》;20150906;第4-5页 *

Also Published As

Publication number Publication date
CN108536434A (zh) 2018-09-14
WO2019136861A1 (zh) 2019-07-18

Similar Documents

Publication Publication Date Title
US9891900B2 (en) Generation of specialized methods based on generic methods and type parameterizations
US8448132B2 (en) Systems and methods for modifying code generation templates
CN108536434B (zh) 一种基于高级程序设计语言实现钩子函数的方法及装置
US20080320453A1 (en) Type inference and late binding
Herhut et al. River Trail: A path to parallelism in JavaScript
Izquierdo et al. API2MoL: Automating the building of bridges between APIs and Model-Driven Engineering
US8549506B2 (en) Resumable methods
US7890939B2 (en) Partial methods
US20160246622A1 (en) Method and system for implementing invocation stubs for the application programming interfaces embedding with function overload resolution for dynamic computer programming languages
US20090228904A1 (en) Declarative support for asynchronous methods
CN109408354B (zh) 应用组件的数据处理方法和装置
Samuel et al. Programming kotlin
WO2018028027A1 (zh) 基于重构技术实现开放终端应用数据与功能的方法
CN113515286B (zh) 一种小程序生成运行方法、装置、设备及存储介质
US20100083238A1 (en) Binary manipulation of intermediate-language code
Papoulias Remote Debugging and Reflection in Resource Constrained Devices
Khatchadourian et al. Defaultification refactoring: A tool for automatically converting Java methods to default
Gregersen Implications of modular systems on dynamic updating
Kramer et al. Platform independent, higher-order, statically checked mobile applications
Sarstedt et al. A New Approach to Combine Models and Code in Model Driven Development.
Blunk et al. Efficient Development of Domain-Specific Simulation Modelling Languages and Tools
Shahjamali An Empirical Analysis of Java Language Use in Open Source Applications
Cazzola et al. DEXTER and Neverlang: a union towards dynamicity
Lepper et al. Rewriting Object Models With Cycles and Nested Collections: A Model-Based Metaprogramming Problem
Madet Complexité Implicite de Lambda-Calculs Concurrents

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