Linux进程文件包含哪些内容?

时间:2013-10-05 18:37:24

标签: c++ linux qt memory memory-management

所以我回到玩弄Linux,试图找到一个很好的替代ptrace来创建我自己的ReadProcessMemory函数来取代我曾经喜欢的Windows。我正在尝试使用/ proc / XXXX /目录(XXXX作为进程ID)的内容进行操作。

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

任何人都可以建议每个文件包含哪些内容?目前我在map文件中,它似乎是一个句柄列表或对物理内存地址的引用......?这是一个片段:

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进行大学学习,所以为什么不在我的停机时间尝试这样做?

2 个答案:

答案 0 :(得分:3)

阅读proc(5)手册页,详细了解/proc/

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

/proc/$PID/maps描述了进程$PID虚拟内存空间。详细了解virtual memory。它与物理RAM没有直接关系。 (你不应该关心物理RAM,它是内核的业务)。

另请阅读Advanced Linux Programming

PS。我不认为你应该小心翼翼地阅读其他过程的记忆。存在同步问题。

答案 1 :(得分:1)

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

我不认为从目标进程读取内存的方式比“ptrace()更少”,而ptrace()只能一次读取4个字节。

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

  • 也许有必要做一个PTRACE_ATTACH
  • 停止流程
  • 使用ptrace在目标进程中调用open()和mmap():我将映射包含特殊汇编代码的文件
  • 使用ptrace运行我已映射的特殊汇编程序代码
  • 恢复流程的注册表并继续定期执行
  • 如果需要PTRACE_ATTACH,则为PTRACE_DETACH

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

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

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

但要注意:这样的程序相当复杂,一天都没有完成!