如何从共享对象中找到程序的argc
和argv
?我正在用C编写一个库,它将通过LD_PRELOAD
加载。我已经能够找到堆栈两种不同的方式:通过从库中查找argc和argv
- 读
rsp
直列__asm__
电话。 - 阅读
/proc/<pid>/maps
并解析堆栈的条目。
然后我可以创建一个指针,将它指向堆栈段,然后遍历查找数据。问题是我找不出一个有效的方法来确定哪些字节是argc
和指向argv
字符串的指针。
我知道/proc/<pid>/cmdline
也包含参数,每个参数都由0x00
分开,但我有兴趣在内存中查找所有内容。
在gdb中,我看到一个DWORD
为argc
后跟一个QWORD
这是第一个指针。在地址argc
之前的20个字节是一个指向主程序代码段的指针。但是,这不是确定性的方式来识别argc
和argv
。
我见过几个职位,但没有工作代码:
- http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.system/2005-07/0296.html
- https://sourceware.org/ml/libc-help/2009-11/msg00010.html
似乎有点薄片状的方式来做到这一点,是依赖于编译器如何使用堆栈。只要有人发现编译器/运行时优化,这可能会发生变化。应用程序也可能希望在不同的意义上使用相同的参数,如果您的lib试图解释不是针对它的参数,这可能会导致问题。你能否在“构造函数”调用中直接将这些传递给你的库?是的,我明白你想要做的是避免这种开销。 – ChrisR
什么时候会访问'argc'和'argv'?在LD_PRELOAD阶段可能不可能。 –
程序修改'argv'中的数据也是完全合理的。我不确定在这种情况下堆栈会发生什么。 – paddy