Pin
Intel 推出的跨平台程序插装工具
简明教程
Pin版本:3.2
参考:官方英文教程
插桩主要包括两个工作
- 在何处插入代码,插入什么样的代码
- 要在插入点执行什么代码
一些概念
- Pintools: Pin通过Pintools实现对目标程序的插桩分析,也是用户主要编写,用于完成自定义插桩工作的工具。
- Traces: 从一个分支开始,到一个无条件跳转分支结束(包括call和return),可以想到的是,traces会从一个分支的入口开始,但可能会有多个出口。
- BBL: Pin将Traces分割成basic block(BBL),指的是单一入口,单一出口的指令序列,与传统意义上的基本块概念不一致。
举个例子说明BBL与传统基本块的区别,请看下面的代码片段
switch(i)
{
case 4: total++;
case 3: total++;
case 2: total++;
case 1: total++;
case 0:
default: break;
}
显然,在传统的基本块中,我们会认为这里每一个case
都代表一个不同的基本块(case 0 不算)。但是回到PIN当中,这里的case
显然是有条件跳转,因此会把这整个代码片段认为是一个BBL
- Image Instruction: 映像级别插桩,使得Pintool在image第一次被加载时就能够监视和插桩整个程序
- routine: 是procedure,function和subroutine的同义词,所以简单理解为函数就好了。
插桩
Pin插桩有四种模式,
- Instruction Instrumentation,指令级插桩,使用API
INS_AddInstrumentFunction
- Trace Instrumentation,trace级插桩,使用API
TRACE_AddInstrumentFunction
- Routine Instrumentation, routine级插桩,即函数级插桩,使用API
RTN_AddInstrumentFunction
- Image Instrumentation,映像级别插桩,使用API
IMG_AddInstrumentFunction
,依赖于符号信息来确定routine边界,因此需要在调用PIN_Init
之前调用PIN_InitSymbols
后续内容
慢慢填坑
Q&A
1.使用INS_Address(ins) 打印出的地址怎么跟IDA分析的完全不一样
A:因为INS_Address(ins) 出来的是动态地址