CN112882701A - 一种支持多架构的可执行文件静态插桩技术框架 - Google Patents
一种支持多架构的可执行文件静态插桩技术框架 Download PDFInfo
- Publication number
- CN112882701A CN112882701A CN202110280351.2A CN202110280351A CN112882701A CN 112882701 A CN112882701 A CN 112882701A CN 202110280351 A CN202110280351 A CN 202110280351A CN 112882701 A CN112882701 A CN 112882701A
- Authority
- CN
- China
- Prior art keywords
- instruction
- instrumentation
- architecture
- executable file
- code
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种支持多架构的可执行文件静态插桩技术框架,涉及计算机网络安全领域。由顶层模块(指令原语组合模块)、底层模块(指令原语翻译模块)与命令行工具组成。顶层模块使用各种指令原语构建完整的静态插桩代码,并将其写入可执行文件新增的代码节中;底层模块负责对接架构指令集,在所有支持的架构下找到合适的指令序列实现各条顶层部分所需的指令原语;命令行工具负责接收插桩请求信息,并传递给顶层部分。本发明具有良好的扩展灵活性,能够稳定可靠地实现对当前五种主流架构下的可执行文件的静态插桩,且与已有的同类技术框架相比在空间开销与时间开销上的性能表现更佳。
Description
技术领域
本发明涉及计算机网络安全领域,尤其涉及一种支持多架构的可执行文件静态插桩技术框架。
背景技术
可执行文件重写技术指的是在没有源代码的前提下,对已编译甚至可能已经过链接的可执行文件进行修改使得所修改的可执行文件在程序逻辑被修改的情况下仍可正常运行。绝大多数软件,尤其是商业软件,均以编译型语言开发完成。企业为了保护自己的核心技术,分发给用户的往往是编译完成的可执行文件,用户只能以可执行文件的形式运行软件。因此在源代码无法获取的情况下,当使用者需要对程序行为进行某些修改时,可执行文件重写技术则具有极为重要的意义。而起初研究该技术的动机仅仅是在程序运行过程中更改程序的某些部分,修复bug,保证其可持续正常运行。随着可执行文件重写技术的不断发展,它的应用领域不断拓宽,能够在程序加固、漏洞修补与检测和程序优化与监控等场景中发挥重要作用。
因此,本领域的技术人员致力于开发一种支持多架构的可执行文件静态插桩技术框架,提升插桩程序的空间开销和运行性能。
发明内容
有鉴于现有技术的上述缺陷,本发明所要解决的技术问题是对静态插桩中涉及到的各种指令行为进行架构无关的标准化,抽象为各种标准底层指令行为,即“指令原语”,再将指令原语在各个架构下映射为相应的一条或多条指令组成的指令序列,从而实现优化性能的、支持多架构的静态插桩工具。
为实现上述目的,本发明提供了一种支持多架构的可执行文件静态插桩技术框架,包括顶层模块(指令原语组合模块)、底层模块(指令原语翻译模块)与命令行工具;
所述顶层模块使用各种指令原语构建完整的静态插桩代码,并将其写入可执行文件新增的代码节中;
所述底层模块负责对接架构指令集,在所有支持的架构下找到合适的指令序列实现所述顶层模块的指令原语;
所述命令行工具负责接收插桩请求信息,并传递给所述顶层模块。
进一步地,所述指令原语是完成架构共有的特定行为的机器指令序列。
进一步地,所述特定行为包括分配栈空间、释放栈空间。
进一步地,所述顶层模块包括预备代码块、模式代码块和插桩代码块。
进一步地,所述预备代码块的功能实现由指令原语完成。
进一步地,所述模式代码块的功能实现由指令原语完成。
进一步地,所述插桩代码块的功能实现由指令原语完成。
进一步地,所述插桩请求信息包括插桩代码、插桩位置。
进一步地,所述命令行工具用C++语言编写。
进一步地,所述可执行文件是X86架构、X86-64架构、MIPS架构、ARM架构或AArch64架构下的ELF文件。
在本发明的较佳实施方式中,本发明提供了一种支持多架构的可执行文件静态插桩技术框架,由顶层模块(指令原语组合模块)、底层模块(指令原语翻译模块)与命令行工具组成。
本发明在已有的可执行文件重写技术研究基础上设计并实现了一个高效而通用的静态插桩框架,且支持包括X86、X86-64等CISC架构和ARM、AArch64和MIPS等RISC架构的多种主流架构。该框架对静态插桩中涉及到的各种指令行为进行架构无关的标准化,抽象为各种标准底层指令行为,即“指令原语”。本发明将静态插桩的各个步骤分解为多条指令原语,再将指令原语在各个架构下映射为相应的一条或多条指令组成的指令序列,从而实现支持多架构的静态插桩工具。为了追求高性能,在实现指令原语时该框架尽可能地选择更快速的指令并避免多余的指令,遵循最小化原则。
依托于指令原语,本发明提出将顶层与底层模块分离的静态插桩框架设计思路。顶层实现与架构无关,只负责调用指令原语以完成修改原程序指令和新增插桩指令等工作。底层实现无须考虑静态插桩如何进行,只需完成各种指令原语的架构具体实现和一些架构相关的工具函数接口实现即可。
支持多架构的可执行文件静态插桩技术,包括:
1)顶层模块(指令原语组合模块):使用各种指令原语构建完整的静态插桩代码,并将其写入可执行文件新增的代码节中;
2)底层模块(指令原语翻译模块):对接架构指令集,在所有支持的架构下找到合适的指令序列实现各条顶层部分所需的指令原语;
3)命令行工具:接收插桩代码、插桩位置等必要插桩请求信息,并传递给顶层部分。
本发明引入了“指令原语”这一概念,实现了顶层的静态插桩过程设计与底层不同架构下指令序列设计的分离。
本发明具有良好的扩展灵活性,只需在底层部分添加各条指令原语的具体实现即可完成对新架构的支持。
本发明在保证添加新架构支持的灵活性的前提下,实现了对全部五种主流架构的支持,是公开研究中唯一支持如此多种架构的静态插桩技术框架。
本发明通过创新性的指令级代码复用大幅节省了静态插桩产生的额外空间开销,提升了插桩程序的运行性能。
本发明与现有技术相比较,具有如下显而易见的实质性特点和显著优点:
本发明的支持多架构的静态插桩技术框架,引入了“指令原语”这一概念,实现了顶层的静态插桩过程设计与底层不同架构下指令序列设计的分离。基于这样的设计,本框架具有良好的扩展灵活性,只需在底层部分添加各条指令原语的具体实现即可完成对新架构的支持。此外,在顶层部分的设计中,本文通过创新性的指令级代码复用大幅节省了静态插桩产生的额外空间开销,提升了插桩程序的运行性能。本框架能够稳定可靠地实现对当前五种主流架构下的可执行文件的静态插桩,且与已有的同类技术框架相比在空间开销与时间开销上的性能表现更佳。
以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以充分地了解本发明的目的、特征和效果。
附图说明
图1是本发明的一个较佳实施例的多架构静态插桩框架架构示意图;
图2是本发明的一个较佳实施例的顶层模块(指令原语组合模块)示意图。
具体实施方式
以下参考说明书附图介绍本发明的多个优选实施例,使其技术内容更加清楚和便于理解。本发明可以通过许多不同形式的实施例来得以体现,本发明的保护范围并非仅限于文中提到的实施例。
在附图中,结构相同的部件以相同数字标号表示,各处结构或功能相似的组件以相似数字标号表示。附图所示的每一组件的尺寸和厚度是任意示出的,本发明并没有限定每个组件的尺寸和厚度。为了使图示更清晰,附图中有些地方适当夸大了部件的厚度。
本发明的一个较佳实施例,由顶层模块(指令原语组合模块)、底层模块(指令原语翻译模块)与命令行工具组成。
如图1所示,本发明的一个较佳实施例包括:
1)顶层模块(指令原语组合模块):使用各种指令原语构建完整的静态插桩代码,并将其写入可执行文件新增的代码节中;
2)底层模块(指令原语翻译模块):对接架构指令集,在所有支持的架构下找到合适的指令序列实现各条顶层部分所需的指令原语;
3)命令行工具:接收插桩代码、插桩位置等必要插桩请求信息,并传递给顶层部分。
所述的指令原语是指完成各架构共有的特定行为(如分配栈空间、释放栈空间)的机器指令序列,它是该技术实现顶层与底层设计解耦的关键。这样一来底层部分完全无需知道静态插桩过程如何实现,只要关注各种指令原语在不同架构下如何实现就能够保证该框架的正常插桩。而若需要给该框架添加一种新的架构支持,则不需要对顶层部分进行任何修改,只需在底层添加一套该架构下的各类指令原语的机器指令序列实现即可。至于顶层部分,则是架构透明的,它不用知晓每次插桩的对象是运行在何种架构上的文件,也不必了解各种指令原语具体如何实现。顶层部分只需要关注如何使用各种指令原语构建完整的静态插桩代码,并将其写入可执行文件新增的代码节中。出于让该框架易于使用的考虑,其中还提供一个简单易用的命令行工具,将需要插桩的文件路径、插桩位置和插桩代码以参数的形式提供给此命令行工具,运行之即可自动生成插桩后的可执行文件。
如图2所示,多架构静态插桩框架的顶层模块(指令原语组合模块)具体结构叙述如下:顶层模块由预备代码块、模式代码块和插桩代码块三部分组成。这三类代码块的功能实现均由指令原语完成,完全不依赖任何一种CPU架构的独有特性,保证了顶层部分的架构透明性。
在顶层部分生成静态插桩代码的过程中,对于每一个修改点都会相应地生成一个预备代码块。而原程序中修改点处的指令会被覆盖为一条新的直接跳转指令,跳转到其对应的预备代码块。预备代码块全部执行完之后则会通过一条直接跳转指令跳转回原程序修改点之后的下一条指令,让原程序继续运行。并且被覆盖的原程序指令不能丢弃,必须保证其仍然能够执行,故需要将其迁移至预备代码块的结尾,在跳转回原程序前让这些原程序中的指令执行。如此一来即可保证在实现可执行文件重写的同时,对原程序的代码改动最小化,不改变其代码基本块在内存空间中的分布。预备代码块作为唯一一类与所有修改点一一对应的代码块,主要负责处理各个修改点之间存在差异、不具备共通性的一些工作,如存放每个修改点各自最终需要执行的插桩代码块地址、执行迁移后的原程序指令等,并为执行模式代码块做准备。
模式代码块是所有修改点共用的代码部分,在整个可执行文件静态插桩的过程中通常只有一个模式代码块(ARM架构较为特殊,存在两个模式基本块)。换言之,所有预备代码块都会跳转到同一个模式代码块中。模式代码块的主要工作就是保存与恢复上下文,即插桩代码中会用到的所有寄存器在运行到修改点时的值。该行为对于所有修改点而言指令都是一样的,皆为寄存器的入栈与出栈,所以可以共用同一个模式代码块。此外模式代码块还会在保存上下文之后,将上下文在栈中的起始地址存在一个特定的寄存器中,供插桩代码使用。这使得插桩代码可以获取到修改点处的程序运行时状态,从而满足更加多样化的插桩功能需求。
插桩代码块则是通过静态插桩实现使用者所需的额外功能的核心所在,由使用者自定义的插桩代码就存放于其中。而插桩代码块的数量是不确定的,视使用者在每个修改点需要运行的插桩代码种类而定。比如,若在每个修改点需要执行的插桩代码各不相同,则插桩代码块的数量就等于修改点的数量;若在所有修改点执行的插桩代码都是一样的,如基本块计数(只需对全局变量的计数器加一),则插桩代码块的数量就为一。至于插桩代码块的内容,本框架完全不设任何限制,全部由使用者决定,并且提供一个寄存器指向代表程序在修改点处运行时状态的上下文结构体,以提供尽可能大的使用自由度。本框架唯一会对插桩代码块进行的修改之处,就是会在其末尾添加一条直接跳转指令,用于在插桩代码执行完毕后让执行权回到模式代码块中。
本发明设计的多架构可执行文件静态插桩框架最终呈现出来的是Linux平台上使用C++语言编写的一个命令行工具。本框架用到了Capstone框架来进行反汇编工作。而本框架的使用是具有较强可配置性和灵活性的。本框架的输入包括待插桩的可执行文件和以json格式传递的插桩请求信息。其中可执行文件可以是X86架构、X86-64架构、MIPS架构、ARM架构或者AArch64架构下的ELF文件,覆盖了目前的各种主流CPU架构。插桩请求信息则包括多段汇编形式的插桩代码、是否需要保存上下文、所有修改点的位置和该修改点所使用的插桩代码序号,表示这里应该插入哪一段插桩代码。本框架运行完成时会在使用者指定的输出路径生成一个经过静态插桩的新可执行文件。当需要对程序中所有基本块进行插桩时(如模糊测试场景),可以先通过某个程序分析工具(如IDAPro)获取其所有基本块的起始地址,再自动生成包含所有这些地址的json格式插桩请求信息传递给本框架进行插桩。
本发明的支持多架构的可执行文件静态插桩技术框架,通过创新性地提出指令原语的概念,在保证添加新架构支持的灵活性的前提下实现了对五种主流架构的支持,是公开研究中唯一支持如此多种架构的静态插桩技术框架。本框架通过指令原语将顶层与底层解耦,顶层逻辑直接调用各指令原语完成插桩,无需关注底层架构指令;底层则专注于每条指令原语在不同架构下如何实现,无需关注静态插桩过程。因而本框架能够便捷地实现对多架构的支持,且只要通过汇编指令实现为数不多的各条指令原语即可快速添加新架构支持,为静态插桩技术的未来研究工作提供了一定参考价值。此外,本发明提出的静态插桩技术框架通过对顶层部分的创新性设计,实现了极为显著的空间开销节省。在本框架的顶层设计中,通过构建预备代码块、模式代码块和插桩代码块这三级代码块,对静态插桩过程中所需的上下文保存与恢复以及常见场景中多个修改点的相同插桩代码实现了最大程度的代码复用。随着修改点数量的增加,只有占用空间极小的预备代码块的数量会随之线性增加,以此达到大幅降低额外空间开销的目的。在完成这一目标的同时,本发明未对程序运行时间带来明显额外开销,是对已有静态插桩技术路线的一种较好的优化方案。
以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术无需创造性劳动就可以根据本发明的构思作出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。
Claims (10)
1.一种支持多架构的可执行文件静态插桩技术框架,其特征在于,包括顶层模块(指令原语组合模块)、底层模块(指令原语翻译模块)与命令行工具;
所述顶层模块使用各种指令原语构建完整的静态插桩代码,并将其写入可执行文件新增的代码节中;
所述底层模块负责对接架构指令集,在所有支持的架构下找到合适的指令序列实现所述顶层模块的指令原语;
所述命令行工具负责接收插桩请求信息,并传递给所述顶层模块。
2.如权利要求1所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述指令原语是完成架构共有的特定行为的机器指令序列。
3.如权利要求2所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述特定行为包括分配栈空间、释放栈空间。
4.如权利要求1所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述顶层模块包括预备代码块、模式代码块和插桩代码块。
5.如权利要求4所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述预备代码块的功能实现由指令原语完成。
6.如权利要求4所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述模式代码块的功能实现由指令原语完成。
7.如权利要求4所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述插桩代码块的功能实现由指令原语完成。
8.如权利要求1所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述插桩请求信息包括插桩代码、插桩位置。
9.如权利要求1所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述命令行工具用C++语言编写。
10.如权利要求1所述的支持多架构的可执行文件静态插桩技术框架,其特征在于,所述可执行文件是X86架构、X86-64架构、MIPS架构、ARM架构或AArch64架构下的ELF文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110280351.2A CN112882701A (zh) | 2021-03-16 | 2021-03-16 | 一种支持多架构的可执行文件静态插桩技术框架 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110280351.2A CN112882701A (zh) | 2021-03-16 | 2021-03-16 | 一种支持多架构的可执行文件静态插桩技术框架 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112882701A true CN112882701A (zh) | 2021-06-01 |
Family
ID=76040940
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110280351.2A Pending CN112882701A (zh) | 2021-03-16 | 2021-03-16 | 一种支持多架构的可执行文件静态插桩技术框架 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112882701A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115017058A (zh) * | 2022-08-04 | 2022-09-06 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
-
2021
- 2021-03-16 CN CN202110280351.2A patent/CN112882701A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115017058A (zh) * | 2022-08-04 | 2022-09-06 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6948164B2 (en) | Method and system for modifying executable code to add additional functionality | |
CN109697060B (zh) | 视频特效系统及其生成方法、装置、设备和存储介质 | |
US6795963B1 (en) | Method and system for optimizing systems with enhanced debugging information | |
JP4050764B2 (ja) | コンパイルシステム | |
US5170465A (en) | Incremental-scanning compiler for source-code development system | |
US5325531A (en) | Compiler using clean lines table with entries indicating unchanged text lines for incrementally compiling only changed source text lines | |
AU658413B2 (en) | System and method for transforming procedure calls in a cross-debugging environment | |
US5313387A (en) | Re-execution of edit-compile-run cycles for changed lines of source code, with storage of associated data in buffers | |
US5201050A (en) | Line-skip compiler for source-code development system | |
US20080127113A1 (en) | Method and system for implementing watchpoints | |
US20050204344A1 (en) | Program analysis device, analysis method and program of same | |
JP2001508909A (ja) | バーチャルマシン命令を処理するためのデータ処理装置 | |
JPH09325901A (ja) | デバッギングを実施する方法 | |
JPH11242597A (ja) | Javaバイトコードデータのフローグラフの生成方法 | |
US20050071856A1 (en) | Dynamically loadable stub modules | |
US7240334B1 (en) | Methods, systems, and computer program products for deferred computer program tracing | |
US7197600B2 (en) | Transferring data along with code for program overlays | |
CN112817597A (zh) | 运行在用户空间的基于ebpf的软件容器实现方法 | |
US5301327A (en) | Virtual memory management for source-code development system | |
CN112882701A (zh) | 一种支持多架构的可执行文件静态插桩技术框架 | |
CN113220326B (zh) | 智能合约升级方法及区块链系统 | |
EP0406028A2 (en) | Incremental compiler for source code development system | |
JP2919302B2 (ja) | Cpuシミュレーション方法 | |
US8438549B1 (en) | Data processing with microcode designed with source coding | |
US20030070117A1 (en) | Simulation apparatus and simulation method |
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 |