【问题标题】:Which registers can be modified with PIN_GetContextReg and PIN_SetContextReg可以使用 PIN_GetContextReg 和 PIN_SetContextReg 修改哪些寄存器
【发布时间】:2016-12-06 16:47:54
【问题描述】:

我想使用 PIN_GetContextReg 获取寄存器的值,然后更改它并使用 PIN_SetContextReg 将其放回。 PIN 手册说我可以对整数寄存器执行此操作,但我尝试的所有寄存器(除了 REG_INST_PTR 之外)都会出错(PIN_GetContextReg/PIN_SetContextReg 不支持寄存器**)

这里是代码

    UINT32 old_val;
    UINT32 new_val;
    old_val = PIN_GetContextReg(ctxt,   REG_EAX);       
    new_val = old_val ^ mask;
    PIN_SetContextReg(ctxt,  REG_EAX, new_val);         
    PIN_RemoveInstrumentation();
    PIN_ExecuteAt(ctxt);

在这种情况下,我尝试使用寄存器 EAX,但我得到了同样的错误。我正在使用 Pin 3.0

【问题讨论】:

  • 您能否向我们展示一个重现您问题的最小代码?另外,您使用的是哪个版本的引脚?通常,从用户模式代码访问的所有“物理”寄存器都应该工作......
  • 我使用的是 Pin 3.0,并且我添加了最少的代码
  • 代码本身看起来没问题。它是用什么方式调用的?它应该在回调函数中调用(即从PIN_AddThreadStartFunctionPIN_AddContextChangeFunction 或采用IARG_CONTEXT 参数的更常用函​​数之一,如INS_InsertCallRTN_InsertCall)。
  • 我使用 INS_InsertCall 调用它。错误是PIN_GetContextReg不能用于所有寄存器。
  • 请同时发布设置检测的代码部分,因为通常很难做到正确。

标签: instrumentation intel-pin


【解决方案1】:

我最近一直在处理一个类似的问题,并且遇到了和你一样的错误。

我相信我们都遇到的问题是:我们的计算机有一个名为 RAX 的硬件寄存器,而 EAX 只是其中的一部分。正如您在下面示例的最后几行中看到的那样

// change eax
PIN_SetContextReg(ctxtTo, REG_RAX,0xbaadf00d);

修复此问题后,我的程序可以运行了!如果您需要我的代码作为参考,请随时询问:) 而下面的截图来自https://studylib.net/doc/10207218/verdana-bold-30

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2022-01-07
    • 2020-10-23
    • 2011-07-10
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多