一种hook的方法及终端设备与流程

文档序号:11134530阅读:704来源:国知局
一种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操作。

相较于现有技术,本发明提供的方案中,以hook服务的方式运行注入目标进程中的hook程序,通过所述hook程序监听与所述目标进程匹配的hook事件,无需再次编译hook程序、注入、重启目标进程等操作,即可直接根据所述hook事件对所述目标进程中的调用函数执行hook操作,能够有效提高hook操作的效率。

附图说明

图1为hook机制的一种实现方式的示意图;

图2为本实施例中hook的方法的一种流程示意图;

图3为本实施例中自定义hook函数与被hook函数关联的一种示意图;

图4为本实施例中hook的方法的另一种流程示意图;

图5为本实施例中ARM模式下跳转指令机器码的一种结构示意图;

图6为本实施例中THUMB模式下跳转指令机器码的一种结构示意图;

图7-1为本实施例中进程列表的示意图;

图7-2为本实施例中模块列表的示意图;

图7-3为本实施例中符号列表的示意图;

图7-4为本实施例中在hook窗口修改参数和返回值的一种示意图;

图7-5为本实施例中设置参数和返回值后的一种运行结果示意图;

图7-6为本实施例中修改参数和返回值后的另一种运行结果示意图;

图8为本实施例中终端设备的一种结构示意图;

图9为本实施例中终端设备的另一种结构示意图。

具体实施方式

本发明实施例提供了一种hook的方法及终端设备,可用于数据处理技术领域,例如游戏漏洞测试、应用的代码安全测试等场景,在进程大量测试时,通过提高hook效率来提高测试效率,减少测试工作量。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元,本文中所出现的单元的划分,仅仅是一种逻辑上的划分,实际应用中实现时可以有另外的划分方式,例如多个单元可以结合成或集成在另一个系统中,或一些特征可以忽略,或不执行,另外,所显示的或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元之间的间接耦合或通信连接可以是电性或其他类似的形式,本文中均不作限定。并且,作为分离部件说明的单元或子单元可以是也可以不是物理上的分离,可以是也可以不是物理单元,或者可以分不到多个电路单元中,可以根据实际的需要选择其中的部分或全部单元来实现本发明实施例方案的目的。

下面针对本发明中出现的技术名词进行解释:

函数的Hook是指当目标进程执行到某个函数(当需要hook这个函数的时候称这个函数为被hook函数)的时候,通过修改该函数头部的几条指令,让它跳转到自定义的一个函数(一般称之为自定义的hook函数)中去的过程,称之为函数的hook,有时被hook函数逻辑比较复杂的情况下需要在自定义hook函数中实现原函数的功能,这个时候hook框架会提供一个函数指针,调用该函数指针可以完成被hook函数原有功能,在本方案中提到的这类可以实现原函数功能的函数以Old_开头命名。

如图1所示,为hook的一种原理机制,通用的hook框架会提供一个接口,用以告诉hook框架需要将哪个函数(图1的Function)hook到哪个自定义的函数(图1的My_Function)中去,并且还会提供一个用以实现被hook函数功能的函数(图1中的Old_Function)。现有的解决方案就是利用这套hook框架,将自定义的函数写入到一个动态链接库中,然后加载动态链接库到目标进程中执行hook框架,从而将Function函数hook到My_Function中,当目标进程执行到Function的时候会自动走到My_Function中,而在My_Function就可以编写自定义的代码来代替Function的逻辑,从而达到修改目标进程逻辑的目的。

注入是指通过一定的黑客技术在目标进程中被动执行一段自定义的代码的过程,通过注入可以读取目标进程中任意数据和修改任意数据,注入也可称为加载,具体的名称本发明不作限定。

逻辑漏洞是指能在交互式应用修改数据的代码缺陷,例如在游戏中可以被游戏外挂非法利用以达到获利的目的的代码缺陷。

动态数据库是指一种不可执行的二进制程序,其需要被可执行程序加载后才可以执行其所包含的代码,在Windows系统中,动态数据库的扩展名一般为.dll,在安卓系统中,动态数据库的扩展名一般为.so,在需要运行时,可通过加载到可执行程序中运行,例如加载到上述目标进程中运行。本发明中是将编写好的自定义hook函数的代码编译为动态数据库,也可将动态数据库成为hook程序,该hook程序注入到目标进程中后,会以hook服务的方式运行,实现监听外部数据的变化,以及对目标进程中的被hook函数进行相应的hook操作。

