gpt4 book ai didi

linux - 如何在 Linux 上检测/proc/self/maps 中的可执行文件或共享对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:19 27 4
gpt4 key购买 nike

我想列出加载到应用程序地址空间中的所有库 (.so)。我使用 procfs 并从/proc/self/maps 读取信息。我有现有的方法来检测文件是可执行文件还是 .so?或者我需要将每个找到的模块名称与/proc/self/exe 的值进行比较?

UPD 还有一些问题。

当我解析/proc/self/maps procfs 文件时,我想为每个找到的已加载 .so 模块找到基地址,但我可以找到无需 dl* 函数调用的方法。

我尝试使用 dladdr:

    Dl_info info;
int dladdrRes = dladdr((void*)(mmIt->startAddr), &info);
if (!dladdrRes) continue;

std::string modName = info.dli_fname;
void *modBase = info.dli_fbase;

但 modBase 不是 'dlopen' 函数返回的地址。只有调用“dlopen”函数的方法有效:

dlopen( filename.c_str(), RTLD_NOW|RTLD_NOLOAD|RTLD_LOCAL );

我的想法是:当我解析/proc/self/maps 时,我知道所有加载模块的名称,并且我不需要调用内核来查找加载模块的基。正如我所发现的,这是我的错误。

最佳答案

/proc/self/maps 的输出是

address           perms offset  dev   inode       pathname

可执行文件设置了 x 权限位。默认情况下,有一些映射可执行但在磁盘上没有文件(例如 vdso)。因此,您所要做的就是提取那些设置了 x 权限位的 maps 条目并且在磁盘上有一个匹配的文件。

请注意,可执行映射并不是必须采用特定文件格式。例如,wine 将 Windows 可执行文件(它们是 PE 文件;甚至可能没有在文件系统上设置可执行位)映射到可执行权限位,以便可以执行其中的代码。因此,通常最好只查看 /proc/self/maps 而不要尝试从存储文件中推断出任何内容。

关于linux - 如何在 Linux 上检测/proc/self/maps 中的可执行文件或共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com