首页 > 代码库 > PinTools学习笔记(1)——安装和入门

PinTools学习笔记(1)——安装和入门

介绍性文字就不说了,百度一下有很多,简单来说就是一个输入是可执行文件的动态插桩分析工具。

安装非常简单,不需要编译,直接从官网https://software.intel.com/en-us/articles/pintool-downloads下载、解压即可,PinTools自带很多例子,在source/tools/ManualExamples路径下,参考这些源码对学习PinTools非常有用。

以下内容主要参考官方用户手册以及我在实践中遇到的问题。

写插桩程序简单概括为两个问题:(1)在何处插入什么方法;(2)在插入点执行的方法(Analysis function)

PinTools的插桩粒度可以分为:image(我认为可以理解为输入文件),section(类似于基本块,但PinTools中定义的基本块与平常我们所说的基本块不太一样,不过目前这个不同没有影响到我写程序),routines(函数或方法,function),instruction(语句)

示例(以Linux为例)

到source/tools/ManualExamples目录下执行make可将文件夹内代码文件编译为.so文件,之后按照下述规则键入命令

pin [pin-option]... -t [toolname] [tool-options]... -- [application] [application-option]..

如果程序文件在别的目录下,只要将makefile中的PIN_ROOT设为pin所在路径即可。

以PinTools自带的数语句数目的instrument0.so为例

$ cd source/tools/ManualExamples
$ ../../../pin -t obj-ia32/inscount0.so -- /bin/ls

需要注意的是--后一定要空一格再跟[application],否则会报Missing target applicaton的错误

此外还可能遇到

The Operating System configuration prevents Pin from using the default (parent) injection mode.
To resolve this,either execute the following (as root): $
echo 0>/proc/sys/kernel/yama/ptrace_scope # 根据本机路径 Or use the "-injection child" option

我用的第二种

$ ../../../pin -injection child -t obj-ia32/inscount0.so -- /bin/ls

接下来可以根据自己的需要编写工具啦,边写边学,PinTools自己定义的函数、类型什么的特别多,可以多看看官方模块/类说明文档

PinTools编程有一定模式,大致可以分为三个部分Analysis routines, Instrument routines和Main

ManualExamples/malloctrace.cpp为例,Analysis routines是你想在插入点做什么,比如那个MallocAfter(ADDRINT ret)会被放在malloc函数返回后,作用是打印malloc函数的返回值;Instrument routines是对插桩函数的描述和固定,经常用到RTN_InsertCall、INS_InsertCall等等,参数是插入点、插入点前后、插入的函数、插入函数的参数列表,就像构造一个函数原型,你的Analysis routines是什么样子的,参数列表里填对应的数据类型和数据就可以;Main主程序,没仔细研究,感觉模式比较固定,就是一些初始化操作、调用插桩函数、启动工具的命令。

今天试着在ManualExamples/malloctrace.cpp的基础上写个监测malloc/free函数和内存访问操作的工具,可是程序陷入死循环了,目前没找到原因,明天打算开始好好看下PinTools在Linux下的调试技巧。

未完待续~

 

PinTools学习笔记(1)——安装和入门