Intel pin:获取指令内存写入\读取大小

Posted

技术标签:

【中文标题】Intel pin:获取指令内存写入\\读取大小【英文标题】: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 = ???

谢谢!

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Intel pin:获取指令内存写入\读取大小的主要内容,如果未能解决你的问题,请参考以下文章

目标代码重定位和 Intel Pin 交互

Intel Pin 3.0 不识别 MPX 指令?

计算机开机运行是如何实现第一条取指指令的?请从电路层级解释

如何使用intel pin工具来计算在linux上执行的指令?

使用 Intel Pin 时跟踪不匹配的 CALL 和 RET 指令数

使用 Intel PIN 在寻址模式下检测具有特定寄存器的 mov dword ptr [rbp - ...] 指令