需要说明的是,本发明中的终端设备可以是个人电脑(英文全称:Personal Computer,英文简称:PC)、平板电脑、个人数字助理(英文全称:Personal Digital Assistant,英文简称:PDA)、个人通信业务(英文全称:Personal Communication Service,英文简称:PCS)电话、笔记本和手机等终端设备,也可以是具有移动终端的计算机,例如,可以是便携式、袖珍式、手持式、计算机内置的或者车载的移动装置,它们能够向用户提供语音和/或数据连通性的设备,以及与无线接入网交换语言和/或数据。

为解决上述技术问题,本发明实施例主要提供以下技术方案:

在首次对目标进程中的被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的方法,如图2所示,为本发明实施例中hook的方法的一个实施例,本发明实施例包括:

201、以hook服务的方式运行注入目标进程中的hook程序。

其中,目标进程是指需要改变其运行逻辑的进程,可以是指被测程序运行起来之后的进程。

在所述hook程序中可设置待监听的自定义hook函数,自定义hook函数与所述目标进程中的调用函数关联,该目标进程中与自定义hook函数相关联的调用函数可称为被hook函数,当程序执行到该被hook函数时,会跳转至与该被hook函数关联的自定义hook函数中执行,从而改变原来的被hook函数的运行逻辑。

在编译好自定义hook函数的代码后,可以将编译好的自定义hook函数编译为动态数据库,然后将该动态数据库注入目标进程中。

在目标进程中,以hook服务的方式运行hook程序是指以hook服务的方式在目标进程中运行上述hook程序后,该hook程序可用来读取该目标进程之外的外部数据,通过读取外部数据可以感知在目标进程之外,是否针对与目标进程关联的外部数据是否发生变化。

其中,该外部数据是指在所述目标进程之外的数据,该外部数据与该目标进程的运行逻辑相关联,这些外部数据可以是一个数据库,或者终端设备内的一个文件,针对该外部数据的操作(例如编辑、修改等更新操作)都会实时生效,不受目标进程的影响。

另外,针对外部数据的修改,可以采用可视化的方式进行,例如可以通过在交互界面上独立于hook窗口之外显示一个窗口,可以是堆叠窗口的方式,也可以是分离窗口的方式等,使得应用管理人员可以直观的修改外部数据,并且在修改外部数据后,还可以核对修改后的运行逻辑是否与本次修改所期望的运行逻辑一致,与现有机制中修改、编译、注入等操作后才可以看到实际的运行逻辑相比,本发明通过可视化的方式,能够保证修改运行逻辑的准确性,具体的可视化方式本发明不作限定。

202、通过所述hook程序监听与所述目标进程匹配的hook事件。

其中,所述hook事件是指针对所述目标进程中的调用函数的hook操作,所述hook操作包括更新所述目标被hook函数的运行逻辑,运行逻辑是指根据实际的调用信息在被hook函数上执行。

举例来说,若针对外部数据进行更新操作了,hook程序会感知到外部数据已经变化,由于该变化的外部数据是与目标进程中的调用函数(即目标被hook函数)相关联的,所以当外部数据变化时,hook程序会重新对目标进程中的调用函数进行hook操作,进行hook操作就会改变目标被hook函数的运行逻辑,故可以称由外部数据变化引起的重新hook操作为一次hook事件

Hook程序会实时监听目标进程之外的hook事件,由于自定义hook函数与所述目标进程中的调用函数关联,所以,在hook程序监听到该hook事件后,会重新对原来的目标被hook函数执行hook操作,即改变目标被hook函数的运行逻辑。

203、通过所述hook程序,根据所述hook事件对所述目标进程中的调用函数执行hook操作。

通过以hook服务的方式在目标进程中运行hook程序,实现针对目标进程的文件的操作的监控,例如,一个add函数实质上是实现加法功能的函数,现在,通过hook程序监听到要hook到该add函数,让该add函数实现减法功能,那么,就可以在与该add函数关联的自定义hook函数中返回:参数1减去参数2,那么这个hook程序便会执行相应的操作,使得目标进程中的add函数执行做减法操作,从而改变原来的运行逻辑。

