使用 PIN 跟踪 int 0x80 指令

逆向工程 仪器仪表
2021-07-09 01:35:22

我写了这个小 pintool 试图记录int 0x80执行指令数量我大致如下: -

xed_iclass_enum_t iclass = static_cast<xed_iclass_enum_t>(INS_Opcode(ins));

然后我将 iclass 与 XED_ICLASS_INT 进行比较,如果找到,则打印出 EIP。我在静态编译的测试二进制文件上执行此操作:-

1. Prints hello world
2. Makes a call to mprotect

然而,int 0x80遇到指令数量只是一个。有什么明显的我做错了吗?我也尝试使用 XED_ICLASS_SYSCALL 但这没有帮助。

1个回答

PIN_AddSyscallEntryFunction

为什么不直接使用PIN_AddSyscallEntryFunction这是一种与 ABI 无关的做事方式,它允许您使用PIN_GetSyscallArgument和相关的功能,而不是手动检查堆栈和寄存器上下文。

INS_IsInterrupt

您还可以INS_IsInterrupt在检测时使用以在分析时收集信息。请注意,这不会捕获通过syscallorsysenter指令进行的任何系统调用

例子

举一个简单的例子,如果你查看inscount0.cppPin 附带的文件,如果你添加以下检查,你只会检测系统调用。

INS_IsInterrupt

在 中inscount0.cpp,更改例程,如下所示。该模块现在将计算int执行指令,而不是执行的指令总数。

VOID Instruction(INS ins, VOID *v)
{
    if(INS_IsSyscall(ins))
    {
        INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_END);
    }
}

现在将计算所有系统调用指令。您可以使用标准INS_InsertCall参数来检查堆栈或寄存器上下文。

PIN_AddSyscallEntryFunction

之前添加这个功能 main

void OnSyscall(THREADID threadIndex, CONTEXT *ctxt, SYSCALL_STANDARD std, VOID *v)
{
    printf("Made syscall #%i\n", PIN_GetSyscallNumber(ctxt, std));
}

并将此行添加到mainbefore PIN_StartProgram

PIN_AddSyscallEntryFunction(OnSyscall, 0);