首页> 中国专利> 一种基于动态插桩的二进制多执行体软件插桩方法

一种基于动态插桩的二进制多执行体软件插桩方法

摘要

本发明公开了一种基于动态插桩的二进制多执行体软件插桩方法,包括:步骤S1:使用加载器加载二进制多执行体软件,得到文件格式;步骤S2:从文件格式信息中解析符号表,遍历符号表中的函数名;步骤S3:使用动态翻译器遍历软件指令逐个提取翻译块进行处理;步骤S4:对每一个翻译块插入探针代码;步骤S5:使用动态执行器执行所述翻译块代码;步骤S6:使用动态执行器在执行翻译块代码的过程中监控系统调用信息;步骤S7:直到多执行体软件终止或崩溃,得到软件运行过程的执行轨迹记录文件。本发明具有原理简单、操作简便、适用范围广、精确度高等优点。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-08-23

    实质审查的生效 IPC(主分类):G06F11/36 专利申请号:202210428966X 申请日:20220422

    实质审查的生效

  • 2022-08-05

    公开

    发明专利申请公布

说明书

技术领域

本发明主要涉及到软件动态分析技术领域,特指一种基于动态插桩的二进制多执行体软件插桩方法。

背景技术

软件插桩是一种基本的软件动态分析方法,它是在目标软件中插入用于提取、判定、记录的功能代码(一般称为探针代码),从而在不影响目标软件正常运行的前提下,通过探针代码的执行完成对软件运行时执行流、数据流等信息的监控和记录。软件插桩应用于软件行为功能分析、基于覆盖率引导的模糊测试等场景,可为分析目标软件的功能及目标软件的模糊测试提供反馈信息。

然而,传统的软件插桩技术存在以下几个方面的不足:

一是多以源代码插桩方式为主,对二进制软件的支持不足;

二是对于以多线程、多进程态运行的多执行体软件,由于存在多个执行体同时运行,因为线程调度策略及时机的不同,不同执行体的工作流程相互交织,多执行体的执行路径会产生交叉,导致插桩获取的信息不准确和不确定。

针对上述问题一,源码插桩方式要求掌握软件的源代码,无法应用于闭源软件,使用场景受局限。

针对上述问题二,多执行体软件会在运行过程中创建多个执行体,并通过共享代码段的方式为各个执行体提供同一份执行代码,当多个执行体以随机调度方式访问探针代码时,会造成执行路径混淆,难以为模糊测试的调度过程提供准确有效的执行路径反馈信息。多执行体软件的运行过程中,不同的执行体完成不同的任务,有独立的工作流程和轨迹,插桩需要识别不同执行体,并采取针对性的措施。

现有技术中,针对二进制多执行体软件的插桩,在插桩方式的选择方面,需要以动态二进制插桩方式,在多执行体创建和执行过程中都注入探针代码;在探针代码的工作机制方面,在监控和记录多执行体软件执行路径反馈信息过程中,需要识别软件执行过程中处理用户请求而新建的目标执行体,只记录目标执行体的执行路径信息,以达到精确的监控和记录功能;在探针代码的性能开销方面,需要快速识别当前执行体是否为目标执行体并记录执行轨迹。应避免使用如getpid等通过系统调用标识执行体的方法,这将导致系统从用户态向内核态切换造成巨大性能开销。从降低开销的角度看,更好的方法是只利用当前现场信息进行区分。针对二进制多执行体软件进行模糊测试的执行路径反馈过程,既需要应用于软件运行时的动态注入过程,也需要在运行阶段只利用当前现场信息来快速识别目标执行体,从而精确执行探针代码的监控记录过程。

由上可知,现有的各种插桩方法不适用于动态的、多执行体的、性能开销要求小的场景,不能够满足在基于覆盖率引导的智能模糊测试中的需求。

发明内容

本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种原理简单、操作简便、适用范围广、精确度高的基于动态插桩的二进制多执行体软件插桩方法。

为解决上述技术问题,本发明采用以下技术方案:

一种基于动态插桩的二进制多执行体软件插桩方法,其步骤包括:

