函数编译方法和装置制造方法及图纸

技术编号:16644371 阅读:26 留言:0更新日期:2017-11-26 16:42
本发明专利技术公开了一种函数编译方法和装置。该方法包括:将对第一函数进行编译得到的第二函数挂钩到自定义代理函数中得到函数调用指针,第一函数为使用第一编程语言编写的被挂钩函数,函数调用指针用于调用第二函数;将函数调用指针进行注册以使其被允许用第一编程语言编写的代码调用;利用经过注册的函数调用指针对第三函数进行编译得到第四函数,第三函数中包括用于调用第一函数的代码,第三函数为使用第一编程语言编写的自定义挂钩函数,第二函数中的代码以及第四函数中的代码允许直接被CPU执行。本发明专利技术解决了相关技术在对函数进行Hook时自定义Hook函数必须使用C/C++编写,导致自定义Hook函数的开发成本较高的技术问题。

Function compiling method and device

The invention discloses a function compiling method and a device. The method comprises the following steps: to get the function call to get second hook function pointer compiler to custom proxy function of the first function, the first function is to use the first programming language by hook function, function pointer is used to call the second function; the function calling pointer register to allow the calling code written in the first programming language the use of; after the registration of the function call to third pointer function to be compiled fourth functions, third functions including for the first call to the function of the code, the third function is to use the first programming language custom hook function, second function code and fourth function code allows direct execution by CPU. The invention solves the technical problem that the user-defined Hook function must be written with C/C++ when the function is Hook, which leads to the higher development cost of the custom Hook function.

