转载:pin示例程序详解

https://software.intel.com/sites/landingpage/pintool/docs/71313/Pin/html/

计数程序inscount0

#include

#include

#include "pin.H"

ofstream OutFile;

// 计数执行的指令

// static不在栈中,可以方便计数

static UINT64 icount = 0;

// 当每个指令执行前被执行,来技术指令的个数

VOID docount() { icount++; }

// 遇到新指令时执行这个函数

VOID Instruction(INS ins, VOID *v)

{

    // 在每一个指令前植入一个指向docount的调用,不传参

    //第一个参数:操作的指令;第二个参数:调用方式,此处为指令前调用,即无条件调用;

    //第三个参数:指向调用的函数的指针;第四个参数:决定传入参数的类型,不传参,所以空缺,一定以IARG_END结尾

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

}

//KNOB_MODE_WRITEONCE表示:每次调用完成输出结果都是重写

KNOB KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool",

    "o", "inscount.out", "specify output file name");

// 退出时输出计数值

VOID Fini(INT32 code, VOID *v)

{

    // Write to a file since cout and cerr maybe closed by the application

    OutFile.setf(ios::showbase);

    OutFile << "Count " << icount << endl;

    OutFile.close();

}

/* ===================================================================== */

/* Print Help Message                                                    */

/* ===================================================================== */

INT32 Usage()

{

    cerr << "This tool counts the number of dynamic instructions executed" << endl;

    cerr << endl << KNOB_BASE::StringKnobSummary() << endl;

    return -1;

}

/* ===================================================================== */

/* Main                                                                  */

/* ===================================================================== */

/*  argc, argv are the entire command line: pin -t -- ...    */

/* ===================================================================== */

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

{

    // 初始化pin

    if (PIN_Init(argc, argv)) return Usage();

    OutFile.open(KnobOutputFile.Value().c_str());

    // 注册插桩函数

    INS_AddInstrumentFunction(Instruction, 0);

    // 注册退出函数

    PIN_AddFiniFunction(Fini, 0);

    // 开始执行

    PIN_StartProgram();

    return 0;

}

小结:

这个程序给出了一般pintool的基本框架: 在main函数中首先调用PIN_Init初始化

之后就可以使用INS_AddInstrumentFunction注册一个插桩函数,在原始程序的每条指令被执行前,都会进入Instruction这个函数中,其第2个参数为一个额外传递给Instruction的参数,即对应VOID

*v这个参数,这里没有使用。而Instruction接受的第一个参数为INS结构,用来表示一条指令。 最后又注册了一个程序退出时的函数Fini,接着就可以使用PIN_StartProgram启动程序了。

此处参考http://brieflyx.me/2017/binary-analysis/intel-pin-intro/

这是一个最简单的插桩函数了,我理解起来也用了一段时间。主要是对每一个函数的作用的理解,并且查阅了一些资料。接下来要看更复杂的函数了。

————————————————

版权声明:本文为CSDN博主「shadothew」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/shadothew/article/details/81514895

你可能感兴趣的:(转载:pin示例程序详解)