CN113535545A - 一种用于程序动态分析的二进制插桩方法 - Google Patents
一种用于程序动态分析的二进制插桩方法 Download PDFInfo
- Publication number
- CN113535545A CN113535545A CN202110667217.8A CN202110667217A CN113535545A CN 113535545 A CN113535545 A CN 113535545A CN 202110667217 A CN202110667217 A CN 202110667217A CN 113535545 A CN113535545 A CN 113535545A
- Authority
- CN
- China
- Prior art keywords
- basic block
- instruction
- instrumentation
- variable
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 57
- 238000004458 analytical method Methods 0.000 title claims abstract description 32
- 230000008569 process Effects 0.000 claims abstract description 33
- 238000013519 translation Methods 0.000 claims description 31
- 230000002085 persistent effect Effects 0.000 claims description 3
- 238000007405 data analysis Methods 0.000 abstract description 3
- 230000006870 function Effects 0.000 description 31
- 230000014616 translation Effects 0.000 description 26
- 238000004088 simulation Methods 0.000 description 10
- 238000013461 design Methods 0.000 description 5
- 101100219321 Oryza sativa subsp. japonica CYP85A1 gene Proteins 0.000 description 4
- 238000012360 testing method Methods 0.000 description 4
- 238000010586 diagram Methods 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
- 239000000523 sample Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种用于程序动态分析的二进制插桩方法,包括:插桩过程在指令集翻译成虚拟指令集过程完成;插桩粒度在基本块进行插桩;插桩指令的任务为获取基本块第一条指令的地址及当前基本块所包含的指令计数;插桩收集的基本块执行序列通过对应目标码中的调试信息进行分析。本发明不需要对源代码进行插桩,不改变被测程序执行流程,不需要重新编译生成目标码,就可以收集程序运行轨迹,进行动态分析;不需要获取被测程序的源代码,只需要被测程序的调试信息,有利于被测程序提供方版权控制;不需要针对每一种客户机和宿主机体系架构单独设计插桩方法和数据分析方法,能够应用于多种体系结构。
Description
技术领域
本发明涉及计算机软件动态分析领域,尤其涉及一种用于程序动态分析的二进制插桩方法。
背景技术
软件插桩是一项十分重要的软件动态分析技术,通过软件插桩技术可有效收集程序执行过程信息,如路径覆盖信息、函数调用关系信息,广泛用于软件性能分析、程序优化、测试覆盖分析、测试用例生成与约简、软件缺陷检测与修复,可有效提高复杂嵌入式软件的可靠性。但是,常用的软件插桩方法通常是源代码插桩。源代码插桩需要修改被测软件的源代码并重新编译链接生成目标码,不但过程复杂,而且不可避免的改变被测软件的运行流程,严重影响软件的动态分析的准确性。
而在全数字仿真测试系统中,目标机指令集及其外围设备完全通过数字仿真的方式实现。如若采取适当的方法,则可以收集软件运行过程中的全部信息,用于软件动态分析。然而,全数字仿真过程涉及到复杂的动态二进制翻译技术,难以设计出一个即可以收集到用于软件动态分析的信息,又不影响仿真效率,并且可以用于多种目标机和宿主机的灵活架构。
发明内容
本发明的目的就在于为了解决上述问题而提供一种用于程序动态分析的二进制插桩方法,包括:
插桩过程在客户机指令集翻译成虚拟指令集过程中完成;
插桩粒度在基本块进行插桩;插桩指令的任务为获取基本块第一条指令的地址及当前基本块所包含的指令计数;基本块第一条指令的地址作为唯一标识,基本块所包含的全部指令计数度量基本块运行时间;
插桩收集的基本块执行序列通过对应目标码中的调试信息进行分析。
本发明的有益效果在于:
1.不需要对源代码进行插桩,不改变被测程序执行流程,不需要重新编译生成目标码,就可以收集程序运行轨迹,进行动态分析;
2.不需要获取被测程序的源代码,只需要被测程序的调试信息,有利于被测程序提供方版权控制;
3.不需要针对每一种客户机和宿主机体系架构单独设计插桩方法和数据分析方法,一次设计实现,可以应用于多种体系结构。
附图说明
图1是二进制插桩的示意图;
图2是二进制插桩点选择框图;
图3是收集动态运行信息分析框图。
具体实施方式
下面结合附图对本发明作进一步说明:
如附图1所示,本发明一种用于程序动态分析的二进制插桩方法,包括:
插桩过程在客户机指令集翻译成虚拟指令集过程中完成;
插桩粒度在基本块进行插桩;插桩指令的任务为获取基本块第一条指令的地址及当前基本块所包含的指令计数;基本块第一条指令的地址作为唯一标识,基本块所包含的全部指令计数度量基本块运行时间;
插桩收集的基本块执行序列通过对应目标码中的调试信息进行分析。
优选的,被仿真目标机指令集翻译成宿主机指令集时,经过两次翻译,包括:
目标机指令集翻译成虚拟指令集:生成用于指令翻译的虚拟指令并且生成收集程序动态信息的插桩指令;
虚拟指令集翻译成宿主机指令集执行:插桩指令翻译成宿主机指令,执行后完成程序动态信息的收集。
优选的所述插桩指令为函数调用指令,插桩过程包括:
分配第一变量、第二变量,将第一次翻译过程中获得的当前基本块的首地址存储于第一变量中,将第一次翻译过程中获得的当前基本块的指令计数存储于第二变量中,生成虚拟指令描述;虚拟指令描述包括以第一变量、第二变量、输出第一变量和第二变量的函数FA地址;
在第二次翻译过程中,当虚拟指令为Call时,产生宿主机指令,将参数压栈,并调用函数FA;
执行函数FA时,将当前基本块对应的第一变量与第二变量输出到持久存储介质中。
优选的,所述插桩收集的基本块执行序列通过对应目标码中的调试信息进行分析的具体过程包括:将包含基本块执行信息的序列连同目标码调试信息共同分析目标程序的动态运行信息,通过目标码及其调试信息首先反向解算出目标码包含的全部基本块;
通过收集到的基本块执行序列分析出函数、行列的是否执行以及执行时间。
优选的,设全部基本块为BlockALL,n为所有基本块的计数,每个基本块Bn对应的首地址第一变量及其在源代码中的文件名、函数名、行号、列号;BlockALL={B0,B1,B2…Bn-1};
假设基本块执行指令数为Count,那么该基本块的执行时间T=Count*constant,其中constant为常量因子。
采用动态二进制翻译的数字指令集仿真执行流程包括:首先判断是否存在当前PC对应的已完成翻译的宿主机指令;如存在,则执行该基本块包含的宿主机指令,执行完成后,根据需要或直接调用下一个基本块或返回基本块调度主循环;如不存在,则首先将当前PC对应的客户机指令逐条读出翻译成虚拟指令,直到遇到跳转指令或超出最大基本块指令计数,结束当前基本块的虚拟指令的翻译。将客户机指令到虚拟指令的翻译过程称为第一轮翻译。当前基本块的虚拟指令翻译完成后,在逐条产生虚拟指令对应的宿主机指令,形成可执行宿主机基本块代码,并缓存在cache中,接着基本块调度主循环调度该基本块运行。将虚拟指令到宿主机指令的翻译称为第二轮翻译。
本发明在第一轮翻译中完成收集动态运行信息的虚拟指令插桩。如附图1所示,进入基本块第一轮翻译,仿真程序首先进行插桩,输出基本块首地址、基本块指令计数。基本块首地址可以简单得到,但是,该基本块包含多少条指令还有待于后续遍历到跳转指令或最长基本块指令时,才可以确定。因此,此时仅能通过输出指令计数占位符;待整个基本块翻译结束后,通过指令更正基本块计数;随后,在第二轮翻译的过程中,将插桩内容翻译成宿主机指令并执行。选择在第一轮翻译中进行插桩,是因为通过该方法无需为每一个宿主机架构重新设计插桩内容,插桩内容由第二轮翻译自动产生相应宿主机指令。
在程序的基本块中进行一次插桩。所谓基本块,就是目标码中控制流只有1个入口、至多2个出口的指令序列。在动态二进制翻译的仿真执行平台中,1个基本块中的任意1条指令的执行就代表着整个基本块的执行。因此,要完整记录程序的运行轨迹,只需要记录基本块的执行轨迹。
插桩指令能够获取基本块唯一标识、基本块运行时间。采用基本块第1条指令的运行时存储地址作为唯一标识;采用基本块所包含的全部指令计数度量基本块运行时间。在基本块中,插桩指令放置于该基本块中第1条应用功能指令前,收集基本块唯一标识和基本块运行时间。
将包含基本块执行信息(首地址、指令计数)的序列连同目标码调试信息共同分析目标程序的动态运行信息。通过目标码及其调试信息首先反向解算出目标码包含的全部基本块BlockALL={B0,B1,B2…Bn-1},其中n为所有基本块的计数,每个基本块B对应的首地址PC及其在源代码中的文件名、函数名、行号、列号;同时,在指令集翻译执行的过程中,基本块的执行不会被中断干扰,即中断仅发生在基本块执行的间隙中;因此,假设某基本块执行指令数为Count,那么该基本块的执行时间T=Count*constant。其中constant为常量因子,在这里可以认为constant为1。因此,每个基本块的执行时间就为T=Count。这样,我们通过收集到的基本块执行序列就可以分析出函数、行列的是否执行以及执行时间。
在翻译后的基本块中,包含1个入口地址、2个出口地址。如附图2所示,从入口a进入基本块执行后,首先判断当前系统是否有其它因素,例如中断,需要停止基本块链的执行;如果需要停止基本块的执行,则到达出口c处,退出基本块执行,这种情况下,该基本块就完全没有执行,不需要通过插桩收集任何信息。如果从入口a进入基本块后,通过检查条件确定不需要中止直接块链执行,那么控制流执行应用功能指令序列后,从出口b退出,并直接链接执行后续基本块。因此,要达到记录基本块执行轨迹的效果,插桩点选择在判定是否需要退出基本块链后、应用功能指令前。当仿真执行翻译成宿主机指令的基本块时,插桩指令调用函数记录该基本块首地址及其指令计数并序列化以备对该信息进行分析。
插桩后收集到基本块唯一标识、基本块运行时间需要运用目标码调试信息来共同进行程序控制流图分析、函数运行时间分析、函数覆盖分析、语句覆盖分析、分支覆盖分析。
插桩指令为函数调用指令,其工作过程为首先分配2个临时变量PC、Count,将第1次翻译过程中获得的当前基本块的首地址和当前基本块的指令计数分别存储于这临时变量PC和Count中,生成以PC、Count、输出PC和Count的函数FA地址等为参数的Call虚拟指令描述。在第2次翻译的过程中,当遇见虚拟指令为Call时,则产生宿主机指令,将参数压栈,并调用函数FA,最终函数FA执行时,将该基本块对应的PC与Count输出到持久存储中供动态分析。
客户机程序数字仿真运行完成产生基本块轨迹后,分析基本块运行轨迹信息,如附图3所示,其分析过程是:首先,通过对被测程序的调试信息进行DWARF解码,并通过sub_program(子程序)与line_program(线程序)两种DIE(Debug Information Entry,调试信息条目)获取所有基本块的对应函数、文件、行号、列号;其次,该工具软件逐项读取基本块运行轨迹,计算函数、文件、行号、列号所对应代码的执行时间及其相互调用关系,能够满足测试所需的程序动态分析需要。
本发明具有以下特点:
插桩流程嵌入:数字仿真的动态二进制翻译过程通常采用直接块链算法,即基本块执行完成后不会退出控制流回到基本块运行调度模块,而是在基本块末端插入直接跳转转移到下一个基本块,这就导致不能将插桩设计在基本块运行调度模块,而只能将插桩放在基本块的指令流中。如果将插桩放在基本块运行调度模块,就会导致部分通过直接块链技术运行的基本块信息丢失。因此,本发明选择在基本块内部进行插桩。为了适应多种宿主机,本发明选择在客户机指令集翻译成虚拟指令集过程中,即在第一次翻译的过程中,选择在具体应用功能指令前设计信息收集函数完成插桩。
探针收集内容:采用数字仿真的插桩可以探测记录目标机体系结构全部信息,包括全部寄存器的值、全部存储器的值、程序栈和堆的值、程序执行流以及进入退出基本块时间等。本发明在每1个基本块进行一次插桩,仅收集基本块起始地址和指令计数,保证系统仿真速度,减少了系统压力。
动态执行信息分析过程:收集到的动态执行信息为包含基本块起始地址和指令计数的序列。为将该序列转换成函数覆盖信息、语句分支覆盖信息以及函数剖面信息,本发明使用生成目标码过程中产生的调试信息来配合基本块映射到文件、行号、列号及函数名等。现代编译器不仅将高级语言转换成机器码,同时在目标二进制文件中装入调试信息,方便程序调试和和软件优化。调试信息按DWARF格式保存在目标二进制文件的调试信息段。根据DWARF信息,调试器能获取地址和符号的对应关系、地址和编译单元的对应关系、能获取变量类型、变量存储位置等信息,大大的方便了调试器的设计和使用。本发明读取目标二进制可执行文件中的DWARF信息,获取其中全部函数及其地址范围、全部编译基本块及其地址范围等。通过调试信息项sub_program获取所有函数的地址范围,形成以(function,address)为关键字的函数集合;通过调试信息项line_program获取每一个编译单元,并通过所有函数过滤出可执行编译单元,形成以(file,line,column)为关键字的运行单元集合。这样,就可以通过分析函数集合和运行单元集合的命中性和可执行时间来完成软件动态分析。
本发明用于程序动态分析的二进制插桩方法,具有以下的优点:
1.不需要对源代码进行插桩,不改变被测程序执行流程,不需要重新编译生成目标码,就可以收集程序运行轨迹,进行动态分析;
2.不需要获取被测程序的源代码,只需要被测程序的调试信息,有利于被测程序提供方版权控制;
3.不需要针对每一种客户机和宿主机体系架构单独设计插桩方法和数据分析方法,一次设计实现,可以应用于多种体系结构。
本发明的技术方案不限于上述具体实施例的限制,凡是根据本发明的技术方案做出的技术变形,均落入本发明的保护范围之内。
Claims (5)
1.一种用于程序动态分析的二进制插桩方法,其特征在于,包括:
插桩过程在客户机指令集翻译成虚拟指令集过程中完成;
插桩粒度在基本块进行插桩;插桩指令的任务为获取基本块第一条指令的地址及当前基本块所包含的指令计数;基本块第一条指令的地址作为唯一标识,基本块所包含的全部指令计数度量基本块运行时间;
插桩收集的基本块执行序列通过对应目标码中的调试信息进行分析。
2.根据权利要求1所述一种用于程序动态分析的二进制插桩方法,其特征在于,被仿真客户机指令集翻译成宿主机指令集时,经过两次翻译,包括:
客户机指令集翻译成虚拟指令集:生成用于指令翻译的虚拟指令并且生成收集程序动态信息的插桩指令;
虚拟指令集翻译成宿主机指令集执行:插桩指令翻译成宿主机指令,执行后完成程序动态信息的收集。
3.根据权利要求1所述一种用于程序动态分析的二进制插桩方法,其特征在于,所述插桩指令为函数调用指令,插桩过程包括:
分配第一变量、第二变量,将第一次翻译过程中获得的当前基本块的首地址存储于第一变量中,将第一次翻译过程中获得的当前基本块的指令计数存储于第二变量中,生成虚拟指令描述;虚拟指令描述包括以第一变量、第二变量、输出第一变量和第二变量的函数FA地址;
在第二次翻译过程中,当虚拟指令为Call时,产生宿主机指令,将参数压栈,并调用函数FA;
执行函数FA时,将当前基本块对应的第一变量与第二变量输出到持久存储介质中。
4.根据权利要求1所述一种用于程序动态分析的二进制插桩方法,其特征在于,所述插桩收集的基本块执行序列通过对应目标码中的调试信息进行分析的具体过程包括:将包含基本块执行信息的序列连同目标码调试信息共同分析目标程序的动态运行信息,通过目标码及其调试信息首先反向解算出目标码包含的全部基本块;
通过收集到的基本块执行序列分析出函数、行列的是否执行以及执行时间。
5.根据权利要求4所述一种用于程序动态分析的二进制插桩方法,其特征在于,设全部基本块为BlockALL,n为所有基本块的计数,每个基本块Bn对应的首地址第一变量及其在源代码中的文件名、函数名、行号、列号;BlockALL={B0,B1,B2…Bn-1};
假设基本块执行指令数为Count,那么该基本块的执行时间T=Count*constant,其中constant为常量因子。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110667217.8A CN113535545A (zh) | 2021-06-16 | 2021-06-16 | 一种用于程序动态分析的二进制插桩方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110667217.8A CN113535545A (zh) | 2021-06-16 | 2021-06-16 | 一种用于程序动态分析的二进制插桩方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113535545A true CN113535545A (zh) | 2021-10-22 |
Family
ID=78124990
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110667217.8A Pending CN113535545A (zh) | 2021-06-16 | 2021-06-16 | 一种用于程序动态分析的二进制插桩方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113535545A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114860586A (zh) * | 2022-04-22 | 2022-08-05 | 中国人民解放军国防科技大学 | 一种基于动态插桩的二进制多执行体软件插桩方法 |
WO2023071611A1 (zh) * | 2021-10-26 | 2023-05-04 | 华为技术有限公司 | 一种不友好访存检测方法及相关设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101593125A (zh) * | 2009-07-02 | 2009-12-02 | 上海交通大学 | 使用监控线程对二进制翻译程序执行流程动态监控的方法 |
CN107239410A (zh) * | 2017-05-31 | 2017-10-10 | 上海交通大学 | 基于动态插桩的大块内存分配系统及方法 |
-
2021
- 2021-06-16 CN CN202110667217.8A patent/CN113535545A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101593125A (zh) * | 2009-07-02 | 2009-12-02 | 上海交通大学 | 使用监控线程对二进制翻译程序执行流程动态监控的方法 |
CN107239410A (zh) * | 2017-05-31 | 2017-10-10 | 上海交通大学 | 基于动态插桩的大块内存分配系统及方法 |
Non-Patent Citations (1)
Title |
---|
邹伟等: "基于 QEMU的动态二进制插桩技术", 《计算机研究与发展》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023071611A1 (zh) * | 2021-10-26 | 2023-05-04 | 华为技术有限公司 | 一种不友好访存检测方法及相关设备 |
CN114860586A (zh) * | 2022-04-22 | 2022-08-05 | 中国人民解放军国防科技大学 | 一种基于动态插桩的二进制多执行体软件插桩方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8266608B2 (en) | Post-compile instrumentation of object code for generating execution trace data | |
US9152531B2 (en) | Post-compile instrumentation of object code for generating execution trace data | |
US8024719B2 (en) | Bounded hash table sorting in a dynamic program profiling system | |
US5933640A (en) | Method for analyzing and presenting test execution flows of programs | |
US9274923B2 (en) | System and method for stack crawl testing and caching | |
US7725883B1 (en) | Program interpreter | |
US8468500B2 (en) | Program debugging method and program transformation method, program debugging device and program transformation device using the same, and storage medium | |
US20100115494A1 (en) | System for dynamic program profiling | |
US20020066081A1 (en) | Speculative caching scheme for fast emulation through statically predicted execution traces in a caching dynamic translator | |
JPH09330233A (ja) | 最適目的コード生成方法 | |
US9183114B2 (en) | Error detection on the stack | |
US7823140B2 (en) | Java bytecode translation method and Java interpreter performing the same | |
JP2004062858A (ja) | データ処理装置内のアプリケーション・コードのコンパイル | |
US8875111B2 (en) | Intermediate language representation and modification | |
Bebenita et al. | Trace-based compilation in execution environments without interpreters | |
Ismail et al. | Quantitative overhead analysis for python | |
US8056061B2 (en) | Data processing device and method using predesignated register | |
CN113535545A (zh) | 一种用于程序动态分析的二进制插桩方法 | |
CN111709031A (zh) | 一种覆盖率引导的VxWorks内核模糊测试方法 | |
US20100275185A1 (en) | System and Method for High Performance Coverage Analysis | |
CN111813672B (zh) | 一种针对多种处理器架构的非侵入式覆盖率统计方法 | |
CN112905474B (zh) | 一种基于硬件的高级程序动态控制流追踪方法和装置 | |
CN112380133B (zh) | 一种指令集模拟器利用功能库仿真的方法及装置 | |
US20100251213A1 (en) | Method for executing debug commands | |
Pauley et al. | Performant binary fuzzing without source code using static instrumentation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20211022 |