拦截Linux上的文件操作

我正在开发一个用于渲染视觉效果和动画的云平台。 我们接受各种格式的场景描述渲染它们,并将图像输出返回给用户。 处理后端是Linux。 有时我们会收到在Windows上生成的场景描述,因此我们得到的路径看起来像’C:\ path \ to \ file.mb’。 我编写了一个Linux共享库来拦截各种文件系统调用,并改变Linux可以理解的路径’/ C / path / to / file’。 我使用LD_PRELOAD机制在“真实”函数之前插入我的函数,它工作得很好……除非它没有。

例如这个命令:

LD_PRELOAD = / home / robert / path_fix.so渲染-s 1 -e 1 C:\ path \ to \ test_scene_03_vray.ma

找不到test_scene_03_vray.ma。 这也行不通:

LD_PRELOAD = / home / robert / path_fix.so echo test> C:\ path \ to \ test.txt

我一直在使用ltrace来确定哪些函数是通过引用路径名来调用的,但这些示例并未显示在我的跟踪中:

ltrace -f -C -S -o ltrace.out渲染C:\ path \到\ test_scene_03_vray.ma

是否有一个工具而不是ltrace可以让我看到调用了哪些函数调用?

这是我已经覆盖的列表:

  • FOPEN
  • freopen函数
  • 执行opendir
  • 打开
  • 科瑞
  • 了openat
  • 统计
  • LSTAT
  • fstatat
  • __lxstat
  • __xstat
  • MKDIR
  • mkdirat
  • 取消链接
  • unlinkat
  • 访问
  • faccessat
  • 改名
  • renameat
  • renameat2
  • CHMOD
  • fchmodat
  • CHOWN
  • lchown
  • fchownat
  • 链接
  • linkat
  • name_to_handle_at
  • 的readlink
  • readlinkat
  • 符号链接
  • symlinkat
  • 命令rmdir
  • CHDIR

我在这里缺少更多function吗? 我试图实现所需的一切

const char * filepath

作为一个论点。

旁边的问题:这似乎已经是一个已经解决的问题…是否有一个库或其他方法将Windows路径转换为unix友好路径? 请记住,渲染应用程序是第三方专有二进制文件,因此我无法修改它们。

谢谢你的任何建议!

是的,还有其他function,例如64位函数open64() 。 还有__open()等函数。

在64位Centos 7服务器上,刚刚open我得到:

 nm -D /lib64/libc.so.6 | grep open 0000000000033d70 T catopen 00000000003c0b80 B _dl_open_hook 000000000006b140 T fdopen 00000000000ba4c0 W fdopendir 00000000000755d0 T fmemopen 000000000006ba00 T fopen 000000000006ba00 W fopen64 000000000006bb60 T fopencookie 0000000000073700 T freopen 0000000000074b60 T freopen64 00000000000eb7a0 T fts_open 0000000000022220 T iconv_open 000000000006b140 T _IO_fdopen 0000000000077230 T _IO_file_fopen 0000000000077180 T _IO_file_open 000000000006ba00 T _IO_fopen 000000000006d1d0 T _IO_popen 000000000006cee0 T _IO_proc_open 0000000000131580 T __libc_dlopen_mode 00000000000e82a0 W open 00000000000e82a0 W __open 00000000000ed0f0 T __open_2 00000000000e82a0 W open64 00000000000e82a0 W __open64 00000000000ed110 T __open64_2 00000000000e8330 W openat 00000000000e8410 T __openat_2 00000000000e8330 W openat64 00000000000e8410 W __openat64_2 00000000000f7860 T open_by_handle_at 00000000000340b0 T __open_catalog 00000000000b9f70 W opendir 00000000000f12b0 T openlog 0000000000073ea0 T open_memstream 00000000000731c0 T open_wmemstream 000000000006d1d0 T popen 0000000000130630 W posix_openpt 00000000000e6ec0 T posix_spawn_file_actions_addopen 

例如,在Linux上,这个C代码很可能正常工作:

 int fd = __open( path, O_RDONLY ); 

您也不会捕获静态链接的进程,或者发出系统调用的进程,例如直接open

你可以在技术上使用kprobes拦截调用,但如果文件的数量太多或动态生成,我建议创建符号链接。 它更安全,更简单。