背景说明
DynamoRIO是一种流行的动态二进制插桩平台,能够实时跟踪二进制程序的动态执行过程,在动态分析领域具有广泛的应用;允许开发者在程序运行时插入和修改代码,以实现性能监测、安全检查、自动测试等功能。
DynamoRIO提供了丰富的API接口,开发者可以利用这些接口实现对指令、基本块、线程、系统调用等监控,从而实现二进制分析插件的开发。
基本概念
-
动态二进制插桩(Dynamic Binary Instrumentation)
-
一种在程序运行时插入代码的方法,可以在不修改源代码的情况下对程序进行分析和优化;
-
DynamoRIO提供了一种框架,使开发者能够在程序的各个执行点(如函数、基本块)上插入自定义代码。
-
-
客户端(Client)
-
客户端是由用户编写的、与DynamoRIO一起运行的插件,负责定义插入的逻辑和位置;
-
每个客户端通常会实现一组回调函数,这些函数会在程序的不同执行阶段被调用。
-
-
基本块(Basic Block)
-
基本块是一段程序代码,它在没有分支或跳转的情况下连续执行;
-
在DynamoRIO中,基本块是插桩的基本单位,客户端可以再基本块的入口、出口或中间插入代码。
-
基本块示例
有以下伪汇编代码为例,展示程序如何分解为基本块。
; 基本块 1 MOV EAX, 1 ADD EAX, 2 CMP EAX, 5 JE block2 ; 如果 EAX 等于 5,跳转到基本块 2 ; 基本块 2 SUB EAX, 1 JMP block3 ; 基本块 3 MOV EBX, EAX ADD EBX, 4
-
基本块1:包含指令
MOV EAX,1
,ADD EAX,2
和CMP EAX,5
。如果EAX
等于5,程序会跳转到基本块2。 -
基本块2:包含指令
SUB EAX,1
。无条件跳转指令JMP block3
是基本块2的出口。 -
基本块3:包含指令
MOV EBX,EAX
和ADD EBX,4
。这个基本块没有跳转指令,因此它的出口是程序的自然结束点。
-
-
-
-
插桩(Instrumentation)
-
指的是在基本块或其他代码段中插入自定义代码,以实现监控或修改程序行为的目的。
-
-
回调函数
-
由DynamoRIO在特定事件发生时调用的函数;
-
常见的回调函数包括基本块生成、指令执行等。
-
基本组成
此插桩平台主要包含以下内容:
-
DynamoRIO:负责解释并执行目标程序;提供丰富的跨平台API接口;
-
Client:通过API自定义分析操作来拓展DynamoRIO;
-
DynamoRIO Extensions:主要指drmgr、drsyms、drwrap等官方提供的接口。