本发明实施例中,只需要为每个被hook函数编译一次自定义函数即可,不需要针对每一次修改,都重新编译一次动态数据库,更不需要反复注入、重启进程等操作,极大提高hook的效率,减少无用功,缩短hook时间,进而提高定位问题函数的效率。

在一些应用场景中,可能由于后期对应用的优化或者安全测试等因素,会需要重新对目标进程中的调用函数进行hook操作,本发明中,相较于现有机制,由于可以通过上述以hook服务方式运行的hook程序来执行这些hook操作,所以可以不用每一次进行hook操作,就要重新执行背景技术中所述的流程,具体如下:

在需要更改目标被hook函数的运行逻辑时,可以先改变前述部分中所述的外部数据,由于hook程序一直在对目标进程和外部数据进行实时监控,所以,在外部数据变化后,hook程序能够感知到外部数据变化了,然后所述hook程序便会实时获取针对所述目标被hook函数更新的运行逻辑,获取到运行逻辑后,所述hook程序则根据更新的运行逻辑在所述目标进程中对所述目标被hook函数执行hook操作。

可选的,在一些发明实施例中,通过hook程序监听hook事件到执行hook操作的具体过程(即上述步骤102和步骤103)如下:

通过所述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函数的,即采用本发明的机制,尤其是在需要多次修改运行逻辑的测试场景中,可免除编译、再次注入自定义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函数的数量也是很庞大的。所以在这个基础上,为进一步减少编译的时间成本和人力成本,还可以通过减少自定义hook函数的编译的手段来实现,具体如下:

下面都以需要被hook的调用函数为例,由于一个进程中的多个调用函数中,可能存在某些调用函数的参数是相同或不同的,或者在终端设备中,多个进程中,可能存在这种现象:进程1中的某些调用函数与进程2中的某些调用函数的参数个数相同。那么,对于一个进程中的调用参数来说,可以为参数个数相同的调用函数构造一个自定义hook函数即可,将这个参数个数相同的调用函数都关联到同一个自定义hook函数;或者,对于多个进程中的调用函数而言,可以为参数个数相同的调用函数构造一个自定义hook函数即可,将这个参数个数相同的调用函数都关联到同一个自定义hook函数。通过这种关联机制,即可准确、快速的识别出被hook函数,从而优化函数的调用机制,又可以减少代码的编译,还可以减少终端设备的冗余存储,增加终端设备的存储空间,减少终端设备的处理器的负担,相应的提升进程的响应速度。

或者,还可以将参数个数属于同一个数值范围的调用函数关联到同一个自定义hook函数,例如将参数个数在第一数值范围的调用函数关联到第一类型的自定义hook函数,将参数个数在第二数值范围的调用函数关联到第二类型的自定义hook函数…..依此类推,还可以配置一张映射表,该映射表包括数值范围、参数个数和各种类型的自定义hook函数,以数值范围为索引,以实际的参数个数为索引号,来准确的定位到合适的自定义hook函数。当然,也可以通过其他的实现方式,具体本发明不作限定。

具体来说,可以预先设置多种类型的自定义hook函数,然后分别将参数个数相同的被hook函数关联到相同类型的自定义hook函数,由此形成多个被hook函数与自定义hook函数的映射关系。

相应的,所述根据变化的外部数据定位到与变化的外部数据对应的目标自定义hook函数,确定与所述目标自定义hook函数关联的所述目标被hook函数的过程包括:

步骤A、根据所述变化的外部数据定位到与所述变化的外部数据对应的第一类型的自定义hook函数。

步骤B、从与所述第一类型的自定义hook函数关联的被hook函数中,确定与所述变化的外部数据对应的所述目标被hook函数。

在步骤B中,可通过hook程序计算与所述第一类型的自定义hook函数关联的各被hook函数的函数指针,然后根据所述各被hook函数的函数指针即可确定与所述变化的外部数据对应的所述目标被hook函数。在确定目标被hook函数后,可以在第一类型的自定义hook函数中返回一个期望值,即外部数据变化后的值,这样便可以实现将目标被hook函数的原有值修改为返回的期望值。

