Pin 3.11 用户指南
介绍
Pin 是一种程序检测工具。它支持Linux*、macOS*、和Windows操作系统以及 IA-32、Intel(R)64和Intel(R)等许多集成核心架构上的可执行程序。
Pin 允许工具在可执行文件中的任意位置插入任意代码(用C或者C++编写)。这些代码在可执行文件运行时动态的添加。这也可以把Pin附加到正在运行的程序上。
Pin 提供了丰富的API,这些API抽象了底层指令集特性,并允许将诸如寄存器内容之类的上下文信息作为参数传递给注入的代码。Pin 会自动的保存并恢复被注入代码覆盖的寄存器,因此应用程序可以继续工作。也可以访问符号和调试信息。
教程部分
- 如何使用Pin插桩
- 例子
- 回调
- 修改应用程序说明
- Pin高级调试扩展
- 应用中使用Pintool
- 。。。
参考部分
- Pin API参考
- Pin 命令行选项
- 插桩库
如何使用Pin插桩
目录
- Pin
- Pintools
- 观察结果
- 插桩粒度
- 托管平台支持
- 符号
Pin
最好的考量Pin 的方式是把它当作一个“及时”(JIT)编译器。这个编译器的输入不是字节码,而是一个常规的可执行文件。Pin 拦截可执行程序的第一条指令 并 为这个指令接下来的代码序列产生(编译)一个新的代码。然后 Pin把进程控制权转移到新生成的代码中。新生成的代码序列和原代码顺序几乎一模一样,但是 Pin确保在这个分支退出时重新获得控制权。在重获控制权后,Pin为目标分支产生更多的代码并让它们继续执行。将所有的生成代码存储在内存中使Pin十分高效,同时,这些生成代码还能被重用并且程序可以从一个分支直接跳到另外一个分支。
在JIT模式下,曾经执行过的唯一代码是生成代码,原始代码仅仅用来生成这些代码。在生成代码时,用户可以注入自己的的代码(插桩)。
Pin插入实际执行的指令,不管他们驻留在那个部分都没有关系。尽管在条件分支处有一些例外,但是如果一体指令从不执行,它通常不会被插桩。
Pintools
从概念上来讲,插桩包括两部分:
- 一个决定在何处插入什么代码的机制
- 在插入点执行的代码
这两个组件分别是插桩和检测代码。这两个组件共存与一个可执行文件Pintools中。Pintools可以视为可以修改Pin内部代码生成过程的插件。
Pintool 在Pin中注册插桩回调函数(Instrumentation callback routines),这些函数会在需要生成新代码的地方调用。这些插桩回调函数表示的是插桩的组件。它检查将要生成的代码,调查其静态属性,并确定是否以及在何处注入对分析函数(analysis functions)的调用。
分析函数后记有关应用程序的数据。Pin确保整型和浮点型寄存器状态在必要时得以保存和恢复,并允许将参数传递给函数。
Pintool 还可以为诸如线程创建或forking之类的时间注册通知回调函数。这些回调通常用于收集数据或工具初始化或清理。