一种程序崩溃解决方法及装置转让专利

申请号 : CN201510429937.5

文献号 : CN106371940B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王波谌丁

申请人 : 腾讯科技(深圳)有限公司

摘要 :

一种程序崩溃解决方法,包括:获取第一动态链接库文件,并将其加载到目标程序中,该第一动态链接库文件中包含替换函数,替换函数中包含修复代码,将用于调用目标函数的第二动态链接库文件中调用目标函数的信息,替换为调用替换函数的信息,当检测到目标程序调用第二动态链接库文件进而调用目标函数时,替换为调用替换函数并运行修复代码,校验若目标函数被调用时引入的参数是否符合修复代码中包含的校验规则,若符合则调用目标函数,若不符合则返回预置值,使得目标程序继续运行。同时还提供了一种程序崩溃解决装置,上述方法和装置可在不影响目标程序对应的目标进程运行的情况下,完成动态hook,降低进程崩溃的概率。

权利要求 :

1.一种程序崩溃解决方法,其特征在于,包括:

获取第一动态链接库文件,并将其加载到目标程序中,所述第一动态链接库文件中包含替换函数,所述替换函数中包含修复代码,所述修复代码中包括多个不同函数对应参数的校验规则,所述校验规则用于校验当函数被调用时引入的参数的结果是符合校验规则;

将用于调用目标函数的第二动态链接库文件中调用所述目标函数的信息,替换为调用所述替换函数的信息;

当检测到所述目标程序调用所述第二动态链接库文件,进而调用所述目标函数时,替换为调用所述替换函数并运行所述修复代码,校验若所述目标函数被调用时,引入的参数是否符合所述修复代码中包含的校验规则,所述校验用于指示所述目标函数被调用时是否会引发所述目标程序发生本地崩溃;

若符合,则调用所述目标函数,若不符合,则返回预置值作为有效结果值,使得所述目标程序继续运行。

2.根据权利要求1所述的方法,其特征在于,所述获取第一动态链接库文件包括:从服务器端获取配置文件,所述配置文件包括所述目标函数的名称、所述替换函数的名称、所述第一动态链接库文件的名称、所述第一动态链接库文件的下载地址,以及,所述第二动态链接库文件的名称;

根据所述第一动态链接库文件的下载地址,下载所述第一动态链接库文件。

3.根据权利要求2所述的方法,其特征在于,所述将用于调用目标函数的第二动态链接库文件中调用所述目标函数的信息,替换为调用所述替换函数的信息包括:根据所述配置文件中的所述目标函数的名称、所述替换函数的名称、所述第一动态链接库文件的名称以及所述第二动态链接库文件的名称,在系统的结构体链表中查找所述第二动态链接库文件;

在所述动态链接库文件中查找所述目标函数的地址信息的全局偏移表;

在所述全局偏移表中记录的需调用的所述目标函数的地址修改为所述替换函数的地址。

4.根据权利要求2所述的方法,其特征在于,所述将用于调用目标函数的第二动态链接库文件中调用所述目标函数的信息,替换为调用所述替换函数的信息包括:在过程链接表内填写需要跳转到的所述替换函数的地址;

将相对跳转的地址修改为所述过程链接表内的所述替换函数的地址,所述相对跳转的地址为被调用的所述目标函数地址相对调用时地址的偏移。

5.根据权利要求1所述的方法,其特征在于,所述若符合,则调用所述目标函数,若不符合,则返回预置值,使得所述目标程序继续运行之后还包括:若运行所述目标程序造成程序崩溃,则重新获取包含修改后的修复代码的第一动态链接库文件,并执行将所述第一动态链接库文件加载到目标程序中的步骤。

6.一种程序崩溃解决装置,其特征在于,包括:

获取模块,用于获取第一动态链接库文件;

加载模块,用于将所述第一动态链接库文件加载到目标程序中,所述第一动态链接库文件中包含替换函数,所述替换函数中包含修复代码,所述修复代码中包括多个不同函数对应参数的校验规则,所述校验规则用于校验当函数被调用时引入的参数的结果是符合校验规则;

替换模块,用于将用于调用目标函数的第二动态链接库文件中调用所述目标函数的信息,替换为调用所述替换函数的信息;