【技术实现步骤摘要】
函数编译方法和装置
本专利技术涉及计算机领域,具体而言,涉及一种函数编译方法和装置。
技术介绍
Hook技术可以指利用一个自定义的函数替换某个函数的过程,其中,该过程可以涉及到三个函数,一个是被Hook函数,一个是自定义Hook函数,Hook之后可以返回一个函数指针,该函数指针可以完成被Hook函数的功能,也即该函数指针可以指示被Hook函数的调用。Hook技术可以应用于测试等领域中,例如,图1是现有技术在手机游戏协议测试工具中使用的示意图,如图1所示,具体包括如下步骤:1.注册JIT完成事件:用Mono提供的接口mono_profiler_install_jit_end向Mono注册全局的JIT完成事件的回调函数。其中,Mono可以是一个可以运行.Net程序的开源项目,JIT可以指Mono运行时将IL代码动态编译成Native代码的过程,其中,IL代码为.Net语言编译后的字节码,Native代码为可以直接被CPU执行的代码。2.设置JIT完成通知事件:用Mono提供的接口mono_profiler_set_events向设置在有JIT完成的时候通知用户自定义的JIT完成事件的回调函数。3.监听所有被JIT的函数:在自定义的JIT完成事件回调函数中检查所有函数是不是现在需要Hook的函数,如果是,则实施Hook,否则什么也不做。4.实施HOOK:对需要Hook的函数进行Hook。其中,Hook函数可以由开发人员根据实际需求用C/C++语言编写。现有技术方案在上述使用过程中存在以下不足:第一点不足:注册机制导致在注册前就JIT的函数永远都不会通知到JIT完成的回调函数。第二点不足:自定义的Hook函数要用C/C++编写。对于第一点不足,基于Mono在运行时对同一个C#函数只会JIT一次的前提,那么在开发人员向Mono注册JIT完成事件前就已经JIT的C#函数,就永远没有机会被Hook了,这不是开发人员想要的结果。对于第二点不足,在开发人员想对被Hook函数做一些逻辑上的修改的时候,往往是需要操作C#的对象的,这个时候如果用C/C++来写代码去操作C#的对象,这会大大增加开发成本,这个成本不仅仅局限于多写几行C/C++代码,更是需要非常熟悉Mono的C/C++和C#代码交互基础才能编写。而在对想要编写非常复杂的逻辑的时候,用C/C++来完成原本C#应该完成的事情是非常困难的。针对上述的问题,目前尚未提出有效的解决方案。
技术实现思路
本专利技术实施例提供了一种函数编译方法和装置,以至少解决相关技术在对函数进行Hook时自定义Hook函数必须使用C/C++编写,导致自定义Hook函数的开发成本较高的技术问题。根据本专利技术实施例的一个方面,提供了一种函数编译方法,包括:将对第一函数进行编译得到的第二函数挂钩到自定义代理函数中,得到函数调用指针,其中,第一函数为使用第一编程语言编写的被挂钩函数,第二函数中的代码允许直接被CPU执行,函数调用指针用于调用第二函数;将函数调用指针进行注册,以使得函数调用指针被允许调用;利用经过注册的函数调用指针对第三函数进行编译,得到第四函数,其中,第三函数中包括用于调用第一函数的代码,第三函数为使用第一编程语言编写的自定义挂钩函数,第四函数中的代码允许直接被CPU执行。根据本专利技术实施例的另一方面,还提供了一种函数编译方法,包括:对第一函数进行编译得到第二函数,其中,第一函数为使用第一编程语言编写的被挂钩函数,第二函数中的代码允许直接被CPU执行;对第三函数进行编译得到第四函数,其中,第三函数中包括用于调用第一函数的第一代码,第三函数为使用第一编程语言编写的自定义挂钩函数,第四函数中的代码允许直接被CPU执行;将第一代码进行编译得到第二代码,其中,第二代码允许直接被CPU执行;将第二函数挂钩到第四函数,得到函数调用指针,其中,函数调用指针用于调用第二函数;将第二代码挂钩到函数调用指针所指示的第二函数。根据本专利技术实施例的另一方面,还提供了一种函数编译装置,包括:挂钩单元,用于将对第一函数进行编译得到的第二函数挂钩到自定义代理函数中,得到函数调用指针,其中,第一函数为使用第一编程语言编写的被挂钩函数,第二函数中的代码允许直接被CPU执行,函数调用指针用于调用第二函数;注册单元,用于将函数调用指针进行注册,以使得函数调用指针被允许调用;编译单元,用于利用经过注册的函数调用指针对第三函数进行编译,得到第四函数,其中,第三函数中包括用于调用第一函数的代码,第三函数为使用第一编程语言编写的自定义挂钩函数,第四函数中的代码允许直接被CPU执行。根据本专利技术实施例的另一方面,还提供了一种函数编译装置,包括:第一编译单元,用于对第一函数进行编译得到第二函数,其中,第一函数为使用第一编程语言编写的被挂钩函数,第二函数中的代码允许直接被CPU执行;第二编译单元,用于对第三函数进行编译得到第四函数,其中,第三函数中包括用于调用第一函数的第一代码,第三函数为使用第一编程语言编写的自定义挂钩函数,第四函数中的代码允许直接被CPU执行;第三编译单元,用于将第一代码进行编译得到第二代码,其中,第二代码允许直接被CPU执行;第一挂钩单元,用于将第二函数挂钩到第四函数,得到函数调用指针,其中,函数调用指针用于调用第二函数;第二挂钩单元,用于将第二代码挂钩到函数调用指针所指示的第二函数。在本专利技术实施例中,通过对用C#编程语言编写的第一函数进行编译得到第二函数,其中,第二函数中的代码为Native代码,其允许被CPU直接执行,然后将第二函数挂钩到一个自定义代理函数中以得到函数调用指针,并将该函数调用指针进行注册,以使得利用注册后的函数调用指针将,用C#编程语言编写的第三函数进行编译得到第四函数,以达到将第一函数(被Hook函数)挂钩到第三函数(自定义Hook函数)的目的,进而解决了相关技术在对函数进行Hook时自定义Hook函数必须使用C/C++编写,导致自定义Hook函数的开发成本较高的技术问题,从而实现了降低自定义Hook函数的开发成本的技术效果。附图说明此处所说明的附图用来提供对本专利技术的进一步理解,构成本申请的一部分,本专利技术的示意性实施例及其说明用于解释本专利技术,并不构成对本专利技术的不当限定。在附图中:图1是现有技术在手机游戏协议测试工具中使用的示意图;图2是根据本专利技术实施例的函数编译方法的硬件环境的示意图;图3是根据本专利技术实施例的一种可选的函数编译方法的流程图;图4是根据本专利技术实施例的另一种可选的函数编译方法的流程图;图5是根据本专利技术实施例的一种可选的工具选择工程界面的示意图;图6是根据本专利技术实施例的一种可选的选择一个已经存在的工程的示意图;图7是根据本专利技术实施例的一种可选的选择使用VS2012打开工程的示意图;图8是根据本专利技术实施例的一种可选的对加速函数和加速渲染函数实时Hook的示意图;图9是根据本专利技术实施例的一种可选的自定义加速按钮被按下函数的示意图;图10是根据本专利技术实施例的一种可选的自定义加速渲染函数的示意图;图11是根据本专利技术实施例的一种可选的定义被Hook函数的原函数调用的示意图;图12是根据本专利技术实施例的一种可选的增加Hook按钮的示意图;图13是根据本专利技术实施例的一种可选的编译完成后可点击运行按钮运本文档来自技高网
...
函数编译方法和装置

