我想用 pintool 跟踪所有指令。奇怪的行为

逆向工程 小工具
2021-06-23 19:01:52

看看这个非常基本的 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 只是反汇编我的程序而不是按指令运行它...

1个回答

我认为您可能对INS_AddInstrumentFunction跟踪回调感到困惑在您的情况下,提供给的回调INS_AddInstrumentFunctioncallback_instruction. callback_instruction每次遇到新指令时都会调用 Pin 调用,而不是每次执行指令时调用

这可能不是您想要实现的目标。这是适合您情况的代码。您需要注册在每次执行时执行的回调。

#include "pin.H"
#include <stdio.h>

VOID dump_nop(UINT64 insAddr, std::string insDis) {
  printf("%lx\t%s\n", insAddr, insDis.c_str());
}

VOID callback_instruction(INS ins, VOID *v) {

  if (INS_IsNop(ins)) {
    INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)dump_nop, IARG_ADDRINT,
                   INS_Address(ins), IARG_PTR, new string(INS_Disassemble(ins)),
                   IARG_END);
  }
}

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;
}