我正在尝试从管脚文档中更改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 = ???
谢谢!
答案 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_PTR
,IARG_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
。