【发布时间】:2016-01-21 05:14:54
【问题描述】:
如何从共享对象中找到程序的argc 和argv?我正在用 C 语言编写一个库,它将通过 LD_PRELOAD 加载。我已经能够以两种不同的方式找到堆栈:
- 通过内联
__asm__调用读取rsp。 - 读取
/proc/<pid>/maps并解析堆栈条目。
然后我可以创建一个指针,将它指向堆栈段,然后遍历查找数据。问题是我无法找到一种有效的方法来确定哪些字节是argc 以及指向argv 字符串的指针的指针。
我知道/proc/<pid>/cmdline 也包含参数,每个参数由0x00 分隔,但我有兴趣在内存中查找所有内容。
在 gdb 中,我看到 DWORD 代表 argc,然后是 QWORD,这是第一个指针。 argc 地址前 20 个字节是一个指向主程序代码段的指针。但这不是识别argc 和argv 的确定方法。
我看过一些帖子,但没有工作代码:
【问题讨论】:
-
似乎有点古怪,取决于编译器如何使用堆栈。一旦有人找到编译器/运行时优化,这很可能会改变。应用程序可能还希望以不同的方式使用相同的 args,如果您的 lib 尝试解释未针对它的参数,这可能会导致问题。您不能在“构造函数”调用中将这些直接传递给您的库吗?是的,我知道您想要做的是避免这种开销。
-
什么时候可以访问
argc和argv?在LD_PRELOAD阶段可能是不可能的。 -
程序修改
argv中的数据也是完全合法的。我不确定在这种情况下堆栈会发生什么。 -
@ChrisR:到底是什么开销?调用初始化程序?
-
@rici - 是的,编程开销,我应该明确表示。代码实际上可能运行得更快。