步骤S1:使用加载器加载二进制多执行体软件,得到其文件格式;

步骤S2:从文件格式信息中解析符号表,遍历符号表中的函数名,对每个函数名做特征字符匹配以确定多执行体软件的创建方式W;

步骤S3:使用动态翻译器遍历软件指令,记以分支跳转指令结束的代码段为翻译块,逐个提取翻译块进行处理;

步骤S4:在每一个翻译块前,插入根据当前现场信息选择性执行的探针代码;

步骤S5:使用动态执行器执行所述翻译块代码,运行到所述翻译块的探针代码时,判断是否满足识别代码条件;若满足,则执行功能代码记录执行路径,否则就跳过功能代码,执行探针代码后面的指令;

步骤S6:使用动态执行器在执行翻译块代码的过程中监控系统调用信息;若监控到clone系统调用事件准备创建新执行体,则中断执行,根据不同创建方式W进行更新,并使用动态执行器继续执行所述翻译块代码,完毕后返回步骤S3;否则执行完毕后回到步骤S3;

步骤S7:直到多执行体软件终止或崩溃,得到软件运行过程的执行轨迹记录文件。

作为本发明方法的进一步改进:在步骤S2中,对于以多线程构成的运行态,设置W=1,并通过C库接口读取系统预置的线程默认栈空间大小S,设置新执行体栈基址标识符B=0,B将在新线程创建前更新为其栈基址。

作为本发明方法的进一步改进:在步骤S2中,对于以多进程构成的运行态,设置W=2,并设置新执行体全局变量标识符F=0,F将在新进程创建前更新为1,新进程创建后恢复为0。

作为本发明方法的进一步改进:在步骤S2中,对于以多线程构成的运行态和以多进程构成的运行态之外的其他情况设置W=3。

作为本发明方法的进一步改进:在步骤S4中,识别代码根据W进行不同的识别条件判定,具体包括:

当W=1时,说明新执行体以线程态构成,判定识别到目标线程的方法为当前代码运行在目标线程的栈空间上,需要的信息为系统预置的线程默认栈空间大小S、新线程创建后其栈基址信息B、当前栈顶信息T;当T属于区间(B-S,B)时,判定探针代码运行在目标线程上,执行功能代码,否则跳过执行;

当W=2时,说明新执行体以进程态构成,判定识别到目标进程的方法为当前全局变量的取值为新进程创建时的拷贝值1而非父进程随后恢复的全局变量取值0,需要的信息为当前全局变量标识符F;当F=1时,认为探针代码运行在目标进程上,执行功能代码,否则跳过执行。

作为本发明方法的进一步改进:在步骤S4中,所述探针代码包括识别代码和功能代码;所述识别代码用来识别当前执行体是否为目标执行体,是则执行功能代码,否则跳过功能代码的执行。功能代码的执行将用来记录当前执行路径。

作为本发明方法的进一步改进:在步骤S5中,监控系统调用信息并更新的步骤包括:使用动态执行器在执行翻译块代码的过程中监控系统调用信息;若监控到clone系统调用事件准备创建新执行体,则中断执行,否则执行完毕后回到步骤S3。

作为本发明方法的进一步改进:在步骤S5中,若W=1,说明将创建的新执行体以线程态运行,读取寄存器得到新执行体栈基址信息C,更新新线程栈基址标识符B=C;若W=2,说明将创建的新执行体以进程态运行,修改新进程全局变量标识符F=1,使用动态执行器执行clone系统调用后再次中断执行,修改F=0。

作为本发明方法的进一步改进:在步骤S5中,使用动态执行器继续执行所述翻译块代码,完毕后返回步骤S3。

与现有技术相比,本发明的优点就在于:

1、本发明的一种基于动态插桩的二进制多执行体软件插桩方法,利用动态插桩技术,在多执行体软件的加载、多执行体的创建、多执行体的运行过程中分别插入不同的探针代码,实现对多执行体具体创建方式的确定、目标执行体的识别和执行轨迹的记录。

