Pin Tool - перехватывает инструкцию по ее адресу для сброса значения регистров - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь сбросить значения регистра в заданном месте в двоичном файле.Я знаю правильный адрес с помощью обратного инжиниринга, но я не могу использовать API-интерфейс инструмента Pin, чтобы указать, что Я хотел бы использовать эту заданную инструкцию .

Есть ли способ вызова INS_InsertCall(..) по указанному адресу, чтобы я мог оттуда сбросить значение регистров?

Большое спасибо

1 Ответ

2 голосов
/ 23 апреля 2019

Самое простое, что можно сделать в вашем случае, это просто проверить адрес инструкции (с помощью 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;
}

См. PIN_GetContextRegval для обзора API.

...