如何用Intel Pin替换/跳过64位Linux静态二进制文件的系统调用?
静态二进制文件的系统调用替换/模拟方案咨询
我需要在64位Linux 4.4.0-33系统上,对静态链接的二进制文件实现系统调用的替换/模拟,优先考虑使用Intel Pin工具。
根据Pin的文档,PIN_AddSyscallEntryFunction接口可以拦截系统调用入口,但目前没找到跳过真实系统调用的用法。不想采用「在入口回调替换无效系统调用ID,再在出口回调修补返回值」的取巧方式,希望优先使用Pin的高层接口来保证代码可读性,同时充分利用Pin的功能。
背景说明
我已经通过LD_PRELOAD实现了HDFS虚拟文件系统,让程序无需修改即可通过/hdfs/...路径访问HDFS,但该方案对静态链接的二进制文件无效,而且需要拦截的函数点过多(比如open与open64、seek与fseek、fputs等)。
已评估的方案
我已经考虑过以下几种方案,但都存在明显问题:
- LD_PRELOAD替换open/read/write等函数:对静态链接二进制文件无效,因此转向Pin工具
- ptrace/SYSEMU:实现过于复杂,且存在性能瓶颈
- nfs/fuse等文件系统方案:仅适用于虚拟文件场景,后续无法扩展支持套接字操作等其他需求,且适配复杂度高
- 将
sysenter/syscall指令替换为int3:效果与Pin类似,但SIGTRAP的性能比Pin差
寻求建议
- 是否有基于Intel Pin的正确用法,能在拦截系统调用后直接跳过真实调用、执行自定义模拟逻辑?
- 有没有Intel Pin的替代工具,能够支持静态二进制文件的系统调用拦截与替换?(syscall_intercept依赖LD_PRELOAD,已排除)
内容的提问来源于stack exchange,提问作者Revin
相关产品推荐
相关产品推荐