实际测试场景中,在定位目标被hook函数时,对于有符号的函数,可以使用解析符号表的方式获取函数的函数指针;对于没有符号的函数,通过逆向分析的手段将函数指针写死来定位要测试的函数,而对于无法直接计算函数指针的被测函数,由于已有名称的函数可以在运行时动态计算出其函数指针,所以在静态分析时,可计算与已有名称的函数的地址差,然后就可以得出函数指针的被测函数。

举例来说,如图3所示,为将一个进程中的多个调用函数关联到同一个自定义hook函数的结构示意图,函数A和函数B均包含一个参数,函数C和函数D均包含两个参数,函数E和函数F均包含三个参数。所以,可以将函数A和函数B关联到第一类型的自定义hook函数(如图3中的My_Fun_Param1),将函数C和函数D关联到第二类型的自定义hook函数(如图3中的My_Fun_Param2),将函数E和函数F关联到第三类型的自定义hook函数(如图3中的My_Fun_Param3)。例如,在程序执行到了自定义hook函数My_Fun_Param1后,hook程序根据从外部读取的与My_Fun_Param1关联的外部数据(例如期望参数和期望返回值),会在My_Fun_Param1中进行动态定位,确定出此时目标进程调用的是函数A还是函数B。

又例如,在hook程序监听到针对自定义hook函数My_Fun_Param1的外部数据(例如期望参数和期望返回值)变化时,先根据上述映射关系找到与My_Fun_Param1关联的函数A和函数B,然后分别计算出函数A和函数B的函数指针,根据计算出的函数指针定位到与变化的外部数据对应的原函数,然后对定位到的原函数进行hook,以实现修改这个原函数的原参数和原期望值。

图3所示的结构可适用于变化的外部数据为针对一个或多个被hook函数的修改,在针对多个被hook函数的修改时,具体如何定位到与变化的外部数据对应的被hook函数,可参考定位到与My_Fun_Param1关联的函数A或函数B,此处不再赘述。

举例来说,在目标进程之外,将函数A的返回值修改为固定值1,也将函数B的返回值修改为固定值2,那么,hook程序在监听到修改的两个返回值后,在My_Fun_Param1中需要知道哪个修改返回值的hook事件是伪装成函数A在执行,还是伪装成函数B在执行,找到对应返回值的原函数后,hook程序就将原函数的实际返回值修改成所监听到的值。找到原函数的目的就是让自定义hook函数可以根据外部数据的变化做出相对应的hook操作的响应。

在一些发明实施例中,上述步骤B具体可包括:

步骤b1、获取与所述第一类型的自定义hook函数关联的各被hook函数的返回地址;

根据被hook函数的返回地址确定调用被hook函数的指令集;

根据被hook函数的返回地址和调用被hook函数的指令集,确定调用被hook函数的汇编指令。

其中,返回地址是指当一个程序调用一个函数的时候,为了能使被调函数执行完毕之后,调用者能够继续往下执行,被调用的函数执行完毕时需要知道自己接下来要跳到哪里去执行,因此,这个被调用的函数执行完毕后跳转回调用函数继续执行的地址就是返回地址,返回地址由函数调用者保存在某一个地方,例如在ARM架构的处理器中,返回地址被保存在寄存器中。

指令集也可称之为指令的运行模式,运行模式是指基于ARM架构设计的处理器的两种运行模式,分别为ARM模式和THUMB模式,在ARM mode下,一条汇编指令长度为4字节;在THUMB模式下,一条汇编指令长度为2字节。

汇编指令是指用汇编语言编写的程序中,每一条汇编语言就是一条汇编指令,每一条汇编指令都可以一一对应成相对于的可以被处理器直接执行的机器码,例如ARM的加法指令:add r0,r1,#0x20表示的意思就是将寄存器r1的值加上十六进制的20,将相加得到的结果存到寄存器r0中。

函数指针是指一个地址,即指向函数的第一条汇编指令,该地址也可称作函数地址或函数首地址。

步骤b2、根据调用被hook函数的汇编指令得到当前被hook函数的目标函数指针,确定所述目标函数指针指向的所述目标被hook函数。

具体来说,是根据汇编指令和所述变化的外部数据得到目标自定义hook函数的函数指针,然后根据目标自定义hook函数的函数指针得到被hook函数的目标函数指针,这样便可以确定所述目标函数指针指向的所述目标被hook函数。

其中,上述步骤b2可包括:

