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_PTR
、IARG_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工具来计算在linux上执行的指令?