使用英特尔 pintool 记录所有指令

Posted

技术标签:

【中文标题】使用英特尔 pintool 记录所有指令【英文标题】:Log all instruction with intel pintool 【发布时间】:2018-12-30 21:12:30 【问题描述】:

我已经写了这个pintool:

#include "pin.H"
#include <iostream>
#include <fstream>

VOID Instruction(INS ins, VOID *v)

        cout << INS_Disassemble(ins) << endl;


VOID Fini(INT32 code, VOID *v)

        cout << "Fin" << endl;


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

    if( PIN_Init(argc,argv) )
    
            cout << "Erreur PIN_Init" << endl;
            return 0;
    

    INS_AddInstrumentFunction(Instruction, 0);
    PIN_AddFiniFunction(Fini, 0);
    PIN_StartProgram();

    return 0;

我正在打印所有说明。 我现在要做的是显示指令地址(EIP)

我该怎么做?

谢谢

【问题讨论】:

【参考方案1】:
#include "pin.H"
#include <iostream>
#include <fstream>
#include <string>
VOID DisplayInstruction(ADDRINT instructionAddress,string assemblyCode)
 cout<<std::hex<<instructionAddress<<":"<<std::dec<<assemblyCode<<"\n";

VOID Instruction(INS ins, VOID *v)
       
 INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)DisplayInstruction,
    IARG_INST_PTR, IARG_REG_VALUE,new string(INS_Assemble(ins)), IARG_END);


VOID Fini(INT32 code, VOID *v)

        cout << "Fin" << endl;


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

    if( PIN_Init(argc,argv) )
    
            cout << "Erreur PIN_Init" << endl;
            return 0;
    

    INS_AddInstrumentFunction(Instruction, 0);
    PIN_AddFiniFunction(Fini, 0);
    PIN_StartProgram();

    return 0;

【讨论】:

谢谢 有没有办法过滤共享库中的指令? PIN_LockClient(); IMG 图像=IMG_FindByAddress(INS_Address(ins)); PIN_UnlockClient(); if (IMG_Valid(image) && IMG_IsMainExecutable(image)) // 把你的代码放在这里 有些奇怪:我试过你的代码:它似乎工作。但是如果我的目标程序包含一个循环,我只会看到一次迭代的指令。我想要做的是跟踪每个指令...... 您的要求是执行动态分析。我向您展示的是静态分析,它仅在检测时使用一次。【参考方案2】:

您需要添加一个分析例程,并将 IARG_REG_VALUE 传递给该例程。

 VOID your_analysis_function(VOID * ip)
   
        out << "ip:" << ip << endl;
       
   VOID Instruction(INS ins, VOID *v)
   
       INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)your_analysis_function,
        IARG_INST_PTR, IARG_REG_VALUE, IARG_END);
   

【讨论】:

谢谢。事实上,我真的不明白二进制文件是否真的启动了,或者 pintools 是否只是计算符号执行。如果我的二进制文件是 PIE,地址会怎样? 我不确定您所说的“二进制文件已启动”是什么意思。检测功能发生在 Pin jitting 期间,而分析功能发生在代码在 Pin 下执行时。如果您在输出中看到“ip:”,那么您的二进制文件实际上正在运行(在 Pin 下)。 换句话说,有没有办法让二进制文件检测仪器? Pin 是一个 dynamic 二进制检测引擎 - 这意味着它实际上启动并运行二进制。至于检测,虽然 Pin 创建了一个符合二进制预期的执行环境,但它不会伪装自己,因此很容易被检测到。 @Bob5421 你可以在这里找到详细的研究:re.public.polimi.it/retrieve/handle/11311/1030092/266288/…

以上是关于使用英特尔 pintool 记录所有指令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Intel Pin 工具生成分支列表?

在英特尔 PIN 中跟踪本机指令 [重复]

目标代码重定位和 Intel Pin 交互

为啥循环指令很慢?英特尔不能有效地实施它吗?

英特尔 IPP 库要求

英特尔 PIN 工具:获取 EFLAGS 值的踪迹