根据所述汇编指令的机器码确定所述被hook函数的调用方式为普通函数调用方式时,将所述机器码的低a位数据作为所述指令集跳转到所述机器码的偏移值,a为正整数;

根据所述偏移值机器码的链接位和机器码的条件域得到被调用的所述目标自定义hook函数的函数指针,即目标自定义hook函数的首地址;

根据被hook函数的函数指针与自定义hook函数的函数指针之间的映射关系,确定与所述目标自定义hook函数的函数指针对应的目标函数指针;

根据所述目标函数指针确定所述目标函数指针指向的所述目标被hook函数。

在确定所述目标函数指针指向的所述目标被hook函数之后,还可以对目标被hook函数进行如下操作:

获取控制所述目标被hook函数执行的控制数据;

根据所述控制数据控制所述目标被hook函数的执行操作,所述执行操作包括修改所述目标被hook函数的运行逻辑,所述运行逻辑包括调用信息,所述调用信息包括参数和/或返回值。

其中,控制数据可以是以配置文件的方式存在,假如事先约定以读取配置文件的方式修改目标被hook函数的运行逻辑,如果想要将目标被hook函数返回值固定为1,那么配置文件就可以写成:

0x4000898:Ret:1,其中0x4000898为目标被hook函数的函数指针。

当在目标自定义hook函数中动态定位到函数指针为0x4000898的目标被hook函数,那么就可以根据该配置文件将目标被hook函数的返回值固定为1。

举例来说,如图4所示,为整个hook操作流程,以下以修改交互式应用的运行逻辑为例,在不需要修改被测交互式应用的运行逻辑的情况下,采用运行时在自定义hook函数中动态定位到被hook函数的函数指针,从而可以在一个自定义hook函数内部实现拦截被hook函数参数和返回值、修改函数参数和返回值、对参数和返回值进行简单的逻辑运算等一系列功能。当程序运行到被hook函数的时候,采用hook技术跳转到自定义hook函数中,在自定义hook函数的头部保存所有寄存器的值,同时获取被hook函数的返回地址(同时也是自定义hook函数的返回地址),根据返回地址的值是否能被4整除来判断被hook函数的调用者的指令的运行模式,若能被整除,运行模式为ARM模式,若不能被整除,则运行模式为THUMB模式。然后根据确定的运行模式,以返回地址为基准向上减去一条指令长度,则可得到调用被hook函数的汇编指令,分析这条汇编指令的机器码可以得到被hook函数的函数指针,从而可以在自定义hook函数中知道当前程序是在哪个被hook的函数中执行。此外,再还可以通过读取配置文件来获取控制数据,利用获取的控制数据控制被hook函数的执行,比如修改被hook函数的参数和返回值。

下面分别针对运行模式为ARM和THUMB两种模式时,如何得到机器码、修改参数值和返回值进行说明:

1、在运行模式为ARM模式时,将返回地址减去4得到调用被hook函数My_Fun_Param3的指令的机器码,然后根据机器码进行移位操作后的取值来判断是否为带链接跳转并切换指令集(英文全称:Branch Link Exchange,英文简称:BLX)方式调用,判断的方式可以为:0<=(r=bytecode^0xe12fff30)<=15?,例如将机器码与0xe12fff30进行异或操作,如果得到的值在区间[0,15]中就表示是以BLX方式调用,若不在该区间内,则表示不是以BLX方式调用。

若不是BLX方式调用,则取该机器码的低24位数据作为偏移值(offset1),然后根据该offset1、链接位和条件域计算得到自定义hook函数的函数指针(Hook_Fun_Addr),其中,计算的方式可参考图5所示的方式得到:Hook_Fun_Addr=r14-4+offset1*4+8,r14为寄存器的值,Hook_Fun_Addr的计算方式不限于图5所示的方式。然后根据预设的映射表找到实现被hook函数功能的原函数的函数指针(Old_Func_Addr),该映射表为Hook_Fun_Addr到Old_Func_Addr的映射关系表,该映射表在调用hook框架进行hook函数时生成。

若为BLX方式调用,则可以直接从寄存器中读取自定义hook函数的函数指针(Hook_Fun_Addr),即Hook_Fun_Addr=register[r],然后根据上述映射表找到实现被hook函数功能的原函数的函数指针(Old_Func_Addr)。

