Intel Pin: недействительный REG для IARG_REG_VALUE reg: xmm0 - PullRequest
0 голосов
/ 15 ноября 2018

Я делаю программу для отслеживания программы, но у меня возникают проблемы с ошибкой, такой как заголовок. Кто-нибудь может что-то понять?

INS_InsertCall(ins, action, AFUNPTR(RegOpnd::at_call),
            IARG_PTR, data,
            IARG_PTR, this,
            IARG_REG_VALUE, reg_,
            IARG_END);

Я проверил, что IARG_REG_VALUE не был совместим с регистрами xmm. Как я могу получить информацию?

1 Ответ

0 голосов
/ 16 ноября 2018

Как указано в документации :

, его нельзя использовать для получения значения регистров, размер которых больше, чем ADDRINT (например, x87 FPU / XMM / YMM / ZMM /opmask)

У вас есть два варианта:

  • Проверьте тип регистра и используйте IARG_REG_CONST_REFERENCE (или IARG_REG_REFERENCEесли вы хотите изменить регистр).
  • Получите контекст ЦП (используя IARG_CONST_CONTEXT или IARG_CONTEXT, если вы хотите изменить какой-либо регистр в нем) и проверьте регистры вcontext.

Я полагаю, что первый вариант является более значимым, поэтому он должен выглядеть примерно так, как показано ниже:

Предупреждение : приведенный ниже код имеетне был проверен / скомпилирован ...

Инструментарий:

const unsigned int opnd_count =  INS_OperandCount(ins);
for(unsigned int i=0; i < opnd_count;i++)
{
    if (INS_OperandIsReg(ins,i))
    {
        REG r = INS_OperandReg(ins,i);
        if ((r))
        {
            INS_InsertCall(ins, IPOINT_AFTER, (AFUNPTR)xmm_arg, 
                           IARG_REG_CONST_REFERENCE, r,
                           IARG_REG_REFERENCE, r, // you might remove this one if you don't modify the reg.
                           IARG_UINT32, i,
                           IARG_UINT32, (r-REG_XMM_BASE), // note: REG_XMM_BASE = REG_XMM0
                           IARG_END);
        }

    }
}

Анализ:

// regConstRef: const reference on the register
// regRef: reference on the register
// opnd_indx: operand index (0 for the 1st inst. op.; 1 for the 2nd inst. op.)
// regno: register number: 0 = XMM0; 1 = XMM1, etc.
VOID xmm_arg(PIN_REGISTER* regConstRef, PIN_REGISTER* regRef, UINT32 opnd_indx, UINT32 regno)
{
    // just "dump" the register
    std::cout << "XMM" << regno << " operand_index: " << opnd_indx << " ";
    for(unsigned int i=0;i< MAX_DWORDS_PER_PIN_REG;i++)
    {
        std::cout << std::setw(10) << regConstRef->dword[i] << " ";
    }  
    std::cout << std::endl;
}  
...