所以我回到玩弄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进行大学学习,所以为什么不在我的停机时间尝试这样做?
答案 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个字节。
但是,如果我想连续访问内存(例如计算机游戏中的“僵尸”),我会执行以下操作:
文件中的汇编代码将包含与以下代码等效的汇编程序:
现在,您可以在另一个进程中映射共享内存部分,并将memcpy()的请求写入共享内存部分。然后,修改过程中的线程将您感兴趣的内存块复制到共享内存部分,反之亦然。如果您还想修改目标进程的只读内存,那么除了memcpy()之外,线程还必须能够执行mprotect()。
但要注意:这样的程序相当复杂,一天都没有完成!