Intel针脚:获取指令存储器的写入\读取大小

时间:2018-10-07 06:45:10

标签: intel-pin

我正在尝试从管脚文档中更改Memory Reference Trace (Instruction Instrumentation)示例。

我的目标是从访问内存的每条指令中提取要读取/写入的内存大小(以字节为单位)。

我查看了文档,发现我需要使用

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 :(得分:1)

快速提醒一下(这是PIN中的一个重要概念,通常会被忽略):

从概念上讲,检测由两个部分组成:

  • 一种确定插入代码的位置和方式的机制:仪器
  • 要在插入点执行的代码:分析

INS_INSERT(xxx)CALL函数在检测例程中(用于告知分析例程)何时以及插入什么代码。因此,在您的代码中:

        INS_InsertPredicatedCall(
            ins, IPOINT_BEFORE, (AFUNPTR)MyFuncWhenRead,
            IARG_INST_PTR,
            IARG_MEMORYOP_EA, memOp,
            IARG_END);
  • IPOINT_BEFORE时间
    • 它告诉分析例程相对于已检测代码的插入位置(此处,插入点位于指令之前)。
  • IARG_INST_PTRIARG_MEMORYOP_EA内容
    • 他们确定传递给分析例程的参数。
    • 分析例程按声明的顺序接收它们。
  • MyFuncWhenRead是仪器调用的 analysis 例程。

如果您有以IARG_开头的内容,则它是一个IARG_TYPE,必须将其传递给INS_Insert(xxx)Call函数。

IARG_MEMORYREAD_SIZE的文档说:

  

IARG_MEMORYREAD_SIZE类型:UINT32。读取的内存大小(以字节为单位)。 (...)

Type告诉我们分析例程收到什么。

您的情况(按照此精确的顺序):

  • 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