【问题标题】:Intel pin: getting instruction memory write\read sizeIntel pin:获取指令内存写入\读取大小
【发布时间】:2019-03-12 04:06:50
【问题描述】:

我正在尝试更改 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 = ???

谢谢!

【问题讨论】:

    标签: intel-pin


    【解决方案1】:

    作为一个快速提醒(这是 PIN 中的一个重要概念,经常被忽视):

    从概念上讲,仪器由两个组件组成:

    • 一种决定在何处插入什么代码的机制:instrumentation
    • 在插入点执行的代码:分析

    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 是仪器调用的分析例程。

    如果您有以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

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 2018-06-12
      • 2017-02-24
      • 2019-11-11
      • 2014-04-04
      • 2014-08-21
      • 2019-10-09
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多