Пин Intel: получение инструкции памяти записи \ чтения размера - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь немного изменить пример Ссылка на память (Инструментарий инструкций) из документации по выводам.

Моя цель состоит в том, чтобы извлечь из каждой инструкции, имеющей доступ к памяти, также размерразмера памяти для чтения \ записи в байтах.

Я посмотрел в документации и обнаружил, что мне нужно использовать

IARG_MEMORYREAD_SIZE
IARG_MEMORYWRITE_SIZE

для хранения этого размера.

Я не смог найти в документации, как извлечь эти данные из инструкции.

вот мой код:

for (UINT32 memOp = 0; memOp < memOperands; memOp++)
{
    if (INS_MemoryOperandIsRead(ins, memOp))
    {
        if(INS_hasKnownMemorySize(ins))
        {
            //IARG_MEMORYREAD_SIZE  memReadSize = what to do here?

            INS_InsertPredicatedCall(
                ins, IPOINT_BEFORE, (AFUNPTR)MyFuncWhenRead,
                IARG_INST_PTR,
                IARG_MEMORYOP_EA, memOp,
                IARG_END);
        }
    }

    if (INS_MemoryOperandIsWritten(ins, memOp))
    {
        if(INS_hasKnownMemorySize(ins))
        {
            //IARG_MEMORYREAD_SIZE  memWriteSize = what to do here?

            INS_InsertPredicatedCall(
                ins, IPOINT_BEFORE, (AFUNPTR)MyFuncWhenWrite,
                IARG_INST_PTR,
                IARG_MEMORYOP_EA, memOp,
                IARG_END);
        }
    }
}

Буду признателен за помощь в решении этой проблемы.То есть что писать в строке с комментарием

        //IARG_MEMORYREAD_SIZE  memReadSize = ???

Спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

В качестве быстрого напоминания (это важная концепция в ПИН-коде, которую часто упускают из виду):

Концептуально измерительная аппаратура состоит из двух компонентов:

  • Механизм, который решает, где и чтовставлен код: инструментарий .
  • Код для выполнения в точках вставки: анализ .

Функции 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.

...