参考:http://software.intel.com/sites/landingpage/pintool/docs/62732/Pin/html/

http://blog.nruns.com/blog/2013/10/07/TracingExecutionWithPin-Carlos/

Pin is a tool for the instrumentation of programs. It supports the Android*, Linux*, OSX* and Windows* operating systems and executables for the IA-32, Intel(R) 64 and Intel(R) Many Integrated Core architectures.

Pin allows a tool to insert arbitrary code (written in C or C++) in arbitrary places in the executable. The code is added dynamically while the executable is running. This also makes it possible to attach Pin to an already running process.

Pin provides a rich API that abstracts away the underlying instruction set idiosyncracies and allows context information such as register contents to be passed to the injected code as parameters. Pin automatically saves and restores the registers that are overwritten by the injected code so the application continues to work. Limited access to symbol and debug information is available as well.

有点类似于Detours的意义,动态插桩。但是Detours的粒度是函数级别,而Pin的粒度是指令级别。

这也很好理解,Detours是Microsoft开发的,而Pin是Intel开发的。

1. 怎样在Windows下编译samples of Pintools

可以到http://software.intel.com/en-us/articles/pintool-downloads下载不同的Pin版本。

但是在Windows平台下,自版本56759以后,nmake被改成了make,但是内部仍然调用的cl.exe等工具进行生成,make问题不成功,没办法,只好退回49306版本。

cd .\source\tools\SimpleExamples

..\nmake TARGET=ia32 tools

然后,将

.\ia32\bin

.\source\tools\SimpleExamples\obj-ia32

目录下的可执行文件拷贝到目标机器上,即可以按照documentation指示的方法来执行pintools了。

2. 怎样编写自己的pintools

首先需要了解一下回调函数:

Pin提供不同粒度的回调函数,大体上可以分为下面层次:

IMG: Image Object

INS: Instruction Object

SEC: Section Object

RTN: Routine Object

REG: Register Object

TRACE: Single entrance, multiple exit sequence of instructions

BBL: Single entrance, single exit sequence of instructions

SYM: Symbol Object

我们首先编写一下IMG粒度的回调,用来捕获加载image的事件。

在\source\tools下面新建一个目录daniel

结构如下:

-- daniel

| 

 -- daniel.cpp

| 

 -- Nmakefile

|

 -- make.bat

1. daniel.cpp

#include "pin.H"

#include "portability.H"

#include <iostream>

#include <fstream>

 

using namespace std;

static std::ofstream* out = 0;

 

static INT32 Usage()

{

    cerr << "Daniel King's test module\n" << endl;

    return -1;

}

 

 

VOID ImageLoad(IMG img, void* v)

{

    *out << "loading image " << IMG_Name(img) << endl;

}

 

 

 

VOID Fini(int n, void *v)

{    

    *out << "## eof\n";

    out->close();

}

 

int main(int argc, char *argv[])

{

    

    if( PIN_Init(argc,argv) )

    {

        return Usage();

    }

    

        

    string filename =  "daniel.out";

    out = new std::ofstream(filename.c_str());

 

    IMG_AddInstrumentFunction(ImageLoad, 0);

    PIN_AddFiniFunction(Fini, 0);

 

    PIN_StartProgram();

    

    return 0;

}

2. Nmakefile

######################################################################################

# This is the NMAKE file for building and testing PIN toos contained in one of the

# subdirectories of the PinTool project or PIN kit. 

#

# For description of targets and options, see Nmakefile in the root directory.  

######################################################################################

 

!if "$(PIN_HOME)"==""

PIN_HOME=..

!endif

 

# Define tools to be buit and tested

######################################################################################

COMMON_TOOLS= daniel.dll

 

# Include building and testing rules from the root Nmakefile. 

######################################################################################

INCLUDE_SUB_RULES=1

!INCLUDE $(PIN_HOME)\Nmakefile 

3. make.bat

..\nmake target=ia32 tools

以后每次添加新的module时,在Nmakefile中添加生成目标,然后执行make.bat就会在obj-ia32目录下生成目标文件。

