【发布时间】: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_AddThreadStartFunction、PIN_AddContextChangeFunction或采用IARG_CONTEXT参数的更常用函数之一,如INS_InsertCall或RTN_InsertCall)。 -
我使用 INS_InsertCall 调用它。错误是PIN_GetContextReg不能用于所有寄存器。
-
请同时发布设置检测的代码部分,因为通常很难做到正确。