Самое простое, что можно сделать в вашем случае, это просто проверить адрес инструкции (с помощью 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 *>(®_val));
std::cout << std::hex << "REG_RAX: 0x" << reg_val << std::endl;
}
См. PIN_GetContextRegval для обзора API.