首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IARG_MEMORYREAD_EA与PIN_SafeCopy的结合

IARG_MEMORYREAD_EA与PIN_SafeCopy的结合
EN

Stack Overflow用户
提问于 2015-04-07 21:02:06
回答 1查看 982关注 0票数 3

IARG_MEMORYREAD_EA类型在PIN中定义为ADDRINT。我需要获取存储在IARG_MEMORYREAD_EA内存位置中的数据。据我所知,从特定地址位置获取数据的最适当方法是使用PIN_SafeCopy函数,其示例用法如下:

代码语言:javascript
复制
ADDRINT DoLoad(REG reg, ADDRINT * addr)
{
    *out << "Emulate loading from addr " << addr << " to " << REG_StringShort(reg) << endl;
    ADDRINT value;
    PIN_SafeCopy(&value, addr, sizeof(ADDRINT));
    return value;
}

当我试图将IARG_MEMORYREAD_EA直接传递给这个函数时,编译器说类型不匹配,(ADDRINT * and ADDRINT)。显然他们没有,但我不知道该如何使用这个函数。

我的当前代码如下:

代码语言:javascript
复制
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)ProcessMemIns,
 IARG_CONTEXT,
 IARG_INST_PTR,
 IARG_MEMORYREAD_EA,
 IARG_MEMORYREAD2_EA,
 IARG_MEMORYREAD_SIZE,
 IARG_MEMORYWRITE_EA,
 IARG_MEMORYWRITE_SIZE,
 IARG_BOOL, INS_IsBranchOrCall(ins),
 IARG_BRANCH_TAKEN,
 IARG_UINT32,  INS_Category(ins),
 IARG_UINT32, INS_RegR(ins, 0),
 IARG_UINT32, INS_RegR(ins, 1),
 IARG_UINT32, INS_RegR(ins, 2),
 IARG_UINT32, INS_RegR(ins, 3),
 IARG_UINT32, INS_RegW(ins, 0),
 IARG_UINT32, INS_RegW(ins, 1),
 IARG_UINT32, INS_RegW(ins, 2),
 IARG_UINT32, INS_RegW(ins, 3),
 IARG_END);

ProcessMemIns是:

代码语言:javascript
复制
VOID ProcessMemIns(
    CONTEXT * context,
    ADDRINT ip,
    ADDRINT raddr, ADDRINT raddr2, UINT32 rlen,
    ADDRINT waddr, UINT32  wlen,
    BOOL    isbranch,
    BOOL    isbranchtaken,
    UINT32  category,
    UINT32  rr0,
    UINT32  rr1,
    UINT32  rr2,
    UINT32  rr3,
    UINT32  rw0,
    UINT32  rw1,
    UINT32  rw2,
    UINT32  rw3)
{ // for memory address and register index, '0' means invalid
  if (pthreadsim->first_instrs < pthreadsim->skip_first)
  {
    pthreadsim->first_instrs++;
    return;
  }
  else if (pthreadsim->first_instrs == pthreadsim->skip_first)
  {
    pthreadsim->first_instrs++;
    pthreadsim->initiate(context);
  }

  /* Log for addresses and data */
  uint64_t data1 = -1, data2 = -1, data3 = -1;
  if (raddr > 0) {
    PIN_SafeCopy(&data1, raddr , sizeof(uint64_t));
    cout << "1A:" << hex << raddr << ",D:" << hex << data1 << endl;
  } 
  if (raddr2 > 0) {
    PIN_SafeCopy(&data1, raddr2 , sizeof(uint64_t));
    cout << "2A:" << hex << raddr2 << ",D:" << hex << data2 << endl;
  } 
  if (waddr > 0) {
    PIN_SafeCopy(&data1, waddr , sizeof(uint64_t));
    cout << "3A:" << hex << waddr << ",D:" << hex << data3 << endl;
  } 

  pthreadsim->process_ins(
    context,
    ip,
    raddr, raddr2, rlen,
    waddr,         wlen,
    isbranch,
    isbranchtaken,
    category,
    rr0, rr1, rr2, rr3,
    rw0, rw1, rw2, rw3);
}

正如预期的那样,我从编译器获得以下错误消息。invalid conversion from ‘LEVEL_BASE::ADDRINT {aka long unsigned int}’ to ‘const VOID* {aka const void*}’ [-fpermissive]

是否有更恰当的方法将IARG_MEMORYREAD_EA用于PIN_SafeCopy(),还是应该定义一个指针并将其用于PIN_SafeCopy()?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 12:15:44

英特尔的PIN文档指出,IARG_MEMORYREAD_EA是一个ADDRINT,尽管我确实同意示例 with PIN_SafeCopy奇怪地使用ADDRINT*.

OTOH,ADDRINT是表示地址的类型,对于IARG_MEMORYREAD_EA,我们知道这是内存读取的有效地址(因此,在大多数情况下,ADDRINT是一个有效的指针)。

对于DoLoad(),我会用一个ADDRINT代替ADDRINT*

对于PIN_SafeCopy,我会将ADDRINT转换为void*,可以是C样式的转换,也可以是reinterpet_cast<>:您已经知道它是一个指针,但是它的类型是错误的,这就是为什么强制转换是用于。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29501253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档