从库中找到argc和argv

问题描述 投票:4回答:3

如何从共享库中找到程序的argcargv?我正在用C编写一个库,该库将通过LD_PRELOAD加载。我已经能够通过两种不同的方式找到堆栈:

  1. 通过内联rsp调用读取__asm__。>>
  2. 读取/proc/<pid>/maps并解析该条目以进行堆栈。
  3. 然后,我可以创建一个指针,将其指向堆栈段,然后遍历寻找数据。问题是我无法找出确定argc字节和argv字符串指针的有效方法。

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

在gdb中,我看到DWORDargc,后跟第一个指针QWORDargc地址前的20个字节是指向主程序代码段的指针。但这不是确定argcargv的确定性方法。

我看过几篇文章,但没有可用的代码:

如何从共享库中找到程序的argc和argv?我正在用C编写一个库,它将通过LD_PRELOAD加载。我已经能够找到两种不同的堆栈:通过...

c++ c linux pointers argv
3个回答
13
投票

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


0
投票

最可靠的方法可能是使用/proc/<pid>/cmdline,因为它是由内核提供的,并且不会根据C的实现而改变(例如,它取决于您使用的处理器)。


0
投票
这是一个坏主意,但我还没有天真地说你没有正当的理由。

如果您只知道堆栈的位置,没有找到argc / argv的好方法。幸运的是,envp直接在堆栈上的argv之后,我所知道的每个libc都将envp放在全局的__environ中。因此,通过从__environ返回,您可以找到argc和argv。这是一些用Rust编写的示例代码,应该很容易移植到C ++:

© www.soinside.com 2019 - 2024. All rights reserved.