如何从共享库中找到程序的argc
和argv
?我正在用C编写一个库,该库将通过LD_PRELOAD
加载。我已经能够通过两种不同的方式找到堆栈:
rsp
调用读取__asm__
。>>/proc/<pid>/maps
并解析该条目以进行堆栈。然后,我可以创建一个指针,将其指向堆栈段,然后遍历寻找数据。问题是我无法找出确定argc
字节和argv
字符串指针的有效方法。
我知道/proc/<pid>/cmdline
也包含参数,每个参数都用0x00
分隔,但是我有兴趣在内存中查找所有内容。
在gdb中,我看到DWORD
的argc
,后跟第一个指针QWORD
。 argc
地址前的20个字节是指向主程序代码段的指针。但这不是确定argc
和argv
的确定性方法。
我看过几篇文章,但没有可用的代码:
如何从共享库中找到程序的argc和argv?我正在用C编写一个库,它将通过LD_PRELOAD加载。我已经能够找到两种不同的堆栈:通过...
第二个链接中的[This response包含对我来说很好的工作源代码(基于Gnu / Linux elf的系统),包括在LD_PRELOAD
期间。
最可靠的方法可能是使用/proc/<pid>/cmdline
,因为它是由内核提供的,并且不会根据C的实现而改变(例如,它取决于您使用的处理器)。
如果您只知道堆栈的位置,没有找到argc / argv的好方法。幸运的是,envp
直接在堆栈上的argv
之后,我所知道的每个libc都将envp
放在全局的__environ
中。因此,通过从__environ
返回,您可以找到argc和argv。这是一些用Rust编写的示例代码,应该很容易移植到C ++: