一种模块回调函数参数不匹配的修复方法及相关设备技术

技术编号:33298408 阅读:16 留言:0更新日期:2022-05-06 12:03
本发明专利技术提供了一种模块回调函数参数不匹配的修复方法以及相关设备,包括:获取修复程序中回调函数类型中包含的新建参数和源程序上层回调函数中包含的原始参数;比较新建参数和原始参数,将所述新建参数中与所述原始参数中的不同的参数作为新增参数信息;查找所有源程序中关于原始参数回调函数的回调指针,并利用所回调类回调指针对应的虚函数接口,通知上层允许基本代码调用新增参数信息对应的扩展代码来修复,进而忽略掉所述新增参数信息,从而将收到数据的处理逻辑与底层数据进行解耦合,通知上层允许基本代码调用新增参数信息对应的扩展代码来修复,进而忽略掉所述新增参数信息,以解决参数不匹配导致程序执行出现崩溃的问题。的问题。的问题。

【技术实现步骤摘要】
一种模块回调函数参数不匹配的修复方法及相关设备


[0001]本专利技术涉及计算机程序软件
,尤其涉及一种模块回调函数参数不匹配的修复方法及相关设备。

技术介绍

[0002]在程序开发中,为了对代码解耦合,通常都会使用设置回调函数的指针,来解决底层功能与上层调用者解除耦合关系,回调函数指针的执行可以让底层功能执行完成后通知调用者。
[0003]然而现有的问题是,很多时候程序开发者会对程序来进行分模块开发,那么有的模块升级了代码功能,如对某个内部通知外部的回调函数多增加了一个参数,而另一个模块没有对所有使用回调的地方进行修改增加参数,程序执行时则会导致crash问题。同时回调函数指针无法检查其参数个数,因此如果底层模块增加了函数参数个数,而对应的回调函数没有增加参数个数,程序并不知道不匹配,只有程序执行时并且执行到回调函数时,才会导致程序crash。即为在正常计算机系统运行过程中,因某种原因宕机,或主机、程序停止工作等情况。
[0004]对于程序代码没有发布的情况下,很容易的通过修改程序代码来修复该功能。而对于程序已经发布的情况下,则需要一种方法能够修复这样的参数不匹配的情况。

技术实现思路

