9

在最初的几次调用之后,对 Python使用函数插入open()似乎不起作用。我怀疑 Python 正在进行某种初始化,或者某些东西暂时绕过了我的函数。

这里的open调用显然是被钩住了:

$ cat a
hi
$ LD_PRELOAD=./libinterpose_python.so cat a
sandbox_init()
open()
hi

这里它在 Python 初始化期间发生一次:

$ LD_PRELOAD=./libinterpose_python.so python
sandbox_init()
Python 2.7.2 (default, Jun 12 2011, 20:20:34) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
open()
>>> 
sandbox_fini()

在这里它根本不会发生,并且没有错误表明文件句柄已删除写权限:

$ LD_PRELOAD=./libinterpose_python.so python3 -c 'b = open("a", "w"); b.write("hi\n"); b.flush()'
sandbox_init()
sandbox_fini()

代码这里。_ 用make -f Makefile.interpose_python.

这里给出了一个完整的解决方案。

4

3 回答 3

8

有 open() 和 open64() 函数,您可能需要重新定义两者。

于 2011-06-21T10:33:36.643 回答
2

你应该能够通过在下面运行它来找出你的 python 进程实际上在做什么strace(可能没有你的预加载)。

我的 python3.1(在 AMD64 上)似乎使用open

axa@ares:~$ strace python3.1 -c 'open("a","r+")'
...
open("a", O_RDWR)                       = -1 ENOENT (No such file or directory)
于 2011-06-21T10:44:30.840 回答
1

原来一个open64()功能:

$ objdump -T /lib32/libc.so.6  | grep '\bopen'
00064f10 g    DF .text  000000fc  GLIBC_2.4   open_wmemstream
000cc010 g    DF .text  0000007b  GLIBC_2.0   openlog
000bf6d0  w   DF .text  000000b6  GLIBC_2.1   open64
00094460  w   DF .text  00000055  GLIBC_2.0   opendir
0005f9b0 g    DF .text  000000d9  GLIBC_2.0   open_memstream
000bf650  w   DF .text  0000007a  GLIBC_2.0   open
000bf980  w   DF .text  00000081  GLIBC_2.4   openat
000bfb90  w   DF .text  00000081  GLIBC_2.4   openat64

open64() 函数是大文件扩展的一部分,相当于调用带有 O_LARGEFILE 标志的 open()。

运行未open64注释部分的示例代码会给出:

$ LD_PRELOAD=./libinterpose_python.so python3 -c 'b = open("a", "w"); b.write("hi\n"); b.flush()'
sandbox_init()
open64()
open64()
open64()
Traceback (most recent call last):
  File "<string>", line 1, in <module>
open64()
open64()
open64()
open64()
open64()
open64()
open64()
IOError: [Errno 9] Bad file descriptor
sandbox_fini()

这清楚地显示了 Python 的所有open调用,以及由于从调用中剥离写入标志而导致的几个传播错误。

于 2011-12-18T04:46:15.900 回答