测试时,将.\ia32\bin下的pin执行文件,以及刚刚生成的module文件一同拷贝到目标文件夹,编写run.bat:

pin.exe -t %1 -- %2

3. MyPinTool模板

MyPinTool是一个Windows下项目的模板,通过该模板,可以方便地创建自己的项目,并且支持调试。

4. PinTool调试

参照第三步的模板建立的工程文件中,都会设置调试程序。

具体如下:

 

Command: .\ia32\bin\pin.exe

Command Arguments: -t $(TargetPath) -- target.exe

Working Directory: $(TargetDir)

在按下F5后,会弹出如下的提示窗口:

在Visual Studio IDE中选择Debug->Attach to process菜单,按提示的pid选择目标程序,附加到调试器;再到终端窗口下按下Enter键,就可以开启调试了。

5. Pintool线程与Application线程

Pintool线程是各种Callback执行的线程,而Application线程是执行应用程序本身的指令,以及通过InsertXXX插入的Instrument指令的线程。

那么在Callback中的统计,与InsertXXX生成的Instrument函数中的统计有什么区别?

Callback针对同一位置的代码块只统计一次,而InsertXXX是调用了多少次,就统计多少次。

那么Callback是否能够统计完全整个应用程序中的所有代码块吗?估计不能,只是根据执行情况,动态地统计。

// Pin calls this function every time a new instruction is encountered

VOID Instruction(INS ins, VOID *v)

{

    RTN rtn = INS_Rtn(ins);

    if (!RTN_Valid(rtn))

    {

        ++insNoRtnDiscoveredCount;

        INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsNoRtnCount, IARG_END);

    }

    else if (RTN_IsDynamic(rtn))

    {

        ++insDynamicDiscoveredCount;

        INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsDynamicCount, IARG_END);

    }

    else

    {

        ++insNativeDiscoveredCount;

        INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsNativeCount, IARG_END);

    }

}

6. 粒度的理解

Trace instrumentation lets the Pintool inspect and instrument an executable one trace at a time. Traces usually begin at the target of a taken branch and end with an unconditional branch, including calls and returns. Pin guarantees that a trace is only entered at the top, but it may contain multiple exits. If a branch joins the middle of a trace, Pin constructs a new trace that begins with the branch target. Pin breaks the trace into basic blocks, BBLs. A BBL is a single entrance, single exit sequence of instructions. Branches to the middle of a bbl begin a new trace and hence a new BBL. It is often possible to insert a single analysis call for a BBL, instead of one analysis call for every instruction. Reducing the number of analysis calls makes instrumentation more efficient. Trace instrumentation utilizes the TRACE_AddInstrumentFunction API call.

trace是一个比函数小一级的代码块粒度。

trace有如下特征:

6.1 起始

trace由一个branch的目标代码处起始

6.2 结束

遇到非条件的jmp指令,call指令,以及ret指令结束。

因此trace可以包含jcc指令,代表着一个trace可以有多个出口,即trace中的代码可能会有多条执行路径,即手册中所说的“一个入口,多个出口”。

trace会在实际执行中不断地划分,如果trace中包含了子trace,即有其他代码跳转到trace中的某个位置,这时需要细分trace.

BBL是比trace再小一个级别的代码块,它符合“一个入口,一个出口”的特点。

因此,我们可以在实际使用中,将BBL作为代码块的最小单位,以减少插桩的次数。

在静态分析代码方面

代码段虽然在PE文件中有定义明确的范围,但是在这个范围内,仍然是一坨,可以通过export table entry,以及symbol table进行更细粒度的划分,但是许多release版本的可执行文件就不好更加详细地划分了。

怎样静态地解析出比单条指令更加粗粒度的代码块,比如BBL级别,是一个需要解决的问题。