校验模块,用于当检测到所述目标程序调用所述第二动态链接库文件,进而调用所述目标函数时,替换为调用所述替换函数并运行所述修复代码,校验若所述目标函数被调用时,引入的参数是否符合所述修复代码中包含的校验规则,所述校验用于指示所述目标函数被调用时是否会引发所述目标程序发生本地崩溃;

执行模块,用于若所述校验模块校验的结果是所述目标函数被调用时,引入的参数符合所述修复代码中包含的校验规则,则调用所述目标函数,若所述校验模块校验的结果是所述目标函数被调用时,引入的参数不符合所述修复代码中包含的校验规则,则返回预置值作为有效结果值,使得所述目标程序继续运行。

7.根据权利要求6所述的装置,其特征在于,所述获取模块包括:

获取子模块,用于从服务器端获取配置文件,所述配置文件包括所述目标函数的名称、所述替换函数的名称、所述第一动态链接库文件的名称、所述第一动态链接库文件的下载地址,以及,所述第二动态链接库文件的名称;

下载模块,用于根据所述第一动态链接库文件的下载地址,下载所述第一动态链接库文件。

8.根据权利要求7所述的装置,其特征在于,所述替换模块包括:

查找模块,用于根据所述配置文件中的所述目标函数的名称、所述替换函数的名称、所述第一动态链接库文件的名称以及所述第二动态链接库文件的名称,在系统的结构体链表中查找所述第二动态链接库文件;

所述查找模块,还用于在所述动态链接库文件中查找所述目标函数的地址信息的全局偏移表;

记录模块,用于在所述全局偏移表中记录的需调用的所述目标函数的地址修改为所述替换函数的地址。

9.根据权利要求7所述的装置,其特征在于,所述替换模块包括:

填写模块,用于在过程链接表内填写需要跳转到的替换函数的地址;

修改模块,用于将相对跳转的地址修改为所述过程链接表内的替换函数的地址,所述相对跳转的地址为被调用的目标函数地址相对调用时地址的偏移。

10.根据权利要求6所述的装置,其特征在于,

所述获取模块,还用于若运行所述目标程序造成程序崩溃,则重新获取包含修改后的修复代码的第一动态链接库文件。

说明书 :

一种程序崩溃解决方法及装置

技术领域

[0001] 本发明涉及计算机技术领域,特别涉及一种程序崩溃解决方法及装置。

背景技术

[0002] 随着智能移动终端应用的普及,android系统应用范围也随之发展,android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑。Native crash是android系统中的app(application)在运行时,由于c\c++代码部分导致的程序异常退出。
[0003] 当前在android系统中没有有效的解决native crash的方案,由于native crash大部分是非必现的问题,因此导致即使解决了native crash,也不能对解决结果充分验证,只能随app客户端版本发布后,通过app运行时对错误进行上报,来看native crash解决情况,若未得到解决,则需延期到下个app客户端版本发布,解决native crash的周期较长,成本代价也比较大。

发明内容