2、本发明的一种基于动态插桩的二进制多执行体软件插桩方法,本发明在加载过程中,探针代码主要完成对多执行体创建方式的识别;创建多执行体过程中的探针代码依据识别的创建方式,监控是否创建了新执行体,并且记录新执行体的现场信息用于目标执行体的识别。本发明在运行过程中,探针代码是依据当前现场信息和新执行体的现场信息,决定是否执行记录代码,并完成记录功能。

3、本发明的一种基于动态插桩的二进制多执行体软件插桩方法,可以在多执行体交替运转的过程中快速识别目标执行体,记录其对应的执行轨迹数据,来满足多执行体软件分析的需求,以及智能模糊测试中对执行路径反馈信息的精确性要求。

4、本发明的一种基于动态插桩的二进制多执行体软件插桩方法,针对多执行体软件创建新执行体来处理用户请求的工作场景,以新执行体为需要插桩的目标执行体,基于动态插桩对二进制多执行体软件进行插桩,并采集目标执行体的执行路径信息。

附图说明

图1是本发明方法的流程示意图。

图2是本发明在具体应用实例中监控系统调用信息并更新的流程示意图。

具体实施方式

以下将结合说明书附图和具体实施例对本发明做进一步详细说明。

如图1和图2所示,本发明的一种基于动态插桩的二进制多执行体软件插桩方法,其步骤包括:

步骤S1:使用加载器加载二进制多执行体软件,得到其文件格式;

步骤S2:从文件格式信息中解析符号表,遍历符号表中的函数名,对每个函数名做特征字符匹配以确定多执行体软件的创建方式W;

步骤S3:使用动态翻译器遍历软件指令,记以分支跳转指令结束的代码段为翻译块,逐个提取翻译块进行处理;对每一个翻译块,执行步骤S4;

步骤S4:在每一个翻译块前,插入根据当前现场信息选择性执行的探针代码;

步骤S5:使用动态执行器执行所述翻译块代码,运行到所述翻译块的探针代码时,判断是否满足识别代码条件;若满足,则执行功能代码记录执行路径,否则就跳过功能代码,执行探针代码后面的指令;

步骤S6:使用动态执行器在执行翻译块代码的过程中监控系统调用信息;若监控到clone系统调用事件准备创建新执行体,则中断执行,根据不同创建方式W进行更新,并使用动态执行器继续执行所述翻译块代码,完毕后返回步骤S3;否则执行完毕后回到步骤S3;

步骤S7:直到多执行体软件终止或崩溃,得到软件运行过程的执行轨迹记录文件。

在具体应用实例中,在步骤S2中,对于以多线程构成的运行态,设置W=1,并通过C库接口读取系统预置的线程默认栈空间大小S,设置新执行体栈基址标识符B=0,B将在新线程创建前更新为其栈基址。

在具体应用实例中,在步骤S2中,对于以多进程构成的运行态,设置W=2,并设置新执行体全局变量标识符F=0,F将在新进程创建前更新为1,新进程创建后恢复为0。

在具体应用实例中,其他情况设置W=3。

在具体应用实例中,在步骤S4中,探针代码由识别代码和功能代码组成。其中,识别代码用来识别当前执行体是否为目标执行体,是则执行功能代码,否则跳过功能代码的执行。功能代码的执行将用来记录当前执行路径。

在具体应用实例中,在步骤S4中,识别代码根据W进行不同的识别条件判定,具体包括:

当W=1时,说明新执行体以线程态构成,判定识别到目标线程的方法为当前代码运行在目标线程的栈空间上,需要的信息为系统预置的线程默认栈空间大小S、新线程创建后其栈基址信息B、当前栈顶信息T。当T属于区间(B-S,B)时,判定探针代码运行在目标线程上,执行功能代码,否则跳过执行。

当W=2时,说明新执行体以进程态构成,判定识别到目标进程的方法为当前全局变量的取值为新进程创建时的拷贝值1而非父进程随后恢复的全局变量取值0,需要的信息为当前全局变量标识符F。当F=1时,认为探针代码运行在目标进程上,执行功能代码,否则跳过执行。

在具体应用实例中,在步骤S6中,监控系统调用信息并更新的步骤包括:

