我正在尝试将寄存器值转储到二进制文件中的给定位置。我通过逆向工程知道正确的地址,但是我无法使用Pin工具的API来表示我要对给定的指令进行检测。
是否可以在给定地址上调用INS_InsertCall(..)
,所以我可以从那里转储寄存器的值?
非常感谢
答案 0 :(得分:2)
在您的情况下,最简单的操作就是检查指令地址(使用INS_Address
),并在检测例程中使用条件INS_INsertCall
:
if(INS_Address(ins) == 0xdeadbeef) { // just check for your hard-coded address here.
INS_InsertCall(...)
}
在我想到的其他可能性中(但是对于简单的事情,我不会尝试):
您还可以将control regions与control manager一起使用。
filter RTN class(您可以从指令中获得RTN)。
[编辑]
关于转储上下文,类似以下内容(未经测试或编译,但您明白了):
// 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 *>(®_val));
std::cout << std::hex << "REG_RAX: 0x" << reg_val << std::endl;
}
有关API的概述,请参见PIN_GetContextRegval。