2、在运行模式为THUMB模式时,可将返回地址减去3,使得返回地址对齐到最低位1,从而得到调用My_Fun_Param3的指令的机器码,然后根据机器码进行移位操作后的取值来判断是否为BLX方式调用,判断的方式可以为:0<=(r=(opcode^0x4780)>>3)<=15?,将机器码opcode与0x4780异或,再将异或所得到的值右移3位,得到的值如果在区间[0,15]之间就表示是以BLX方式调用,若不在该区间内,则表示不是以BLX方式调用。

若不是BLX方式调用,则取该机器码的低11位数据作为偏移值(offset2),然后根据该offset2和高位数据计算得到自定义hook函数的函数指针(Hook_Fun_Addr),其中,计算的方式可参考图6所示的方式得到:Hook_Fun_Addr=r14-2+offset2*2+4,Hook_Fun_Addr的计算方式不限于图6所示的方式。然后根据预设的映射表找到实现被hook函数功能的原函数的函数指针(Old_Func_Addr),该映射表为Hook_Fun_Addr到Old_Func_Addr的映射关系表,该映射表在调用hook框架进行hook函数时生成。

若为BLX方式调用,则可以直接从寄存器中读取自定义hook函数的函数指针(Hook_Fun_Addr),即Hook_Fun_Addr=register[r],然后根据上述映射表找到实现被hook函数功能的原函数的函数指针(Old_Func_Addr)。

为便于理解,下面举一具体的应用场景对本发明实施例进行说明,以产品腾讯安卓调试(英文全称:Tencent Android Debug,英文简称:Tandbg)为例,该产品Tandbg目前可以对安卓终端采用C/C++编写的程序进行可视化,并且动态修改函数的参数和返回值,使用产品Tandbg进行修改的过程如下:

双击运行Tandbg.exe,点击获取进程后可以获取安卓终端上正常运行的进程列表,如图7-1所示。在图7-1所示的进程列表中选择一个需要修改参数和返回值的main进程,双击之后则会列出main进程所加载的所有程序模块(如图7-2所示的模块列表),在如图7-2所示的模块列表里,可以选择一个main进程加载的程序模块,双击该程序模块后即可列出该程序模块包含的所有函数。

下面以选择图7-2中的程序模块main为例,该程序模块main运行时可调用一个test函数,test函数的功能是在函数内部打印test的两个参数和两个参数的和,返回值则为这两个参数的和,假设main函数每隔1秒会调用一次test函数,那么在如图7-2所示的模块列表里,双击选择模块main后,则会列出该模块main所加载的所有函数(如图7-3所示的符号列表)。

此处以选择图7-3所示的符号列表中的test函数(实线框所圈的范围),并修改test函数的两个参数和返回值为例,双击图7-3中test函数后,会弹出如图7-4中箭头所指的hook窗口,在test函数接收到调用者输入的参数1和参数2后,将参数1和参数2的和作为返回值,在图7-4箭头所指的hook窗口中将test的参数1修改为333,将参数2修改为222,返回值为999,然后打印出接收到的形参和返回值,紧接着调用test函数的调用者会打印出一句话“call test with a=1&b=2ret[test实际返回值]”来打印出test函数的实际返回值(如图7-5所示的窗口),其中call test with a是指实际传递给被hook的test函数的参数值,ret则是指被hook的test函数实际返回的返回值,图7-5中的In test ret是指被hook的test函数在本次运行逻辑中应该返回的返回值(根据实际传递进来的参数值计算得到)和接收到的参数值(即被hook程序修改后的参数值)。相应的,图7-5中的运行结果指示该test函数从正常运行的参数1为1、参数2为2以及返回值为3,被修改为:参数1为111、参数2为222以及返回值为999。

若以每隔一秒调用test函数一次为例,双击test函数之后,就会在图7-4中箭头所指的hook窗口填充test函数的地址,并分别在参数1、参数2和返回值处填写在运行时需要被修改的参数和返回值,最后点击按钮“一键Hook”即可实现hook test函数的功能。

被hook过一次的函数,还可以再次修改其参数和返回值,具体来说,若后续需要修改test函数的参数和返回值,可参考图7-4到图7-5所示的操作流程,例如将参数1为111、参数2为222以及返回值为999的情况,修改为参数1为9、参数2为8以及返回值为7的情况,运行效果如图7-6所示。