[0004] 有鉴于此,本发明提供一种程序崩溃解决方法及装置,通过将修复代码加载到目标程序,将可能引发进程崩溃的目标函数替换为预先编译好的替换函数,在不影响目标程序对应的目标进程运行的情况下,完成动态hook,降低进程崩溃的概率,提高系统运行速度以及顺畅性。
[0005] 本发明实施例提供一种程序崩溃解决方法,包括:
[0006] 获取第一动态链接库文件,并将其加载到目标程序中,所述第一动态链接库文件中包含替换函数,所述替换函数中包含修复代码;将用于调用目标函数的第二动态链接库文件中调用所述目标函数的信息,替换为调用所述替换函数的信息;当检测到所述目标程序调用所述第二动态链接库文件,进而调用所述目标函数时,替换为调用所述替换函数并运行所述修复代码,校验若所述目标函数被调用时,引入的参数是否符合所述修复代码中包含的校验规则;若符合,则调用所述目标函数,若不符合,则返回预置值,使得所述目标程序继续运行。
[0007] 本发明实施例提供一种程序崩溃解决装置,包括:
[0008] 获取模块,用于获取第一动态链接库文件;加载模块,用于将所述第一动态链接库文件加载到目标程序中,所述第一动态链接库文件中包含替换函数,所述替换函数中包含修复代码;替换模块,用于将用于调用目标函数的第二动态链接库文件中调用所述目标函数的信息,替换为调用所述替换函数的信息;校验模块,用于当检测到所述目标程序调用所述第二动态链接库文件,进而调用所述目标函数时,替换为调用所述替换函数并运行所述修复代码,校验若所述目标函数被调用时,引入的参数是否符合所述修复代码中包含的校验规则;执行模块,用于若所述校验模块校验的结果是所述目标函数被调用时,引入的参数符合所述修复代码中包含的校验规则,则调用所述目标函数,若所述校验模块校验的结果是所述目标函数被调用时,引入的参数符合所述修复代码中包含的校验规则,则返回预置值,使得所述目标程序继续运行。
[0009] 根据上述实施例的程序崩溃解决方法及装置,通过hook方法将包含修复代码的替换函数加载到目标程序后,替换可能引发程序崩溃的目标函数,被调用时运行修复代码校验若调用目标函数所引入的参数是否符合校验规则,若符合则重新调用目标函数,若不符合则返回预置值作为有效结果值使得目标程序正常运行而不会崩溃,从而通过动态hook,在不影响目标程序运行的情况下,降低进程崩溃的概率,提高系统运行速度以及顺畅性。同时,由于只修改其中的修复代码,因此每次只需更新so文件以及配置文件,而不需要更新客户端版本,节省时间,提高效率。
[0010] 为让本发明的上述和其他目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附图式,作详细说明如下。

附图说明

[0011] 图1为本发明第一实施例提供的程序崩溃解决方法流程示意图;
[0012] 图2为本发明第二实施例提供的程序崩溃解决方法流程示意图;
[0013] 图3为本发明第三实施例提供的程序崩溃解决装置结构示意图;
[0014] 图4为本发明第四实施例提供的程序崩溃解决装置结构示意图。

具体实施方式

