-2

所以我又开始玩 Linux,试图找到一个好的替代 ptrace 的方法来创建我自己的 ReadProcessMemory 函数来替换我曾经在 Windows 上喜欢的那个。我正在尝试玩弄 /proc/XXXX/ 目录的内容(XXXX 是进程 ID)。

目前我已经在 Qt 设计器中创建了一个应用程序,其中包含一个基本的 GUI 和一些在 UI 中保存的独特字符串,因此希望当/如果我碰巧在内存中找到它们时它会非常明显。我在此应用程序中存储的值都在本地声明的 std::string 变量中,以及传递给 UI 以进行显示。

谁能建议每个文件包含什么?目前我在地图文件中,它似乎是一个句柄列表或对物理内存地址的引用......?这是一个片段:

7fffe137a000-7fffe137b000 r--p 00031000 08:01 4463612                    /usr/lib/x86_64-linux-gnu/libtxc_dxtn_s2tc.so.0.0.0
7fffe137b000-7fffe137c000 rw-p 00032000 08:01 4463612                    /usr/lib/x86_64-linux-gnu/libtxc_dxtn_s2tc.so.0.0.0
7fffe137c000-7fffe1381000 r-xp 00000000 08:01 4462728                    /usr/lib/x86_64-linux-gnu/libdrm_nouveau.so.2.0.0
7fffe1381000-7fffe1580000 ---p 00005000 08:01 4462728                    /usr/lib/x86_64-linux-gnu/libdrm_nouveau.so.2.0.0

不完全确定这些库是什么,但我假设它们是操作系统的核心组件,并且我通过它们的物理地址访问它们,以便我可以通过 Xfce 前端正确集成。

那么,某处是否有文件内容列表?或者是否有人碰巧知道文件中的确切内容?或者更好的是,哪个文件包含我正在寻找的值,存储在内存中?

我不喜欢 ptrace 的原因是它冻结了我正在尝试使用的游戏的 UI 和工作人员。我已经考虑了很长一段时间的解决方法,只是还没有尝试实现任何东西,而且目前我不得不在大学学习中使用 Linux,所以为什么不在我的空闲时间也尝试这样做?

4

2 回答 2

3

阅读proc(5)手册页了解有关/proc/.

下面的文件(例如/proc/$PID/maps/proc/通常是伪文件(有点像“管道”),其大小明显为 0,只能按顺序读取。它们不是磁盘文件,它们的内容是由内核合成的。所以阅读它们很快。

/proc/$PID/maps描述进程的虚拟内存空间$PID。阅读有关虚拟内存的更多信息。它与物理 RAM 没有直接关系。(您不应该关心物理 RAM,这是内核的业务)。

另请阅读高级 Linux 编程

PS。我认为您应该尝试不小心读取其他进程的内存。存在同步问题。

于 2013-10-05T18:48:44.783 回答
1

我认为 Windows 下的 ReadProcessMemory() 也会停止正在读取内存的进程。

我认为没有比 ptrace() 从目标进程读取内存的“侵入性更小”的方式,不同之处在于 ptrace() 一次只能读取 4 个字节。

但是,如果我想连续访问内存(例如计算机游戏中的“机器人”),我会执行以下操作:

  • 也许有必要做一个 PTRACE_ATTACH
  • 停止进程
  • 在目标进程中使用 ptrace 调用 open() 和 mmap():我会映射一个包含特殊汇编代码的文件
  • 使用 ptrace 运行我映射的特殊汇编代码
  • 恢复进程的寄存器并继续正常执行
  • PTRACE_DETACH 如果需要 PTRACE_ATTACH

文件中的汇编代码将包含与以下代码等效的汇编代码:

  • 创建一个线程,其代码也位于文件中
  • 该线程将创建一个共享内存对象并处理写入该共享内存对象的“命令”;这些命令基本上是对 memcpy() 的请求

现在您可以将共享内存部分映射到另一个进程中,并将 memcpy() 的请求写入共享内存部分。然后,修改后的进程中的线程会将您感兴趣的内存块复制到共享内存部分,反之亦然。如果您还对修改目标进程的只读内存感兴趣,那么除了 memcpy() 之外,线程还必须能够执行 mprotect()。

但请注意:这样的程序相当复杂,不是一天就能完成的!

于 2013-10-06T15:05:43.737 回答