【技术保护点】
一种函数编译方法,其特征在于,包括:将对第一函数进行编译得到的第二函数挂钩到自定义代理函数中,得到函数调用指针,其中,所述第一函数为使用第一编程语言编写的被挂钩函数,所述第二函数中的代码允许直接被CPU执行,所述函数调用指针用于调用所述第二函数;将所述函数调用指针进行注册,以使得所述函数调用指针被允许用所述第一编程语言编写的代码调用;利用经过注册的所述函数调用指针对第三函数进行编译,得到第四函数,其中,所述第三函数中包括用于调用所述第一函数的代码,所述第三函数为使用所述第一编程语言编写的自定义挂钩函数,所述第四函数中的代码允许直接被CPU执行。

【技术特征摘要】
1.一种函数编译方法,其特征在于,包括:将对第一函数进行编译得到的第二函数挂钩到自定义代理函数中,得到函数调用指针,其中,所述第一函数为使用第一编程语言编写的被挂钩函数,所述第二函数中的代码允许直接被CPU执行,所述函数调用指针用于调用所述第二函数;将所述函数调用指针进行注册,以使得所述函数调用指针被允许用所述第一编程语言编写的代码调用;利用经过注册的所述函数调用指针对第三函数进行编译,得到第四函数,其中,所述第三函数中包括用于调用所述第一函数的代码,所述第三函数为使用所述第一编程语言编写的自定义挂钩函数,所述第四函数中的代码允许直接被CPU执行。2.根据权利要求1所述的方法,其特征在于,在所述利用经过注册的所述函数调用指针对第三函数进行编译之后,所述方法还包括:接收到操作请求,其中,所述操作请求用于请求对目标应用进行预定操作,所述目标应用使用所述第一编程语言进行编写得到;在响应所述操作请求对所述目标应用进行所述预定操作的过程中,当所述第一函数被请求执行时,跳转到所述第四函数,以执行所述第四函数。3.根据权利要求1所述的方法,其特征在于,在所述将对第一函数进行编译得到的第二函数挂钩到自定义代理函数中之前,所述方法还包括:根据所述第一函数的标识在预定的程序集中获取所述第一函数。4.根据权利要求3所述的方法,其特征在于,所述根据所述第一函数的标识在预定的程序集中获取所述第一函数包括:对每个程序集执行以下操作,其中,所述程序集在执行以下操作时被标记为当前程序集:在所述当前程序集的标识与预定标识相匹配的情况下,从所述当前程序集中确定预定的类,并从所述预定的类中确定所述第一函数。5.根据权利要求1至4中任一项所述的方法,其特征在于,所述第一编程语言为C#,所述第二函数中的代码和所述第四函数中的代码为Native代码。6.一种函数编译方法,其特征在于,包括:对第一函数进行编译得到第二函数,其中,所述第一函数为使用第一编程语言编写的被挂钩函数,所述第二函数中的代码允许直接被CPU执行;对第三函数进行编译得到第四函数,其中,所述第三函数中包括用于调用所述第一函数的第一代码,所述第三函数为使用所述第一编程语言编写的自定义挂钩函数,所述第四函数中的代码允许直接被CPU执行;将所述第一代码进行编译得到第二代码,其中,所述第二代码允许直接被CPU执行;将所述第二函数挂钩到所述第四函数,得到函数调用指针,其中,所述函数调用指针用于调用所述第二函数;将所述第二代码挂钩到所述函数调用指针所指示的所述第二函数。7.根据权利要求6所述的方法,其特征在于,在所述将所述第二代...

【专利技术属性】
技术研发人员:黄柳优李源纯周江王鹏魏学峰
申请(专利权)人:腾讯科技深圳有限公司
类型:发明
国别省市:广东,44

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

1