IntelPin,Ins_Insertcall?

逆向工程 C++ 小工具
2021-07-02 18:25:29

请帮助我使用 Intel Pin:我将每条指令打印到控制台,并且我想使用 Ins_Insertcall 在它之后插入 +++++:

VOID CpuidCalled(const CONTEXT* ctxt)
{
std::cerr << "+++++" << std::endl;
}

std::cerr << INS_Disassemble(ins) << std::endl;
INS_InsertCall(
ins,
IPOINT_BEFORE, (AFUNPTR)CpuidCalled,
IARG_CONTEXT,
IARG_END
);

输出:

mov esp, esi
pop ebx
pop edi
pop esi
pop ebp
ret 0x10
+++++
+++++
+++++
+++++
+++++
+++++
mov byte ptr [ebp-0x19], al
mov dword ptr [ebp-0x4], 0xfffffffe
mov dword ptr [ebp-0x24], 0x0
call 0x779fdd6d
+++++
+++++
+++++
+++++

为什么会这样,如何解决?谢谢

1个回答

那是因为您在仪器例程中打印反汇编,在分析例程中打印“+++++”。

PIN理论上已经分为两个套路:

  1. 检测 - 您定义检测点的位置 - 在指令被 jitted 时发生
  2. 分析 - 执行实际检测代码的地方 - 在执行指令时发生

请参阅以下幻灯片以快速概览:

https://www.intel.com/content/dam/develop/external/us/en/documents/cgo2013-256675.pdf

那么,你应该怎么做?- 取决于您的偏好 - 在分析例程中同时打印反汇编和“+++++” - 即在函数 CpuidCalled 内部(这更有意义),或者在检测例程中同时打印(这不会像您想要的那样有意义)遵守执行的指令)。