从库中查找argc和argv

B-M*_*-MO 4 c c++ linux pointers argv

如何找到一个程序argc,并argv从一个共享对象?我正在用C语言编写一个将要加载的库LD_PRELOAD.我已经能够以两种不同的方式找到堆栈:

  1. rsp通过内联__asm__电话阅读.
  2. 读取/proc/<pid>/maps并解析堆栈条目.

然后我可以创建一个指针,将其指向堆栈段,然后迭代查找数据.问题是我无法找出一种有效的方法来确定字节是什么argc以及指向argv字符串指针的指针.

我知道它/proc/<pid>/cmdline也包含参数,每个参数都被分隔0x00,但我有兴趣在内存中找到所有内容.

在gdb中,我看到一个DWORDfor argc后跟一个QWORD是第一个指针.地址前20个字节argc是指向主程序代码段的指针.但是,这不是一个确定的方式来识别argcargv.

我看过几篇帖子但没有工作代码:

ric*_*ici 13

第二个链接中的响应包含工作源代码,对我来说很好(基于Gnu/Linux elf的系统),包括在期间LD_PRELOAD.

代码很短; 它由一个功能组成:

int foo(int argc, char **argv, char **env) {
   // Do something with argc, argv (and env, if desired)
}
Run Code Online (Sandbox Code Playgroud)

以及该.init_array部分中指向该函数的指针:

__attribute__((section(".init_array"))) static void *foo_constructor = &foo;
Run Code Online (Sandbox Code Playgroud)

将它放入共享库然后LD_PRELOADing共享库肯定会触发foo我在尝试它时的调用,并且它显然被调用,argc并且argv稍后将传递给它main(以及值environ).