目标代码插桩
目标代码插桩是指向目标代码(二进制代码)插人测试代码获取程序运行信息的测试方法,也称为动态程序分析方法。在进行目标代码插桩之前,测试人员要对目标代码逻辑结构进行分析,从而确认需要插桩的位置。
目标代码插桩对程序运行时的内存监控、指令跟踪、错误检测等有着重要意义。相比于逻辑覆盖法,目标代码插桩在测试过程中不需要代码重新编译或链接程序,并且目标代码的格式和具体的编程语言无关,主要和操作系统相关,因此目标代码插桩有着广泛的使用。
1. 目标代码插桩的原理
目标代码插桩法的原理是在程序运行平台和底层操作系统之间建立中间层,通过中间层检查执行程序、修改指令,开发人员、软件分析工程师等对运行的程序进行观察,判断程序是否被恶意攻击或者出现异常行为,从而提高程序的整体质量。
2. 目标代码插桩法的三种执行模式
由于目标代码是可执行的二进制程序,因此目标代码的插桩可分为两种情况:一种是对未运行的目标代码插桩,从头到尾插人测试代码,然后执行程序。这种方式适用于需要实现完整系统或仿真时进行的代码覆盖测试。另一种情况是向正在运行的程序插人测试代码,用来检测程序在特定时间的运行状态信息。
目标代码插桩具有以下3种执行模式。
(1)即时模式(sus-In-Tme):原始的二进制或可执行文件没有被修改或执行,将修改部分的二进制代码生成文件副本存储在新的内存区域中,在测试时仅执行修改部分的目标代码。
(2)解释模式(tepetation Mode):在解释模式中目标代码被视为数据,测试人员插入的测试代码作为目标代码指令的解释语言,每当执行一条目标代码指令,程序就会在测试代码中查找并执行相应的替代指令,测试通过替代指令的执行信息就可以获取程序的运行信息。
(3)探测模式(Probe Mode):探测模式使用新指令覆盖旧指令进行测试,这种模式在某些体系结构(如x86)中比较好用。
3. 目标代码插桩工具
由于目标程序是可执行的二进制文件,人工插人代码是无法实现的,因此目标代码插桩一般通过相应的插桩工具实现,插桩工具提供的API可以为用户提供访问指令。
常见的目标代码插桩工具主要有以下2种。
(1) Pin-Dynamic Binary Instrumentation Tools(简称Pin)
Pin是由Intel公司开发的免费框架,它可以用于二进制代码检测与源代码检测。Pin支持IA-32、x86-64、MIC体系,可以运行在Linux、Windows和Android平台。Pin具有基本块分析器、缓存模拟器、指令跟踪生成器等模块,使用该工具可以创建程序分析工具、监视程序运行的状态信息等。Pin非常稳定可靠,常用于大型程序测试,如fice办公软件、虚拟现实引擎等。
(2) DynamoRIO
DymamoRIO是一个许可的动态二进制代码检测框架,作为应用程序和操作系统的中间平台,它可以在程序执行时实现程序任何部分的代码转换。DyamoRfIO 支持1A-32、AMD64、Arb64体系,可以运行在Limuy Windowus 和Adoid平台。DyamRIO包含内存调试工具、内存跟踪工具、指令跟踪工具等。