gpt4 book ai didi

c++ - 如何获取 Pin 中存储指令写入的值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:32 26 4
gpt4 key购买 nike

我目前正在使用 Pin,我想获取存储指令正在写入的值。我面临的问题是,即使我可以在写指令之前插入一个回调(使用 IPOINT_BEFORE)并从将要写入的内存地址中获取一个值,但它显然不是正确的,因为写入没有发生了。我不能同时使用 IARG_MEMORYWRITE_EA 和 IPOINT_AFTER 作为参数。

当有加载指令时,我设法让它工作,因为该值已经在内存中。其代码如下。

void Read(THREADID tid, ADDRINT addr, ADDRINT inst){

PIN_GetLock(&globalLock, 1);

ADDRINT * addr_ptr = (ADDRINT*)addr;
ADDRINT value;
PIN_SafeCopy(&value, addr_ptr, sizeof(ADDRINT));

fprintf(stderr,"Read: ADDR, VAL: %lx, %lu\n", addr, value);

.
.
.

PIN_ReleaseLock(&globalLock);
}

VOID instrumentTrace(TRACE trace, VOID *v)
{

for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl)) {
for (INS ins = BBL_InsHead(bbl); INS_Valid(ins); ins = INS_Next(ins)) {
if(INS_IsMemoryRead(ins)) {
INS_InsertCall(ins,
IPOINT_BEFORE,
(AFUNPTR)Read,
IARG_THREAD_ID,
IARG_MEMORYREAD_EA,
IARG_INST_PTR,
IARG_END);
} else if(INS_IsMemoryWrite(ins)) {
INS_InsertCall(ins,
IPOINT_BEFORE,
(AFUNPTR)Write,
IARG_THREAD_ID,//thread id
IARG_MEMORYWRITE_EA,//address being accessed
IARG_INST_PTR,//instruction address of write
IARG_END);
}
}
}
}

如何获取存储指令写入内存的值?

最佳答案

我想我已经做到了我想做的。我获取值的方式是每次程序中有一个存储时,我都会保存它将写入的内存地址。然后我检测每条指令并调用 WriteData 函数,该函数实质上是从我之前保存的内存地址获取数据,就像读取一样。

这是获取加载指令值的代码。

void Read(THREADID tid, ADDRINT addr, ADDRINT inst){

PIN_GetLock(&globalLock, 1);

ADDRINT * addr_ptr = (ADDRINT*)addr;
ADDRINT value;
PIN_SafeCopy(&value, addr_ptr, sizeof(ADDRINT));

fprintf(stderr,"Read: ADDR, VAL: %lx, %lx\n", addr, value);
...
PIN_ReleaseLock(&globalLock);
}

这是获取存储指令地址的代码。

void Write(THREADID tid, ADDRINT addr, ADDRINT inst ){    

PIN_GetLock(&globalLock, 1);

writeaddr = addr;
writecount++;
...
PIN_ReleaseLock(&globalLock);
}

这是从上一个商店的地址获取数据的代码。

void WriteData(){ 

PIN_GetLock(&globalLock, 1);

//Reading from memory
if (writecount > 0){

ADDRINT * addr_ptr = (ADDRINT*)writeaddr;
ADDRINT value;
PIN_SafeCopy(&value, addr_ptr, sizeof(ADDRINT));

fprintf(stderr,"Write: ADDR, Value: %lx, %lx\n", writeaddr, value);

writecount--;
}

PIN_ReleaseLock(&globalLock);

}

但是还有一个小问题。以下是我使用的微基准测试的数据,之后是终端中的打印输出。

for (i = 0; i < MAX; i++) {
a[i] = i;
}

for (i = 0; i < MAX; i++) {
a[i] = a[i] + 1;
b[i] = a[i];
}

最大值为 5。

Write: ADDR, Value: 601078, 6f
Read: ADDR, VAL: 7ffd0560de10, 40051b
Write: ADDR, Value: 601080, 0
Write: ADDR, Value: 601084, 1
Write: ADDR, Value: 601088, 2
Write: ADDR, Value: 60108c, 3
Write: ADDR, Value: 601090, 4
Read: ADDR, VAL: 601080, 100000000
Write: ADDR, Value: 601080, 100000001
Write: ADDR, Value: 601060, 1
Read: ADDR, VAL: 601084, 200000001
Write: ADDR, Value: 601084, 200000002
Write: ADDR, Value: 601064, 2
Read: ADDR, VAL: 601088, 300000002
Write: ADDR, Value: 601088, 300000003
Write: ADDR, Value: 601068, 3
Read: ADDR, VAL: 60108c, 400000003
Write: ADDR, Value: 60108c, 400000004
Write: ADDR, Value: 60106c, 4
Read: ADDR, VAL: 601090, 4
Write: ADDR, Value: 601090, 5
Write: ADDR, Value: 601070, 5

从我们在终端中看到的情况来看,第一个写入 a[i] 的操作似乎符合预期。但是,当程序读取相同的地址而不是获取 1,2 等时,它会获取 100000001 等等。它正确地将它们递增 1。但是当需要将它们存储到 b[i] 时,这些值又是正确的。所以我想知道为什么我从读取中获得的数据会遇到这种行为。

关于c++ - 如何获取 Pin 中存储指令写入的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com