标签: interposing

为什么LD_PRELOAD不能与Python一起使用?

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)

代码在这里.用make -f Makefile.interpose_python.构建.

这里给出完整的解决方案.

c python linux function-interposition interposing

9
推荐指数
1
解决办法
3253
查看次数

是否可以覆盖对象模块中的静态函数(gcc,ld,x86,objcopy)?

有没有办法在对象模块中覆盖静态范围的函数?

如果我从这样的东西开始,带有全局符号"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)

c gcc ld objcopy interposing

9
推荐指数
1
解决办法
2369
查看次数

插入OS X系统调用

我需要插入(调用我的函数而不是原始函数)一些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

5
推荐指数
0
解决办法
1114
查看次数

插入OSX,我的功能没有被调用

所以,我正在搞乱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)

c macos interposing

2
推荐指数
1
解决办法
1351
查看次数