9

Pythonでの関数介入の使用open()は、最初の数回の呼​​び出しの後は機能しないようです。Pythonが何らかの初期化を行っているか、何かが一時的に私の関数をバイパスしているのではないかと思います。

ここで、open呼び出しは明らかにフックされています。

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

ここでは、Pythonの初期化中に1回発生します。

$ 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

strace(おそらくプリロードなしで)実行することで、Pythonプロセスが実際に何をしているのかを知ることができるはずです。

私の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()

openこれは、Pythonのすべての呼び出しと、呼び出しから書き込みフラグが削除されたために伝播されたいくつかのエラーを明確に示しています。

于 2011-12-18T04:46:15.900 に答える