【问题标题】:Log all instruction with intel pintool使用英特尔 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)

我该怎么做?

谢谢

【问题讨论】:

    标签: intel-pin


    【解决方案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/…
    猜你喜欢
    • 2023-03-06
    • 2020-05-12
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2020-08-23
    • 2015-03-26
    • 2020-06-01
    相关资源
    最近更新 更多