[0015] 为更进一步阐述本发明为实现预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明的具体实施方式、结构、特征及其功效,详细说明如后。
[0016] 本发明中的程序崩溃解决方法可应用在移动终端中解决native层程序崩溃问题。为便于理解,首先需要说明的是,本发明技术方案是通过hook(钩子)方式,将本应被调用执行的目标函数替换为调用执行替换函数,其中,目标函数为待hook函数,即为可能发生native crash(本地崩溃)的目标程序在运行时调用的相关函数,替换函数为hook函数。该替换函数包含在第一动态链接库文件中,调用执行该目标函数的为第二动态链接库文件,而目标函数既不在第一动态链接库文件中,也不在第二动态链接库文件中。举例说明,文件A.so需要调用文件B.so中的函数B,则函数B为目标函数。当文件A.so被hook时,用于代替函数B被真正调用的函数C为替换函数,函数C的动态链接库文件是C.so,且函数C中包含有修复代码,则文件C.so即为第一so文件,文件A.so即为第二so文件,或调用方so文件,调用目标函数B。
[0017] 动态链接库文件与终端系统相对应,若在android系统下则为so(share object)文件。
[0018] 请参见图1,本发明第一实施例提供了一种程序崩溃解决方法,包括:
[0019] 步骤101、获取第一动态链接库文件,并将其加载到目标程序中,该第一动态链接库文件中包含替换函数,该替换函数中包含修复代码;
[0020] 开发人员将包含该修复代码的替换函数编译为第一动态链接库文件。该修复代码中可包括多个不同函数对应参数的校验规则,该校验规则用于校验当函数被调用时引入的参数的结果是符合校验规则,即用于校验该目标函数被调用时是否出现错误,也即是否会引发程序发生native crash。
[0021] 例如,校验规则为校验该引入参数为指针时,该指针是否不为空指针或者野指针,则若该指针不为空指针或野指针,则校验结果为符合该校验规则,该引入的参数不存在错误,若该指针为空指针或野指针,则校验结果为不符合该校验规则,该引入参数存在错误,会引起目标程序发生native crash。
[0022] 该修复代码中还包括:校验后的执行逻辑以及目标函数的地址。其中,校验后的执行逻辑是指根据不同的校验结果执行不同的操作。
[0023] 通过调用native层hook方法,例如通过DLOPEN函数,将包含替换函数的第一so文件加载到目标程序中。可以理解的,利用DLOPEN函数在目标程序中加载so文件,只是一种示例,在实际应用中,还可以利用具有相同功能的其他函数。
[0024] 开发人员将目标函数、替换函数、第一动态链接库文件、第二动态链接库文件的相关信息写入配置文件,将该配置文件置于服务器中,该相关信息具体可包括:目标函数的名称、替换函数的名称、包含该替换函数的第一so文件的名称、该第一so文件的下载地址,以及,调用该目标函数的第二so文件的名称。服务器将该配置文件下发给移动终端,移动终端下载该配置文件后,根据该配置文件中包含的下载地址,下载该第一动态链接库文件。
[0025] 进一步地,获取该配置文件的校验码,如MD5值,该校验码用于校验获取的该配置文件是否合法,即是否为完整的未被修改过的原始文件。根据该校验码,校验该配置文件是否合法,若不合法,则重新获取该配置文件。
[0026] 步骤102、将用于调用目标函数的第二动态链接库文件中调用该目标函数的信息,替换为调用该替换函数的信息;
[0027] 第二动态链接库文件存在于移动终端本地。将该第二动态链接库文件中调用该目标函数的信息替换为调用该替换函数的信息,使得该第二动态链接库文件执行调用该目标函数时,实际调用的是该替换函数。
[0028] 步骤103、当检测到该目标程序调用该第二动态链接库文件时,将该第二动态链接库文件调用的该目标函数替换为调用该替换函数,并运行修复代码校验若该目标函数被调用时引入的参数,是否符合该修复代码中包含的校验规则;
[0029] 由于已经将该第二动态链接库文件调用函数的相关信息改变,因此,当该目标程序调用该第二动态链接库文件时,该第二动态链接库文件继而调用的是该替换函数而不再是该目标函数,运行该替换函数中包含的修复代码,通过该修复代码中包含的校验规则,校验若该目标函数被调用时引入的参数是否符合该校验规则。
[0030] 步骤104、若符合,则继续调用该目标函数,若不符合,则返回预置值,使得该目标程序继续运行。
[0031] 若校验结果是符合校验规则,该引入的参数不存在错误,则修复代码根据其自身记载执行逻辑以及该目标函数的地址,从该目标函数所在的so文件调用该目标函数,以实现该目标函数的实体功能。由于不修改目标函数,当引入的参数不存在错误时,替换函数按照该目标函数的地址从该目标函数所在的so文件调用该目标函数,因此调用的仍然是原目标函数,不会影响程序的正常运行。
[0032] 若校验结果是不符合校验规则,该引入的参数存在错误,则由该修复代码返回预置值。该预置值为当调用目标函数时,该目标函数可能返回的有效错误返回值(如,-1),这样程序就会认为获得了有效值,因此不会影响程序的继续运行,就不会引起程序崩溃。
[0033] 进一步地,服务器接收移动终端上报的堆栈信息,该堆栈信息由移动终端在出现程序native crash时生成,其中记录了发生native crash的程序,以及该程序在发生native crash时调用的函数,若该堆栈信息中包含了调用该替换函数的信息,则可确定native crash未被解决,若该堆栈信息中未包含调用该替换函数的信息,则可确定本次native crash不是由该替换函数引起,该替换函数所导致的native crash问题已经得到解决。通过海量移动终端上报的堆栈信息,可以提高非必现的native crash问题出现的概率,使得native crash更容易被发现,且更快地获得修复结果,从而提高修复native crash的效率。
[0034] 进一步地,若经过上述步骤,通过对移动终端上报的堆栈信息进行分析,得到的分析结果为仍然出现了native crash,则修改该修复代码,或通过下发配置文件指令移动终端恢复该第二动态链接库文件中的调用该目标函数的信息。具体地,该配置文件中还包含出现错误的目标函数的名称、调用该出现错误的目标函数的动态链接库文件的名称。移动终端根据hook日志与该配置文件执行unhook操作,恢复该调用该待恢复的目标函数的动态链接库文件中的调用该目标函数的信息。可以理解地,移动终端在每次执行hook操作后生成hook日志,记录被hook的动态链接库文件的名称,该被hook的动态链接库文件中被替换的目标函数的名称及地址、对应的替换函数的名称及地址。
[0035] 本发明实施例中,通过hook方法将包含修复代码的替换函数加载到目标程序后,替换可能引发程序崩溃的目标函数,被调用时运行修复代码校验若调用目标函数所引入的参数是否符合校验规则,若符合则重新调用目标函数,若不符合则返回预置值作为有效结果值使得目标程序正常运行而不会崩溃,从而通过动态hook,在不影响目标程序运行的情况下,降低进程崩溃的概率,提高系统运行速度以及顺畅性。同时,由于只修改其中的修复代码,因此每次只需更新so文件以及配置文件,而不需要更新客户端版本,节省时间,提高效率。
[0036] 请参见图2,本发明第二实施例提供了一种程序崩溃解决方法,包括:
[0037] 步骤201、从服务器端获取配置文件,该配置文件包括目标函数的名称、替换函数的名称、第一动态链接库文件的名称、第一动态链接库文件的下载地址,以及,第二动态链接库文件的名称;
[0038] 开发人员将目标函数的名称、替换函数的名称、包含该替换函数的第一so文件的名称、该第一so文件的下载地址,以及,调用该目标函数的第二so文件的名称写入配置文件,将该配置文件置于服务器中,服务器将该配置文件下发给移动终端。
[0039] 步骤202、根据该第一动态链接库文件的下载地址,下载该第一动态链接库文件并将其加载到目标程序中;
[0040] 移动终端下载该配置文件后,根据该配置文件中包含的下载地址,下载该第一动态链接库文件,并将该第一动态链接库文件加载到目标程序中。
[0041] 开发人员将包含该修复代码的替换函数编译为第一动态链接库文件。该修复代码中可包括多个不同函数对应参数的校验规则,该校验规则用于校验当函数被调用时引入的参数的结果是符合校验规则,即用于校验该目标函数被调用时是否出现错误,也即是否会引发程序发生native crash。该修复代码中还包括:校验后的执行逻辑以及目标函数的地址。其中,校验后的执行逻辑是指根据不同的校验结果执行不同的操作。
[0042] 进一步地,根据配置文件中包含的该第一动态链接库文件的下载地址,下载该第一动态链接库文件的校验码,如MD5值,该校验码用于校验下载的该第一动态链接库文件是否合法,即是否为完整的未被修改过的原始文件。根据该校验码,校验该第一动态链接库文件是否合法,若不合法,则重新下载该第一动态链接库文件。
[0043] 进一步地,该配置文件中还包含机型信息,移动终端在执行步骤202之前,将配置文件中的机型信息与自己的机型信息进行匹配,若匹配,则执行步骤202,否则,停止执行后续操作。
[0044] 步骤203、将用于调用目标函数的第二动态链接库文件中调用该目标函数的信息,替换为调用该替换函数的信息;
[0045] 具体可以分为以下两种方式实现:
[0046] 第一种是可利用android系统的全局偏移表(GOT,Global Offset Table)进行hook,实现用调用该替换函数的信息替换调用该目标函数的信息。
[0047] 具体是根据该配置文件中的该目标函数的名称、该替换函数的名称、该第一动态链接库文件的名称以及该第二动态链接库文件的名称,在系统的结构体链表中查找该第二动态链接库文件,在该动态链接库文件中查找该目标函数的地址信息的全局偏移表,并在该全局偏移表中记录的需调用的该目标函数的地址修改为该替换函数的地址。更具体地,Android native层运行主要是各类的动态链接库的调用,而动态链接库之间的函数调用,主要依靠动态链接库的全局偏移表来记录函数在内存中的地址。android程序运行时,会维护一个solist结构体链表,而此结构体链表则记录了该android程序运行时所加载的全部动态链接库的信息,例如so文件的名称、so文件的存储位置、so文件中包含的Got表的位置等等。根据配置文件中的目标函数的名称、调用该目标函数的第二动态链接库文件的名称、替换函数的名称以及包含该替换函数的第一动态链接库文件的名称,从此结构体链表中找出需要hook的so文件,即作为目标函数的调用方的so文件,然后找到该so文件中包含的记录了该目标函数的地址的GOT表项,将该GOT表项中记录的待hook函数的地址修改为替换函数的地址。举例来说,假设作为调用方的libmytest.so中的GOT表项中记录了需调用的libc.so中的getchar函数(目标函数)的地址A,则找到libmytest.so,将libmytest.so中记录了getchar函数的地址A的GOT表项中记录的地址A修改为替换函数所在的新地址B,这样,当libmytest.so需要调用getchar函数时,就会根据GOT表中的记录地址B调用替换函数,而非原目标函数getchar函数。
[0048] 第二种是可利用android inline hook的机制进行hook,实现用调用该替换函数的信息替换调用该目标函数的信息。
[0049] 在程序运行时,利用android系统加载动态链接库时未利用过程链接表(PLT,Procedure Linkage Table)表的特性,在PLT表内填写需要跳转到的替换函数的地址,再把相对跳转的地址改为PLT表内填写的该替换函数的地址,完成相对地址的跳转,达到inline hook的目的。其中,相对跳转的地址是被调用的目标函数地址相对调用时地址的偏移。
[0050] 将以上两种hook方案封装到一个软件开发工具包(SDK,Software Development Kit)内,使暴露的参数均为字符串,这样就可以达到仅仅下发字符串配置,就能动态hook的目的。
[0051] 以上的hook过程都是动态hook,所有的hook动作都是在进程运行时进行,不影响用户使用客户端的情况下进行的,让用户无感知,而且对程序本身的稳定性,兼容性和性能不会产生影响。
[0052] 步骤204、当检测到该目标程序调用该第二动态链接库文件时,将该第二动态链接库文件调用的该目标函数替换为调用该替换函数,并运行修复代码校验若该目标函数被调用时引入的参数,是否符合该修复代码中包含的校验规则;
[0053] 由于已经将该第二动态链接库文件调用函数的相关信息改变,因此,当该目标程序调用该第二动态链接库文件时,该第二动态链接库文件继而调用的是该替换函数而不再是该目标函数,运行该替换函数中包含的修复代码,通过该修复代码中包含的校验规则,校验若该目标函数被调用时引入的参数是否符合该校验规则。
[0054] 步骤205、若符合,则继续调用该目标函数,若不符合,则返回预置值,使得该目标程序继续运行。
[0055] 若校验结果是符合校验规则,该引入的参数不存在错误,则修复代码根据其自身记载执行逻辑以及该目标函数的地址,从该目标函数所在的so文件调用该目标函数,以实现该目标函数的实体功能。由于不修改该目标函数,当引入的参数不存在错误时,该替换函数按照该目标函数的地址从该目标函数所在的so文件调用该目标函数,因此调用的仍然是原目标函数,不会影响程序的正常运行。
[0056] 若校验结果是不符合校验规则,该引入的参数存在错误,则由该修复代码返回预置值。该预置值为当调用目标函数时,该目标函数可能返回的有效错误返回值(如,-1),这样程序就会认为获得了有效值,因此不会影响程序的继续运行,就不会引起程序崩溃。
[0057] 一个实例中,本实施例中技术方案的完整过程如下:
[0058] 用户(开发人员)将编写后的包含替换函数的第一so文件的下载地址,以及,第一so文件的名称、目标函数的名称、调用目标函数的第二so文件的名称和替换函数的名称填入配置文件,该配置文件可包含下载包含替换函数的第一so文件的URL以及关于下载的so文件是否合法的校验码,一般该校验码为MD5值。将该配置文件置于服务器中,进一步将配置文件的下载URL下发到客户端。
[0059] 具体地,配置文件为xml文件,配置文件的下载URL格式可以是http://domain/path/to/xml#md5,下载xml文件以及md5值,通过md5值校验所下载的xml文件是否正确,若正确,则解析xml文件获得configure对象,进一步地,反序列化本地配置文件(xml文件),解析xml文件获得本地的configure对象,通过对比此两个configure对象,以对比下载的xml文件与本地的xml文件的版本号。若对比的结果是下载的xml文件版本号更大,即更高的版本,则读取下载的xml文件的option字段,若option字段为clear,则删除本地的xml文件,若option字段为merge,则将下载的xml文件与本地的xml文件合并。另一方面,若对比的结果是本地的xml文件版本号更大,则丢弃下载的xml文件,执行本地配置文件。
[0060] 执行时本地配置文件时,先传入执行unhook(撤销hook操作)。从configure中取出需要unhook的任务,再从hook manager中获取已成功执行的hook记录,求二者的交集,以获取要执行的unhook任务中已成功hook的任务来执行unhook。逐个执行unhook任务,并见执行完的任务从hook manager的记录中删除。
[0061] 进一步地,创建临时目录和SDK的so文件存放目录,临时目录用来临时存放下载的包含替换函数的第一so文件。并对临时目录进行非阻塞式加锁,保证实时只有一个线程可以解锁进入临时目录。加锁成功后,根据配置文件中的第一so文件的下载地址,去下载该第一so文件,将下载的第一so文件存放在临时目录中,同时使用与第一so文件对应的MD5值对该第一so文件进行校验,通过校验的第一so文件则存放在SDK的so文件存放目录。
[0062] 进一步地,释放临时目录的锁,执行后续hook任务。若之前对临时目录加锁未成功,有其他进程在进行下载任务,则对临时目录进行阻塞式枷锁,等待下载任务完成,然后立即释放锁。再执行后续hook任务。
[0063] 根据从hook manager中拿到的已成功执行的hook任务记录。对当前需要执行hook任务去重,即,去除已成功执行的hook任务。查找与未执行的hook任务对应的so文件的绝对存储路径,执行hook任务。即,将调用目标函数的第二so文件中指向执行调用目标函数的指针信息都替换为指向执行替换函数的指针信息,运行替换函数中包含的修复代码,判断若目标函数被调用时引入的参数是否符合该修复代码中的校验规则,若不符合,则返回错误值,若符合,则运行的修复代码根据该修复代码中的目标函数的地址,调用执行该目标函数继续完成功能。这样参数存在错误的目标函数被调用时,动态hook,使用预先由用户编译好的替换函数替代该目标函数被目标进程调用,解决可能出现的native crash问题。
[0064] 将执行完毕的hook任务添加到hook manager的记录中,直到遍历所有hook任务后,没有找到未完成的hook任务,则完成本次解决native crash的方案。
[0065] 本发明实施例中,通过hook方法将包含修复代码的替换函数加载到目标程序后,替换可能引发程序崩溃的目标函数,被调用时运行修复代码校验若调用目标函数所引入的参数是否符合校验规则,若符合则重新调用目标函数,若不符合则返回预置值作为有效结果值使得目标程序正常运行而不会崩溃,从而通过动态hook,在不影响目标程序运行的情况下,降低进程崩溃的概率,提高系统运行速度以及顺畅性。同时,由于只修改其中的修复代码,因此每次只需更新so文件以及配置文件,而不需要更新客户端版本,节省时间,提高效率。
[0066] 参见图3,本发明第三实施例还提供了一种程序崩溃解决装置,该装置包括:
[0067] 获取模块301,用于获取第一动态链接库文件;
[0068] 加载模块302,用于将该第一动态链接库文件加载到目标程序中,该第一动态链接库文件中包含替换函数,该替换函数中包含修复代码;
[0069] 替换模块303,用于将用于调用目标函数的第二动态链接库文件中调用该目标函数的信息,替换为调用该替换函数的信息;
[0070] 校验模块304,用于当检测到该目标程序调用该第二动态链接库文件,进而调用该目标函数时,替换为调用该替换函数并运行该修复代码,校验若该目标函数被调用时,引入的参数是否符合该修复代码中包含的校验规则;
[0071] 执行模块305,用于若校验模块304校验的结果是该目标函数被调用时,引入的参数符合该修复代码中包含的校验规则,则调用该目标函数,若校验模块304校验的结果是该目标函数被调用时,引入的参数不符合该修复代码中包含的校验规则,则返回预置值,使得该目标程序继续运行。
[0072] 关于本实施例的装置中各模块实现技术方案的其他细节,可参考图1所示实施例中的描述,此处不再赘述。
[0073] 本实施例中,通过hook方法将包含修复代码的替换函数加载到目标程序后,替换可能引发程序崩溃的目标函数,被调用时运行修复代码校验若调用目标函数所引入的参数是否符合校验规则,若符合则重新调用目标函数,若不符合则返回预置值作为有效结果值使得目标程序正常运行而不会崩溃,从而通过动态hook,在不影响目标程序运行的情况下,降低进程崩溃的概率,提高系统运行速度以及顺畅性。同时,由于只修改其中的修复代码,因此每次只需更新so文件以及配置文件,而不需要更新客户端版本,节省时间,提高效率。
[0074] 参见图4,本发明第四实施例提供了一种程序崩溃解决装置,该装置包括:
[0075] 获取模块401,用于获取第一动态链接库文件;
[0076] 加载模块402,用于将该第一动态链接库文件加载到目标程序中,该第一动态链接库文件中包含替换函数,该替换函数中包含修复代码;
[0077] 替换模块403,用于将用于调用目标函数的第二动态链接库文件中调用该目标函数的信息,替换为调用该替换函数的信息;
[0078] 校验模块404,用于当检测到该目标程序调用该第二动态链接库文件,进而调用该目标函数时,替换为调用该替换函数并运行该修复代码,校验若该目标函数被调用时,引入的参数是否符合该修复代码中包含的校验规则;
[0079] 执行模块405,用于若校验模块404校验的结果是该目标函数被调用时,引入的参数符合该修复代码中包含的校验规则,则调用该目标函数,若校验模块404校验的结果是该目标函数被调用时,引入的参数不符合该修复代码中包含的校验规则,则返回预置值,使得该目标程序继续运行。
[0080] 进一步地,获取模块401包括:
[0081] 获取子模块4011,用于从服务器端获取配置文件,该配置文件包括该目标函数的名称、该替换函数的名称、该第一动态链接库文件的名称、该第一动态链接库文件的下载地址,以及,该第二动态链接库文件的名称;
[0082] 下载模块4012,用于根据该第一动态链接库文件的下载地址,下载该第一动态链接库文件。
[0083] 进一步地,替换模块403包括:
[0084] 查找模块4031,用于根据该配置文件中的该目标函数的名称、该替换函数的名称、该第一动态链接库文件的名称以及该第二动态链接库文件的名称,在系统的结构体链表中查找该第二动态链接库文件;
[0085] 查找模块4031,还用于在该动态链接库文件中查找该目标函数的地址信息的全局偏移表;
[0086] 记录模块4032,用于在该全局偏移表中记录的需调用的该目标函数的地址修改为该替换函数的地址。
[0087] 替换模块403还可以进一步包括:
[0088] 填写模块4033,用于在过程链接表内填写需要跳转到的替换函数的地址;
[0089] 修改模块4034,用于将相对跳转的地址修改为该过程链接表内的替换函数的地址,该相对跳转的地址为被调用的目标函数地址相对调用时地址的偏移。
[0090] 进一步地,获取模块401,还用于若运行该目标程序造成程序崩溃,则重新获取包含修改后的修复代码的该第一动态链接库文件。
[0091] 关于本实施例的装置中各模块实现技术方案的其他细节,可参考图1至图3所示实施例中的描述,此处不再赘述。
[0092] 本实施例中,通过hook方法将包含修复代码的替换函数加载到目标程序后,替换可能引发程序崩溃的目标函数,被调用时运行修复代码校验若调用目标函数所引入的参数是否符合校验规则,若符合则重新调用目标函数,若不符合则返回预置值作为有效结果值使得目标程序正常运行而不会崩溃,从而通过动态hook,在不影响目标程序运行的情况下,降低进程崩溃的概率,提高系统运行速度以及顺畅性。同时,由于只修改其中的修复代码,因此每次只需更新so文件以及配置文件,而不需要更新客户端版本,节省时间,提高效率。
[0093] 此外,本发明实施例还提供一种计算机可读存储介质,其内存储有计算机可执行指令,上述的计算机可读存储介质例如为非易失性存储器例如光盘、硬盘、或者闪存。上述的计算机可执行指令用于让计算机或者类似的运算装置完成上述的数据处理方法中的各种操作。
[0094] 以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭示如上,然而并非用以限定本发明,任何本领域技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容做出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。