步骤S601:使用动态执行器在执行翻译块代码的过程中监控系统调用信息。若监控到clone系统调用事件准备创建新执行体,则中断执行,继续执行步骤S602,否则执行完毕后回到步骤S3;

步骤S602:若W=1,说明将创建的新执行体以线程态运行,读取寄存器得到新执行体栈基址信息C,更新新线程栈基址标识符B=C;若W=2,说明将创建的新执行体以进程态运行,修改新进程全局变量标识符F=1,使用动态执行器执行clone系统调用后再次中断执行,修改F=0。进入步骤S603;

步骤S603:使用动态执行器继续执行所述翻译块代码,完毕后返回步骤S3。

在本发明的一个具体应用实例中,以qemu这一流行的计算机模拟器为例,说明本发明如何基于提出的软件插桩方法进行多执行体软件精确执行轨迹的记录。在这个应用实例中,本发明的详细步骤如下:

步骤1:基于开源的qemu框架,使用加载器加载二进制多执行体软件,得到其文件格式;

步骤2:基于步骤1,从文件格式信息中解析符号表,遍历符号表中的函数名,对每个函数名做特征字符匹配以确定多执行体软件的创建方式W。若匹配到“pthread_create@@”,说明是以多线程构成的运行态,设置W=1,并通过C库接口读取系统预置的线程默认栈空间大小S,设置新执行体栈基址标识符B=0,B将在新线程创建前更新为其栈基址;若匹配到“fork@@”,说明是以多进程构成的运行态,设置W=2,并设置新执行体全局变量标识符F=0,F将在新进程创建前更新为1,新进程创建后恢复为0;其他情况设置W=3

步骤3:基于qemu的动态翻译器,使用动态翻译器遍历软件指令,记以分支跳转指令结束的代码段为翻译块,逐个提取翻译块进行处理。对每一个翻译块,执行步骤4;

步骤4:利用qemu提供的函数接口tcg_gen_code()和cpu_tb_exec(),在每一个翻译块前,插入根据当前现场信息选择性执行的探针代码。探针代码由识别代码和功能代码组成。识别代码识别当前执行体是否为目标执行体,是则执行功能代码,否则跳过功能代码的执行。功能代码的执行将记录当前执行路径。

识别代码根据W进行不同的识别条件判定。W=1时,说明新执行体以线程态构成,判定识别到目标线程的方法为当前代码运行在目标线程的栈空间上,需要的信息为系统预置的线程默认栈空间大小S、新线程创建后其栈基址信息B、当前栈顶信息T。当T属于区间(B-S,B)时,认为探针代码运行在目标线程上,执行功能代码,否则跳过执行。W=2时,说明新执行体以进程态构成,判定识别到目标进程的方法为当前全局变量的取值为新进程创建时的拷贝值1而非父进程随后恢复的全局变量取值0,需要的信息为当前全局变量标识符F。当F=1时,认为探针代码运行在目标进程上,执行功能代码,否则跳过执行。

步骤5:基于步骤4,基于qemu的动态执行系统执行该翻译块代码,运行到该翻译块的探针代码时,判断是否满足识别代码条件。若满足则执行功能代码记录执行路径,否则跳过功能代码,执行探针代码后面的指令;

步骤6:基于步骤5,使用qemu的系统调用监控函数helper_syscall()在执行翻译块代码的过程中监控系统调用信息。若监控到clone系统调用事件准备创建新执行体,则中断执行,进入步骤7,否则执行完毕后回到步骤3;

步骤7:基于步骤6,若W=1,说明将创建的新执行体以线程态运行,读取寄存器得到新执行体栈基址信息C,更新新线程栈基址标识符B=C;若W=2,说明将创建的新执行体以进程态运行,修改新进程全局变量标识符F=1,基于qemu的动态执行系统执行clone系统调用后再次中断执行,修改F=0。进入步骤8;

步骤8:基于步骤7,基于qemu的动态执行系统继续执行该翻译块代码,完毕后返回步骤3;

步骤9:重复步骤3-8,直到多执行体软件终止或崩溃,得到软件运行过程的执行轨迹记录文件。

以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号