В качестве быстрого напоминания (это важная концепция в ПИН-коде, которую часто упускают из виду):
Концептуально измерительная аппаратура состоит из двух компонентов:
- Механизм, который решает, где и чтовставлен код: инструментарий .
- Код для выполнения в точках вставки: анализ .
Функции INS_INSERT(xxx)CALL
используются в процедуре инструментария (чтобы сообщить программе анализа), когда и какой код вставлен.Итак, в вашем коде:
INS_InsertPredicatedCall(
ins, IPOINT_BEFORE, (AFUNPTR)MyFuncWhenRead,
IARG_INST_PTR,
IARG_MEMORYOP_EA, memOp,
IARG_END);
IPOINT_BEFORE
- это при . - Указывает, куда вставляется процедура анализа относительно инструментированного кода (здесь точка вставки выполняется перед инструкцией).
IARG_INST_PTR
, IARG_MEMORYOP_EA
являются что . - Они определяют аргументы, передаваемые подпрограмме анализа.
- Они принимаются подпрограммой анализа в порядке их объявления.
MyFuncWhenRead
- это процедура анализа , вызываемая инструментарием.
Если у вас есть что-то, начинающееся с IARG_
, это IARG_TYPE , который имеетдля передачи функции INS_Insert(xxx)Call
.
Документация для IARG_MEMORYREAD_SIZE
гласит:
IARG_MEMORYREAD_SIZE Тип: UINT32.Размер в байтах прочитанной памяти.(...)
Type
сообщает нам, что получает процедура analysis .
В вашем случае у вас (в этом точном заказ):
IARG_INST_PTR
: тип: ADDRINT IARG_MEMORYOP_EA
: тип: ADDRINT IARG_MEMORYREAD_SIZE
: тип: UINT32
Это означает, что ваша измерительная функция будет выглядеть следующим образом:
INS_InsertPredicatedCall(
ins, IPOINT_BEFORE, (AFUNPTR)MyFuncWhenRead,
IARG_INST_PTR,
IARG_MEMORYOP_EA, memOp,
IARG_MEMORYREAD_SIZE,
IARG_END);
И ваша функция анализа должна выглядеть следующим образом:
VOID MyFuncWhenRead(
ADDRINT ins_ptr, // from IARG_INST_PTR (address of the instruction)
ADDRINT mem_op_addr, // from IARG_MEMORYOP_EA (address of the memory read)
UINT32 mem_read_size, // from IARG_MEMORYREAD_SIZE (size of the read)
)
{
// ...
}
Та же логика применима к IARG_MEMORYWRITE_SIZE
.