以上对本发明中一种hook的方法进行说明,以下对执行上述hook的方法的终端设备80进行描述。

一、参照图8,对终端设备80进行说明,所述终端设备80包括:

控制模块801,用于控制所述终端设备80以挂钩hook服务的方式运行注入目标进程中的hook程序,其中,所述hook程序中设置待监听的自定义hook函数,自定义hook函数与所述目标进程中的调用函数关联。

监听模块802,用于通过所述hook程序监听与所述目标进程匹配的hook事件,其中,所述hook事件是指针对所述目标进程中的调用函数的hook操作,所述hook操作包括更新所述目标被hook函数的运行逻辑。

处理模块803,用于通过所述hook程序,根据所述监听模块802监听到的所述hook事件对所述目标进程中的调用函数执行hook操作。

本发明实施例中,控制模块801控制所述终端设备80以hook服务的方式运行注入目标进程中的hook程序,在监听模块802通过所述hook程序监听与所述目标进程匹配的hook事件后,无需再次编译hook程序、注入、重启目标进程等操作,处理模块803即可直接根据所述hook事件对所述目标进程中的调用函数执行hook操作,能够有效提高hook操作的效率。

可选的,在一些发明实施例中,所述监听模块802具体用于通过所述hook程序监听与所述目标进程中的调用函数匹配的hook事件;

所述处理模块803具体用于根据所述监听模块802监听到的所述hook事件确定目标自定义hook函数;

确定与所述目标自定义hook函数关联的目标被hook函数;

通过所述hook程序,根据所述hook事件在所述目标进程中对所述目标被hook函数执行hook操作。

可选的,在一些发明实施例中,所述处理模块803还用于:

通过所述hook程序实时获取针对所述目标被hook函数更新的运行逻辑;

通过所述hook程序,根据更新的运行逻辑在所述目标进程中对所述目标被hook函数执行hook操作。

可选的,在一些发明实施例中,所述处理模块803具体用于:

在所述监听模块802通过所述hook程序监听到外部数据变化后,根据变化的外部数据定位到与变化的外部数据对应的目标自定义hook函数,所述外部数据是指在所述目标进程之外的数据;

确定与所述目标自定义hook函数关联的所述目标被hook函数。

可选的,在一些发明实施例中,所述处理模块803还用于:

设置多种类型的自定义hook函数;

将参数个数相同的被hook函数关联到相同类型的自定义hook函数。

可选的,在一些发明实施例中,所述处理模块803具体用于:

根据所述变化的外部数据定位到与所述变化的外部数据对应的第一类型的自定义hook函数;

从与所述第一类型的自定义hook函数关联的被hook函数中,确定与所述变化的外部数据对应的所述目标被hook函数。

可选的,在一些发明实施例中,所述处理模块803具体用于:

计算与所述第一类型的自定义hook函数关联的各被hook函数的函数指针;

根据所述各被hook函数的函数指针确定与所述变化的外部数据对应的所述目标被hook函数。

可选的,在一些发明实施例中,所述处理模块803具体用于:

获取与所述第一类型的自定义hook函数关联的各被hook函数的返回地址;

根据被hook函数的返回地址确定调用被hook函数的指令集;

根据被hook函数的返回地址和调用被hook函数的指令集,确定调用被hook函数的汇编指令;

根据调用被hook函数的汇编指令得到当前被hook函数的目标函数指针;

确定所述目标函数指针指向的所述目标被hook函数。

可选的,在一些发明实施例中,所述处理模块803在确定所述目标函数指针指向的所述目标被hook函数之后,还用于:

获取控制所述目标被hook函数执行的控制数据;

根据所述控制数据控制所述目标被hook函数的执行操作,所述执行操作包括修改所述目标被hook函数的运行逻辑,所述运行逻辑包括调用信息,所述调用信息包括参数和/或返回值。

可选的,在一些发明实施例中,所述处理模块803具体用于:

根据所述汇编指令的机器码确定所述被hook函数的调用方式为普通函数调用方式时,将所述机器码的低a位数据作为所述指令集跳转到所述机器码的偏移值,a为正整数;

根据所述偏移值机器码的链接位和机器码的条件域得到被调用的被hook函数的地址;

根据被hook函数的函数指针与自定义hook函数的函数指针之间的映射关系,确定与自定义hook函数的函数指针对应的原函数的函数指针;

