其他分享
首页 > 其他分享> > instrumentation (插桩)技术 && 动态二进制插桩(dynamic binary instrumentation ,DBI)

instrumentation (插桩)技术 && 动态二进制插桩(dynamic binary instrumentation ,DBI)

作者:互联网

1.1 概述

由于上周关于fuzzing的论文阅读中多次提到instrumentation技术,故搜索相关资料进行学习。

根据维基百科[1]与IBM的介绍[2],插桩是一种测试程序性能、检测错误、获取程序执行信息的技术。

根据百度百科[4],插桩技术最早由J.C. Huang提出[3]。在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(probe),即添加一些代码,获得程序的控制流和数据流信息。例如通过自动工具或手动,在函数执行前后插入读取计时器的代码,获取函数执行时间。

根据对象不同,可以分为源代码插桩和二进制插桩(也叫binary、目标程序插桩)。

根据粒度,可以分为函数级别插桩、基本块级别插桩、边界级别插桩(按照代码执行路径进行插桩)、指令级别插桩。

根据分析方法,可分为静态插桩和动态插桩[5]。静态插桩技术包括简单的手动插桩,基于编译器/汇编器的插桩,以及链接时或链接后的可执行文件编辑。动态插桩技术的实现往往比静态的更复杂,但可以跟踪动态链接的库和间接分支,而这些是静态插桩难以处理的。

常见的插桩位置包括:a.程序的第一条语句;b.分支语句的开始;c.循环语句的开始;d.下一个入口语句之前的语句;e.程序的结束语句;f.分支语句的结束;g.循环语句的结束。

常见插桩策略包括:语句覆盖探针(基本块探针):在基本块的入口和出口处,分别植入相应的探针,以确定程序执行时该基本块是否被覆盖;分支覆盖探针:c/c++语言中,分支由分支点确定。对于每个分支,在其开始处植入一个相应的探针,以确定程序执行时该分支是否被覆盖;条件覆盖探针:c/c++语言中,if, swich,while, do-while, for 几种语法结构都支持条件判定,在每个条件表达式的布尔表达式处植入探针,进行变量跟踪取值,以确定其被覆盖情况。

 

1.2 动态二进制插桩(dynamic binary instrumentation ,DBI)

对binary的插桩可分为两种情况:一种是对未运行的目标代码插桩,从头到尾插人测试代码,然后执行程序。这种方式适用于需要实现完整系统或仿真时进行的代码覆盖测试。另一种情况是向正在运行的程序插人测试代码,用来检测程序在特定时间的运行状态信息。向正在运行的程序插人测试代码,即动态二进制插桩(dynamic binary instrumentation ,DBI)技术,由于其易用性和灵活性使其在编程语言、软件测试和安全研究中得到了广泛的应用[6],当然也有一些弊端。

常见的DBI框架包括Pin,DynamoRIO和Frida,以及Valgrind, Triton (uses Pin), QDBI, BAP, Dyninst等。

大多数动态二进制插桩框架都有三种执行模式[7]:解释模式、探测模式(probe mode)和JIT模式。

JIT模式(just-in-time mode)是最常见的实现方式,也是最常用的模式。在JIT模式下,原始二进制文件或可执行文件实际上从未被修改或执行过。此时二进制文件被视为数据,修改后的二进制文件副本将在新的内存区域中生成(但只针对二进制文件的执行部分,而不是整个二进制文件),此时执行的就是这个修改后的文件副本。

解释模式(Interpretation mode),目标代码被视为数据,测试人员插入的测试代码作为目标代码指令的解释语言,每当执行一条目标代码指令,程序就会在测试代码中查找并执行相应的替代指令,测试通过替代指令的执行信息就可以获取程序的运行信息。

探测模式(probe mode),二进制文件实际上是通过使用新指令来覆盖旧的指令,来达到修改目的的,不过这会导致运行开销增大,但在某些体系结构(如x86)中,该方式却很好用。

 

参考文献:

[1] Instrumentation (computer programming)-Wiki

[2] Source code instrumentation overview-IBM

[3] Huang,  J. C . Program Instrumentation and Software Testing[J]. Computer, 1978, 11(4):25-32.

[4] 程序插桩-百度百科

[5] Kempf T , Karuri K , Gao L . Software Instrumentation[M]. John Wiley & Sons, Inc. 2008.

[6] D'Elia D C ,  Coppa E ,  Nicchi S , et al. SoK: Using Dynamic Binary Instrumentation for Security (And How You May Get Caught Red Handed)[C]// ACM Asia Conference on Computer and Communications Security (ASIA CCS) 2019. ACM, 2019.

[7] Dynamic Binary Instrumentation Primer-Blog

 

 

其他参考:

程序插桩简介-CSDN 

Linux中对【库函数】的调用进行跟踪的 3 种【插桩】技巧-CNBLOG

静态程序分析 wiki

trace-wiki

静态代码插桩-CSDN

“插桩”式技术-知乎

动态二进制插桩的原理和基本实现过程(一)-知乎

软件测试教程:目标代码插桩的三种执行模式-知乎

https://github.com/Techlord-RCE/DBI

 

https://www.intel.com/content/www/us/en/developer/articles/tool/pin-a-dynamic-binary-instrumentation-tool.html

https://dynamorio.org/

https://frida.re/

标签:DBI,instrumentation,二进制,程序,探针,语句,插桩
来源: https://www.cnblogs.com/lqerio/p/15937345.html