看看这个非常基本的 c 程序:
int main()
{
for (int i=0;i<0x42;i++)
{
asm("nop");
asm("nop");
}
return 0x42;
}
我编译它没有任何优化。
你可以用radare2看到这一点:
| ,=< 0x00001130 eb06 jmp 0x1138
| | ; JMP XREF from 0x0000113c (main)
| .--> 0x00001132 90 nop
| :| 0x00001133 90 nop
| :| 0x00001134 8345fc01 add dword [local_4h], 1
| :| ; JMP XREF from 0x00001130 (main)
| :`-> 0x00001138 837dfc41 cmp dword [local_4h], 0x41 ; [0x41:4]=0x4000000 ; 'A'
| `==< 0x0000113c 7ef4 jle 0x1132
2 个 nops 指令将运行 0x42 次。
我想要做的是了解如何使用 pin 工具记录所有程序指令。
我写了一个非常基本的 pin 工具:
#include "pin.H"
#include <stdio.h>
VOID callback_instruction(INS ins, VOID *v)
{
printf("%lx\t%s\n", INS_Address(ins),INS_Disassemble(ins).c_str());
}
int main(int argc, char *argv[])
{
if (PIN_Init(argc,argv))
{
printf("Erreur\n");
return 0;
}
INS_AddInstrumentFunction(callback_instruction, 0);
PIN_StartProgram();
return 0;
}
有一点我不明白。callback_instruction 应该在每个指令之前调用。所以我应该看到 0x42*2 倍的 nop 指令。或者我只能看到它两次。
我不明白为什么 pintool 只是反汇编我的程序而不是按指令运行它...