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