引脚工具-通过其地址拦截指令以转储寄存器值

时间:2019-04-22 16:48:32

标签: c intel-pin

我正在尝试将寄存器值转储到二进制文件中的给定位置。我通过逆向工程知道正确的地址,但是我无法使用Pin工具的API来表示我要对给定的指令进行检测

是否可以在给定地址上调用INS_InsertCall(..),所以我可以从那里转储寄存器的值?

非常感谢

1 个答案:

答案 0 :(得分:2)

在您的情况下,最简单的操作就是检查指令地址(使用INS_Address),并在检测例程中使用条件INS_INsertCall

if(INS_Address(ins) == 0xdeadbeef) { // just check for your hard-coded address here.
     INS_InsertCall(...)
}

在我想到的其他可能性中(但是对于简单的事情,我不会尝试):

[编辑]

关于转储上下文,类似以下内容(未经测试或编译,但您明白了):

// in instrumentation
if(INS_Address(ins) == 0x1cafe /* whatever */) {
    INS_InsertPredicatedCall(ins, 
        IPOINT_BEFORE,       // decide if you want to point before or IPOINT_AFTER
        (AFUNPTR)AnalyzeContext,  // analysis routine
        IARG_INST_PTR,       // address of the ins
        IARG_CONST_CONTEXT,  // the const context (DO NOT MODIFY it in the analysis!)
        IARG_END);
}

请参阅文档中的IARG_CONST_CONTEXT

分析例程:

VOID AnalyzeContext (ADDRINT ip, CONTEXT *ctxt){ 
    PIN_REGISTER reg_val; 
    PIN_GetContextRegval(ctxt, LEVEL_BASE::REG_RAX, reinterpret_cast<UINT8 *>(&reg_val));
    std::cout << std::hex << "REG_RAX: 0x" << reg_val << std::endl;
}

有关API的概述,请参见PIN_GetContextRegval