gpt4 book ai didi

Linux 上的 C++ GetModuleBase

转载 作者:太空狗 更新时间:2023-10-29 12:31:43 39 4
gpt4 key购买 nike

所以最近我在尝试使用一个进程,从进程读取内存/向进程写入内存。
我已经为 ptrace 编写了一个小包装类,目前正在使用它。

但是该进程使用多个共享对象,我需要它们的偏移量来计算地址。

假设在我的进程的 windows 版本上,地址是 base.dll+0xFF00,所以在 linux 上我期望它是 base.so+0xFF00,我找到了一个很好的 Cheat Engine 替代品,叫做 scanmem,结合了 gameconqueror。

但是,我无法获得 base.so 的基地址,所以我找到了 this适用于 Windows 系统的代码,但不适用于 Linux 系统。

所以这就是我要找的东西:根据名称获取进程内模块基地址的函数,例如:getModuleBase(pid,"base.so");

这有可能吗,还是我正在研究一些根本行不通的东西?

提前致谢!

最佳答案

在 Linux 上,您可以使用 linux 特定的(实际上是 GNU libc 特定的)dladdr(3)函数,假设您知道其中某个函数符号的地址。

否则,您可以顺序读取并从程序内部解析/proc/self/maps文件(或/proc/1234/maps 为 pid 1234 的进程)。 proc(5)是 Linux 特定的,读取 /proc/ 中的文件很快(不涉及磁盘 IO,因为 /proc/ 是在内核内部实现的,没有物理 I/O)。在终端中尝试

cat /proc/self/maps

它将显示执行该 cat 命令的进程的内存映射

我不确定动态加载 (dlopen-ed) 插件的定义明确且唯一的基地址 的想法是否有意义。共享对象 ELF 文件(即 plugin.so 文件)通常有几个段。参见 this answer (并考虑 ASLR ...)

关于Linux 上的 C++ GetModuleBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24837674/

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