根据所述目标函数指针确定所述目标函数指针指向的原函数为所述目标被hook函数。

上面从单元化功能实体的角度对本发明实施例中的终端设备80进行了描述,下面从硬件处理的角度分别对本发明实施例中的终端设备90进行描述,下面以终端为手机为例:

图9示出的是与本发明实施例提供的移动终端相关的手机的部分结构的框图。参考图9,手机包括:射频(英文全称:Radio Frequency,英文简称:RF)电路910、存储器920、输入单元930、显示单元940、传感器950、音频电路940、无线保真(英文全称:wireless fidelity,英文简称:Wi-Fi)模块960、处理器980、以及电源990等部件。本领域技术人员可以理解,图6中示出的手机结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

下面结合图9对手机的各个构成部件进行具体的介绍:

RF电路910可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,给处理器980处理;另外,将设计上行的数据发送给基站。通常,RF电路910包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(英文全称:Low Noise Amplifier,英文简称:LNA)、双工器等。此外,RF电路910还可以通过无线通信与网络和其他设备通信。上述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(英文全称:Global System of Mobile communication,英文简称:GSM)、通用分组无线服务(英文全称:General Packet Radio Service,GPRS)、码分多址(英文全称:Code Division Multiple Access,英文简称:CDMA)、宽带码分多址(英文全称:Wideband Code Division Multiple Access,英文简称:WCDMA)、长期演进(英文全称:Long Term Evolution,英文简称:LTE)、电子邮件、短消息服务(英文全称:Short Messaging Service,英文简称:SMS)等。

存储器920可用于存储软件程序以及模块,处理器980通过运行存储在存储器920的软件程序以及模块,从而执行手机的各种功能应用以及数据处理。存储器920可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器920可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。

输入单元930可用于接收输入的数字或字符信息,以及产生与手机的用户设置以及功能控制有关的键信号输入。具体地,输入单元930可包括触控面板931以及其他输入设备932。触控面板931,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板931上或在触控面板931附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触控面板931可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器980,并能接收处理器980发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板931。除了触控面板931,输入单元930还可以包括其他输入设备932。具体地,其他输入设备932可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。

显示单元940可用于显示由用户输入的信息或提供给用户的信息以及手机的各种菜单。显示单元940可包括显示面板941,可选的,可以采用液晶显示器(英文全称:Liquid Crystal Display,英文简称:LCD)、有机发光二极管(英文全称:Organic Light-Emitting Diode,英文简称:OLED)等形式来配置显示面板941。进一步的,触控面板931可覆盖显示面板941,当触控面板931检测到在其上或附近的触摸操作后,传送给处理器980以确定触摸事件的类型,随后处理器980根据触摸事件的类型在显示面板941上提供相应的视觉输出。虽然在图6中,触控面板931与显示面板941是作为两个独立的部件来实现手机的输入和输入功能,但是在某些实施例中,可以将触控面板931与显示面板941集成而实现手机的输入和输出功能。

手机还可包括至少一种传感器950,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板941的亮度,接近传感器可在手机移动到耳边时,关闭显示面板941和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于手机还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。

音频电路940、扬声器941,传声器942可提供用户与手机之间的音频接口。音频电路940可将接收到的音频数据转换后的电信号,传输到扬声器941,由扬声器941转换为声音信号输出;另一方面,传声器942将收集的声音信号转换为电信号,由音频电路940接收后转换为音频数据,再将音频数据输出处理器980处理后,经RF电路910以发送给比如另一手机,或者将音频数据输出至存储器920以便进一步处理。

Wi-Fi属于短距离无线传输技术,手机通过Wi-Fi模块960可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图6示出了Wi-Fi模块960,但是可以理解的是,其并不属于手机的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。

处理器980是手机的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器920内的软件程序和/或模块,以及调用存储在存储器920内的数据,执行手机的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器980可包括一个或多个处理单元;优选的,处理器980可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器980中。

手机还包括给各个部件供电的电源990(比如电池),优选的,电源可以通过电源管理系统与处理器980逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。

尽管未示出,手机还可以包括摄像头、蓝牙模块等,在此不再赘述。

在本发明实施例中,该终端所包括的处理器980还具有控制执行hook的方法中由终端设备执行的方法流程。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上对本发明所提供的技术方案进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1