我正在使用 Intel Pin 来跟踪 Windows 上可执行文件的内存活动。我发现,大多数内存操作数(读取或写入)以 2 或 4 个字节进行操作。所以我决定修改原始 Pin 的pinatrace示例,以查看哪些程序集操作码产生哪些内存活动。
VOID Instruction(INS ins, VOID *v)
{
UINT32 memOperands = INS_MemoryOperandCount(ins);
fprintf(trace,"\n[%s]\n",(INS_Disassemble(ins)).c_str());
for (UINT32 memOp = 0; memOp < memOperands; memOp++)
{
.....
它基本上所做的(我希望)只是在它产生的内存操作数之前编写反汇编的操作码。但是后来我查看了文件(W 用于写入,R 用于读取):
[测试edx,0x800000]
[jnz 0x77708557]
[mov dword ptr [ebp-0x4], edi]
[测试dl,0x1]
[jnz 0x77703136] RWWRWW
[lea edi, ptr [ebx+0xcc]]
[push dword ptr [edi]]
[呼叫 0x77702520] RWW
[mov edi, edi]
[推ebp]
[mov ebp, esp]
[mov eax, dword ptr [ebp+0x8]]
[mov ecx, dword ptr fs:[0x18]]
[lea edx, ptr [eax+0x4]]
[锁定 btr dword ptr [edx], 0x0]
[jnb 0x777041dc]
[mov ecx, dword ptr [ecx+0x24]]
[mov dword ptr [eax+0xc], ecx]
[mov dword ptr [eax+0x8], 0x1]
[移动 eax,0x1]
[流行音乐]
[ret 0x4] WRRRWRWWRR
正如我们所见,应该与内存一起工作的操作码(例如mov)不会产生内存操作数。虽然内存跟踪在ret/call/jnz等之后作为块连接。
问题:Intel Pin 跟踪什么样的内存操作数?是关于调用虚拟内存/RAM/CPU 寄存器吗?由于 CPU 的管道,内存活动是否有可能成块?