具体请见用户手册Pin 3.2 User Guide https://software.intel.com/sites/landingpage/pintool/docs/81205/Pin/html/index.html
一、在windows下安装过程:
1、安装Cygwin
Cygwin安装的时候,默认不安装make工具。可以只选择make的那个安装包,测试发现只安装这个包是没有问题的。也可以使All后面的字变为install,安装所有组件(当然需要的时间也稍长一些)。
2、下载pin,解压
3、把cygwin64\bin 和 pin.exe所在的目录 添加到环境变量
4、编译pin提供的例子:
启动cmd,执行vcvars64.bat,进入pin下的source\tools\ManualExamples目录,make all TARGET=intel64,编译64位dll。
启动cmd,执行vsvars32.bat,进入pin下的source\tools\ManualExamples目录,make all TARGET=ia32,编译32位dll。
二、三种级别的跟踪
INS_AddInstrumentFunction指令级跟踪INS_InsertCall
TRACE_AddInstrumentFunction 基本快跟踪,可以用来跟踪BBL BBL_InsertCall
IMG_AddInstrumentFunction IMG_AddUnloadFunction 映像跟踪
三、一些函数
RTN_AddInstrumentFunction 函数跟踪 RTN_InsertCall
PIN_AddThreadStartFunction 线程开始
PIN_AddThreadFiniFunction 线程结束
PIN_SafeCopy用于将指定数量的字节从源存储器区域复制到目标存储器区域。 即使源或目标区域无法访问(完全或部分),此功能也可确保安全返回到调用者。
PIN_AddFollowChildProcessFunction() 注册回调函数,回调函数在子进程开始执行前执行 Windows/Linux
PIN_AddForkFunction() 注册回调函数,跟踪父进程或子进程 Linux
四、其他
1、字符串
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "string_family","o", "default_string", "description");
"o"表示命令行参数
pin -t obj-intel64/inscount0.so -o inscount0.log -- /bin/ls
表示把inscount0.log参数传递给KnobOutputFile
2、
IPOINT_BEFORE 指令之前,或者函数开始的地方
IPOINT_AFTER 指令之后,或者函数ret的地方
3、实验中发现,在Windows上,如果在一个多线程应用程序中使用的pin工具,在回调函数中打开文件可能发生死锁,有些函数在回调中使用可能造成程序莫名崩溃。
4、Pin有两种模式,一种是JIT(Just In Time),个人理解为实时编译;另一种是Probe,个人理解为Hook。Probe更快,但是可以使用的Pin相关功能更少。
5、修改程序执行流程INS_InsertDirectJump INS_InsertIndirectJump INS_Delete
6、调试
pin -pause_tool 20 … 开始的时候暂停20秒,这时可以attach