2013-10-05 52 views
-2

所以我又回到Linux上玩,试图找到一个很好的替代ptrace来创建我自己的ReadProcessMemory函数来取代我以前喜欢的Windows。我试图做一些与/ proc/XXXX /目录(XXXX是进程ID)的内容玩弄。Linux进程文件包含什么内容?

目前我已经在Qt设计器中制作了一个应用程序,其中包含一个基本的图形用户界面和用户界面中包含的一些独特的字符串,所以希望当它发生在内存中时,它会非常明显。我在这个应用程序中存储的值都在本地声明的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来进行大学学习,所以为什么不在我的停机时间里尝试这样做呢? ?

+1

你的问题有点混乱。为什么你想要一个*替代*到'ptrace'?你为什么认为你的GUI字符串被保存在其中一个库的内存区域中? (libtxc是MESA纹理压缩,而nouveau是NVIDIA的驱动程序,你的字符串并不存在。) – us2012

+0

不明确的道歉。我会在这里回答,然后更新主帖。 我在寻找记忆,所以我可以有效地为游戏作弊,所以我需要了解游戏客户端的价值。在Windows ReadProcessMemory中完成这个工作。 – XtrmJosh

+0

使用ptrace的不幸副作用是它冻结了客户的身体和功能,这意味着任何成功的事情都会非常困难和密集。如果我可以直接访问进程内存(纯粹是为了从中读取数据),它应该完全消除这种烦恼,并减少我必须做的“ptrace”调用的数量(尽管它们会调用我自己的ReadProcessMemory) 。 – XtrmJosh

回答

3

阅读proc(5)手册页有关/proc/的详情。

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

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

也请参阅Advanced Linux Programming

PS。我不认为你应该尝试阅读一些其他进程的记忆而不用担心。有同步问题。

+0

出于对虚拟地址空间的兴趣,你是指它在物理内存中的位置?这看起来像只是诀窍,虽然...谢谢 你刚刚问我之前回答了这个问题,我会做一些研究,以保存你会我猜的时间! – XtrmJosh

+0

我并不太在意物理内存,所以出于某种原因,我只是对它有兴趣。我一直有点好奇,想知道接下来会发生什么! – XtrmJosh

1

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

我不认为从ptrace()读取目标进程的内存的方式不同于ptrace()只能同时读取4个字节。

但是,如果我想连续访问内存(例如,在电脑游戏中的“机器人”),我会做到以下几点:

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

文件中的汇编代码将包含装配相当于以下代码:

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

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

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

+0

你已经列出了一个非常有趣的技术。我相信这被称为注入机器人社区,这是我在Windows上探索过的一些东西。我很可能会尽快对它进行一些研究,谢谢你的建议和对概念的解释:) – XtrmJosh