2012-06-29 26 views
0

我在x86-64上使用Linux。在用户程序开始执行代码之前(但在加载器/链接器映射库之后),我需要插入一个系统调用(本质上需要一个陷阱到OS)。有没有人有建议要达到这个需要二进制修改/重新编译没有最好的方法是什么?主要调用系统调用

+3

为什么你想要做这样的事情,而不需要二进制修改?对我来说,这听起来像你想创建一个软件,然后你会分发和监视人的一些跟踪软件... xD,但请纠正我,如果我错了:) – evotopid

回答

2

使用LD_PRELOAD环境变量在libc之前加载自定义库,该库将拦截对__libc_start_main的调用,_start似乎用于开始实际的main()函数。

或者像调试器那样使用ptrace()附加到进程。

+0

我一直在玩这一点。如果我定义了自己的__libc_start_main(),那么调用它很容易,并且使用dlsym和RTLD_NEXT查找原始地址似乎可行,但到目前为止,我还没有能够调用原始或返回。我怀疑这是因为我没有找到正确的函数签名,所以我正在破坏堆栈。在eglibc源代码中找到这个函数的实际定义并不容易。 –