【问题标题】:Pin tool,the static ins address (INS_Address(ins)) is different from the address of the instrumented instruction(IARG_INST_PTR)Pin工具,静态ins地址(INS_Address(ins))和instrumented指令的地址(IARG_INST_PTR)不同
【发布时间】:2020-09-14 22:30:06
【问题描述】:

我想打印每个 rtn 名称,并且指令属于这个 rtn。我的代码如下所示: '''

for (SEC sec = IMG_SecHead(img); SEC_Valid(sec); sec = SEC_Next(sec))
{ 
    //OutFile << "SEC name: " << SEC_Name(sec) << endl;
    for (RTN rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn))
    {
        if(RTN_NumIns(rtn) >= 1){
            OutFile << RTN_Name(rtn) << ";" << std::dec << RTN_NumIns(rtn) << endl;

            RTN_Open(rtn);

            for (INS ins = RTN_InsHead(rtn); INS_Valid(ins); ins = INS_Next(ins))
            {
                OutFile << hex << INS_Address(ins) << ";" << INS_Disassemble(ins) << ";" \
                ...;
            }
            // to preserve space, release data associated with RTN after we have processed it
            RTN_Close(rtn);
        }     
    }
}

''' 然后我使用 INS_AddInstrumentFunction 打印内存轨迹。 '''

VOID RecordMemRead(VOID * ip, VOID * addr)
{
    fprintf(trace,"%p: R %p\n", ip, addr);
}
VOID RecordMemWrite(VOID * ip, VOID * addr)
{
    fprintf(trace,"%p: W %p\n", ip, addr);
}

VOID Instruction(INS ins, VOID *v)
{
    UINT32 memOperands = INS_MemoryOperandCount(ins);

    for (UINT32 memOp = 0; memOp < memOperands; memOp++)
    {
        if (INS_MemoryOperandIsRead(ins, memOp))
        {
            INS_InsertPredicatedCall(
                ins, IPOINT_BEFORE, (AFUNPTR)RecordMemRead,
                IARG_INST_PTR,
                IARG_MEMORYOP_EA, memOp,
                IARG_END);
        }
        if (INS_MemoryOperandIsWritten(ins, memOp))
        {
            INS_InsertPredicatedCall(
                ins, IPOINT_BEFORE, (AFUNPTR)RecordMemWrite,
                IARG_INST_PTR,
                IARG_MEMORYOP_EA, memOp,
                IARG_END);
        }
    }
}

''' 最后,我得到了不同的ins地址,为什么会这样?我被困在这里太久了。

【问题讨论】:

    标签: assembly x86 intel-pin


    【解决方案1】:

    INS_Address(ins) 打印图像initial加载时加载指令的地址。 IARG_INST_PTR 在执行时给出指令的地址。图像的重定位发生在运行时。因此地址可能不同。

    instruction point value of dynamic linking and static linking。你的问题类似。只是措辞不同。

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 1970-01-01
      • 2014-11-24
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2018-03-18
      相关资源
      最近更新 更多