Intel PIN中INS_AddInstrumentFunction与INS_InsertCall的区别及调用时机
Intel PIN中INS_AddInstrumentFunction与INS_InsertCall的调用时机解析
INS_AddInstrumentFunction 回调的调用时机
这是PIN在静态插桩阶段触发的回调——也就是PIN加载目标程序、解析二进制指令流的过程中,会遍历每一条可执行指令(INS对象),对每条指令都会执行你传入的回调函数一次。这个阶段发生在目标程序开始运行之前,属于预处理环节,你通常在这里完成插桩的判断与配置(比如决定对哪些指令进行动态插桩)。
示例代码片段:
void InstrumentEachIns(INS ins, void* userData) { // 针对每条指令做判断,比如只对内存读写指令插桩 if (INS_IsMemoryRead(ins) || INS_IsMemoryWrite(ins)) { INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)TrackMemoryAccess, IARG_END); } } // 在PIN的主函数中注册 int main(int argc, char* argv[]) { PIN_Init(argc, argv); INS_AddInstrumentFunction(InstrumentEachIns, 0); PIN_StartProgram(); return 0; }
上面的InstrumentEachIns函数会在静态分析阶段,每解析一条指令就执行一次。
INS_InsertCall 回调的调用时机
这个函数是用来向目标指令中插入动态运行时钩子,你传入的回调函数会在目标程序运行到指定指令的特定时机(通过IPOINT_*参数指定,比如IPOINT_BEFORE、IPOINT_AFTER)被触发。也就是说,每当目标程序执行到你插桩的那条指令时,PIN会先/后执行你设置的回调,再继续执行原指令逻辑。
比如上面示例中的TrackMemoryAccess函数,会在目标程序每次执行内存读写指令前被调用,每次指令执行都会触发一次。
核心区别总结
INS_AddInstrumentFunction的回调:程序运行前的静态分析阶段,每条指令仅执行一次,负责插桩的配置;INS_InsertCall的回调:程序运行时,对应指令被执行到指定时机时触发,属于运行时的行为钩子。
内容的提问来源于stack exchange,提问作者QZero
相关产品推荐
相关产品推荐

