【发布时间】:2018-06-12 11:56:54
【问题描述】:
我正在使用 Intel PIN 修改系统中的内存分配。
我找不到根据内存指令获取实际值的方法。
VOID Instruction(INS ins, VOID *v) {
UINT32 memOperands = INS_MemoryOperandCount(ins)
for (UINT32 memOp = 0; memOp < memOperands; memOp++) {
if (INS_MemoryOperandIsRead(ins, memOp)) {
INS_InsertPredicatedCall(
ins, IPOINT_BEFORE, (AFUNPTR)RecordMemRead,
IARG_INST_PTR,
IARG_MEMORYOP_EA, memOp,
IARG_END);
}
if (INS_MemoryOperandIsWritten(ins, memOp)) {
INS_InsertPredicatedCall(
ins, IPOINT_BEFORE, (AFUNPTR)RecordMemWrite,
IARG_INST_PTR,
IARG_MEMORYOP_EA, memOp,
IARG_END);
}
}
}
VOID RecordMemRead(VOID * ip, VOID * addr) {
if (!Record) return;
printf("%p: R %p\n", ip, addr);
}
VOID RecordMemWrite(VOID * ip, VOID * addr) {
if (!Record) return;
printf("%p: R %p\n", ip, addr);
}
据我了解,这只打印指令指针和操作数的寄存器地址。那是对的吗?如果是这样,我怎样才能得到这个寄存器的值?
最终,我要做的是拦截所有对静态和堆变量的赋值,并将它们转换为一些过程调用,以将值保存在 Google Bigtable 上。
【问题讨论】: