open()在前几次调用之后,使用函数插入for Python似乎不起作用.我怀疑Python正在进行某种初始化,或者某些东西暂时绕过我的功能.
这里的open电话很明显:
$ cat a
hi
$ LD_PRELOAD=./libinterpose_python.so cat a
sandbox_init()
open()
hi
Run Code Online (Sandbox Code Playgroud)
在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()
Run Code Online (Sandbox Code Playgroud)
在这里根本没有发生,并且没有错误表明文件句柄已删除写权限:
$ LD_PRELOAD=./libinterpose_python.so python3 -c 'b = open("a", "w"); b.write("hi\n"); b.flush()'
sandbox_init()
sandbox_fini()
Run Code Online (Sandbox Code Playgroud)
有没有办法在对象模块中覆盖静态范围的函数?
如果我从这样的东西开始,带有全局符号"foo"的模块是一个调用本地符号"bar"的函数,它调用本地符号"baz"
[scameron@localhost ~]$ cat foo.c
#include <stdio.h>
static void baz(void)
{
printf("baz\n");
}
static void bar(void)
{
printf("bar\n");
baz();
}
void foo(void)
{
printf("foo\n");
bar();
}
[scameron@localhost ~]$ gcc -g -c foo.c
[scameron@localhost ~]$ objdump -x foo.o | egrep 'foo|bar|baz'
foo.o: file format elf32-i386
foo.o
00000000 l df *ABS* 00000000 foo.c
00000000 l F .text 00000014 baz
00000014 l F .text 00000019 bar
0000002d g F .text 00000019 foo
Run Code Online (Sandbox Code Playgroud)
它有一个全球性的"foo"和两个当地人"bar"和"baz".
假设我想编写一些运动条和baz的单元测试,我可以这样做:
[scameron@localhost ~]$ cat barbaz
bar
baz
[scameron@localhost ~]$ …Run Code Online (Sandbox Code Playgroud) 我需要插入(调用我的函数而不是原始函数)一些OS X系统调用来克服一个闭源软件中的缺陷.
最好,得到的解决方案可以在10.5(Leopard)和更新的情况下工作,但如果论证足够强大,我可能需要10.6(Snow Leopard).
最好,得到的解决方案是可执行的,但我可能会选择一个脚本.
优选地,即使在目标应用程序运行之后,所得到的解决方案也能够插入("窃取向量"),但是我可以解决在应用程序加载时必须注入其自身的技术.
优选地,所得到的解决方案将用C或C++开发,但我可以解决Objective-C或其他问题.
到目前为止,我已经尝试过:
1)DTrace脚本,它教会了我很多,但D语言的局限性(有限的流量控制等)使它成为我正在做的事情的主要痛苦,更不用说结果将是一个脚本,这不像我正在拍摄的那样整洁和自足.
2)DYLD_INSERT_LIBRARIES插入,在很多方面很流行,但可能是由于命名空间扁平化(我不会假装深刻理解这意味着什么),它可以很好地对付更简单的可执行文件,但是使我的目标应用程序阻塞,即使我构建一个没有实际插入任何调用的无用库.
我的最新想法是尝试使用mach_star(https://github.com/rentzsch/mach_star),但我先停在这里,要求Stack Overflow社区,它总是比我更了解...
......我接下来除了马赫星之外还应该看一些东西吗?
macos dtrace library-interposition function-interposition interposing
所以,我正在搞乱OSX上的一些插入代码(gcc 4.2.1),我试图让以下内容工作:
当我使用DYLD_INSERT_LIBRARIES = my.dylib调用./login时,它应该覆盖默认的登录实现并使用我的自定义实现.虽然这是一个人为的例子,但它只是为了帮助我理解这一点.
我的来源:
cat libinterposers.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include "login.h"
typedef struct interpose_s
{
void *new_func;
void *orig_func;
} interpose_t;
int my_open(const char *, int, mode_t);
int my_close(int);
int my_login();
static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose"))) =
{
{ (void *)my_open, (void *)open },
{ (void *)my_close, (void *)close },
{ (void *)my_login, (void *)login },
};
int my_login()
{
printf("--> my_login()\n");
return 1;
}
int my_open(const char *path, int flags, mode_t mode) …Run Code Online (Sandbox Code Playgroud)