[0005]本专利技术提供了一种模块回调函数参数不匹配的修复方法,通过查找所有源程序中关于原始参数回调函数的回调指针,并调用回调类回调指针对应的虚函数接口,基于hook修复技术,忽略掉所述新增参数信息,以解决参数不匹配导致程序执行出现崩溃的问题。
[0006]一种模块回调函数参数不匹配的修复方法,包括:
[0007]获取修复程序中回调函数类型中包含的新建参数和源程序上层回调函数中包含的原始参数;
[0008]比较所述新建参数和所述原始参数获得新增参数;其中,所述新增参数为所述新建参数中与所述原始参数中的不同参数;
[0009]查找所有源程序中关于原始参数回调函数的回调指针;
[0010]调用所述回调指针对应的虚函数接口,并基于hook技术实现程序修复。
[0011]优选的是,所述新增参数的信息包括参数个数、参数命名和参数类型。
[0012]优选的是,所述虚函数接口的查找过程包括如下步骤:
[0013]编写一个具有嵌套类的新建类,所述嵌套类内定义了虚函数接口,以继承源程序中的类,实现读取数据产生回调的处理逻辑;
[0014]查找并记录源程序中所有继承自源程序的类,并记录所述继承自源程序类的创建地址;
[0015]并查找所述继承自源程序的类的调用虚函数接口的地址;
[0016]其中,所述查找调用虚函数接口的地址的过程通过汇编代码实现。
[0017]优选的是,所述查找虚函数接口地址的过程包括:
[0018]解析模块中移植的可执行的文件,并解析出只读字段;其中,所述只读字段中存储有每个类的名称和对应的续表;
[0019]遍历所述只读字段,通过名称检索方式查找所有继承类,进而创建目标类;
[0020]遍历所述续表中的类,并将所述目标类对应的第一个虚函数作为析构函数,并将所述析构函数对应续表的位置作为匹配函数进行调用;
[0021]记录所有满足查找条件的目标类名称和和对应的类的相对于模块的起始地址和偏移地址,进而获取模块的真实加载内存地址。
[0022]优选的是,还包括建立查找链表,其包括:
[0023]将所述目标类的起始地址和偏移地址均存储到查找链表中;
[0024]并通过对比创建的实例化对象的大小和存储续表的地址来对应于创建的目标类。
[0025]优选的是,所述基于hook技术实现程序修复的过程包括:
[0026]建立多个堆栈,并在所述堆栈中分别压入寄存器的值,其中,所述堆栈与新建参数个数相同;
[0027]从实例化指针中取出对象的虚表指针;
[0028]新建对象指针寄存器,并将对象指针赋值给所述对象指针寄存器;
[0029]调用虚表的第二个函数,并将所述第二个函数的调用指令修改为跳转指令,忽略并弹出多余的参数。
[0030]优选的是,所述查找链表以34位系统或64位系统方式定义。
[0031]一种模块回调函数参数不匹配的修复装置,包括:
[0032]获取模块,用于获取修复程序中回调函数类型中包含的新建参数和源程序上层回调函数中包含的原始参数;
[0033]比较模块,用于比较所述新建参数和所述原始参数获得新增参数;
[0034]查找模块,用于查找所有源程序中关于原始参数回调函数的回调指针;
[0035]修复模块,用于利用所述回调指针对应的虚函数接口,通知上层允许基本代码调用新增参数信息对应的扩展代码来修复,进而忽略掉所述新增参数的信息,从而将收到数据的处理逻辑与底层数据进行解耦合,实现程序修复。
[0036]一种模块回调函数参数不匹配的修复服务器,所述服务器包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述模块回调函数参数不匹配的修复方法的步骤。
[0037]一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现所述模块回调函数参数不匹配的修复方法的步骤。
[0038]有益效果
[0039]本专利技术提供了一种模块回调函数参数不匹配的修复方法,通过查找所有源程序中关于原始参数回调函数的回调指针,并利用所回调类回调指针对应的虚函数接口,通知上层允许基本代码调用新增参数信息对应的扩展代码来修复,进而忽略掉所述新增参数信息,以解决参数不匹配导致程序执行出现崩溃的问题。
[0040]本专利技术通过编写一个类来继承之前编写的类,并实现其中的虚接口,从而再程序
中找到所有的虚函数指针的调用点,解决了汇编程序中虚接口查找困难的问题,进而保证修复所有的函数调用点,以保证程序稳定运行。
附图说明
[0041]图1为本专利技术所述的模块回调函数参数不匹配的修复方法的流程图。
[0042]图2为本专利技术所述的查找所有源程序中关于原始参数回调函数的回调指针方法流程图
[0043]图3为本专利技术所述的查找继承自源程序的类的调用虚函数接口的地址过程流程图。
[0044]图4为本专利技术所述的模块回调函数参数不匹配的修复装置结构示意图。
具体实施方式
[0045]以下由特定的具体实施例说明本专利技术的实施方式,熟悉此技术的人士可由本说明书所揭露的内容轻易地了解本专利技术的其他优点及功效,显然,所描述的实施例是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本专利技术保护的范围。
[0046]需要说明的是,在本专利技术的描述中,术语“中”、“上”、“下”、“横”、“内”等指示的方向或位置关系的术语是基于附图所示的方向或位置关系,这仅仅是为了便于描述,而不是指示或暗示所述装置或元件必须具有特定的方位、以特定的方位构造和本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种模块回调函数参数不匹配的修复方法,其特征在于,包括:获取修复程序中回调函数类型中包含的新建参数和源程序上层回调函数中包含的原始参数;比较所述新建参数和所述原始参数获得新增参数;其中,所述新增参数为所述新建参数中与所述原始参数中的不同参数;查找所有源程序中关于原始参数回调函数的回调指针;调用所述回调指针对应的虚函数接口,并基于hook技术实现程序修复。2.根据权利要求1所述的模块回调函数参数不匹配的修复方法,其特征在于,所述新增参数的信息包括参数个数、参数命名和参数类型。3.根据权利要求1或2所述的模块回调函数参数不匹配的修复方法,其特征在于,所述虚函数接口的查找过程包括如下步骤:编写一个具有嵌套类的新建类,所述嵌套类内定义了虚函数接口,以继承源程序中的类,实现读取数据产生回调的处理逻辑;查找并记录源程序中所有继承自源程序的类,并记录所述继承自源程序类的创建地址;并查找所述继承自源程序的类的调用虚函数接口的地址;其中,所述查找调用虚函数接口的地址的过程通过汇编代码实现。4.根据权利要求3所述的模块回调函数参数不匹配的修复方法,其特征在于,所述查找虚函数接口地址的过程包括:解析模块中移植的可执行的文件,并解析出只读字段;其中,所述只读字段中存储有每个类的名称和对应的续表;遍历所述只读字段,通过名称检索方式查找所有继承类,进而创建目标类;遍历所述续表中的类,并将所述目标类对应的第一个虚函数作为析构函数,并将所述析构函数对应续表的位置作为匹配函数进行调用;记录所有满足查找条件的目标类名称和和对应的类的相对于模块的起始地址和偏移地址,进而获取模块的真实加载内存地址。5.根据权利要求4所述的模块回调函数参数不匹配的修复方法,其特征在于,还包括建立查找链表,其包...

【专利技术属性】
技术研发人员:周志刚
申请(专利权)人:武汉斗鱼网络科技有限公司
类型:发明
国别省市:

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

1