Intel Pin基础的更多相关文章

  1. Intel pin 2.14/CentOS 6 X86-64/安装

    环境:Intel Pin 2.14 CentOS 6 X86-64 --linux.tar.gz 进入 ./source/tools/ManualExamples make all TARGET=in ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配

    第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...

  3. [转]Data Structure Recovery using PIN and PyGraphviz

    Source:http://v0ids3curity.blogspot.com/2015/04/data-structure-recovery-using-pin-and.html --------- ...

  4. Tracing Memory access of an oracle process : Intel PinTools

    https://mahmoudhatem.wordpress.com/2016/11/07/tracing-memory-access-of-an-oracle-process-intel-pinto ...

  5. 【转帖】龙芯3A3000处理器深度评测:和Intel、AMD差距巨大

    龙芯3A3000处理器深度评测:和Intel.AMD差距巨大 https://www.eefocus.com/mcu-dsp/424623/r0 作者非计算机科班毕业 让我汗颜. 我计算机毕业都不知道 ...

  6. Vuzzer自动漏洞挖掘工具简单分析附使用介绍

    Vuzzer 是由计算机科学机构  Vrije Universiteit Amsterdam.Amsterdam Department of Informatics 以及 International ...

  7. linux-2.6.18源码分析笔记---中断

    一.中断初始化 中断的一些硬件机制不做过多的描述,只介绍一些和linux实现比较贴近的机制,便于理解代码. 1.1 关于intel和linux几种门的简介 intel提供了4种门:系统门,中断门,陷阱 ...

  8. pin-a-binary-instrumentation-tool

    https://software.intel.com/en-us/articles/pin-a-binary-instrumentation-tool-downloads Introduction t ...

  9. [Cnbeta]龙芯处理器性能怎么样

    龙芯处理器性能怎么样?下一代CPU同频性能可达英特尔90% 在高性能处理器领域,英特尔是天花顶一般的存在(先不算地位特殊的IBM公司),国内发展CPU处理器的公司很多,绝大多数实力跟英特尔相比都差很远 ...

随机推荐

  1. apache的tomcat负载均衡和集群配置 "

    略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务 ...

  2. (54) C# 调用 kernel32.dll

    https://www.cnblogs.com/cwy173/archive/2010/10/02/1841321.html Kernel32 API AddAtom 向本地原子表添加一个字符串 Al ...

  3. ArcMap基于Oracle出现sde.instances_util.check_instance_table_conflicts:: ORA-00942:表或视图不存在/table or view doesnot exist解决思路

    SDE环境:Oracle12C+ArcMap10.7+WinServer2012 出现问题情况: 1.SDE可以连接正常打开,但就是无法新建要素.导入要素等: 1)在根目录新建或导入要素,弹出提示: ...

  4. MVC路由解析---UrlRoutingModule

    文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 引言: 此文全文内容90%转自 一.前 ...

  5. browser-sync浏览器同步刷新工具

    > https://browsersync.io1. 安装browser-sync2. 切换到相应的目录,要监视的文件目录3. 启动browser-sync监视css文件: `browser-s ...

  6. Rsync 实现服务器文件的同步——服务端的安装配置

    一.安装rsync 直接使用yum命令进行安装即可. yum -y install rsync 二.配置文件 网上大多教程都说安装是默认没有配置文件的,但是经过我的尝试,yum安装下默认是有配置文件的 ...

  7. mysql 内连接和外连接查询

    一.内连接查询 (笛卡儿积) 内联接查询inner join,mysql可以简写为join 二.外连接查询 左外联接查询left outer join,mysql可以简写为left join右外联接查 ...

  8. 2059-authentication plugin 'caching_sha2_password"cnnot bt loaded :mysql8.0数据库连接不上(Navicat)

    原因:8.0改变了 身份验证插件 , 打开 my.ini (或者my.cofg) 可以看到变更了 5.7及其以前的方式:mysql_native_password 办法: 1:命令行键入数据库: my ...

  9. markdown_TestOne

    这个是我写的一个markdown尝试 1.2 dafsdfeasdfaefasdfase afsdfasdfefasdfeadfasdfe

  10. Linux替换文件行首的空白字符

    使用命令sed.cp.tail.cat 1.拷贝一个任意文件(生产环境切勿操作) cp /etc/profile /tmp 查看文件部分格式 cat /tmp/profile # /etc/profi ...