Linux ptrace内存读取&流程管理

时间:2013-07-09 21:28:23

标签: linux ubuntu ptrace

我正在尝试在Linux上读取进程内存(准确地说是Xubuntu)。我对Linux很新,虽然我之前在Windows中使用Win32API ReadProcessMemory()完成了相同的读取操作。一般的想法是,我正在尝试为游戏开发一些软件,它将获取我的统计数据并将其上传到服务器,这将跟踪我的进度并记录它。最终目标是制作一个机器人,它将自动播放和播放有关游戏的数据。为此,我需要能够访问进程内存。在Windows中,这很容易。在Linux中,它证明有点复杂。

我找到了一个包含我想要阅读的信息的内存地址。信息是int32,它存储在84a1bd8。我发现它使用GameConqueror 0.13。重新启动后地址仍然正确,因此看起来没有ASLR(就像在Windows中一样)。我也知道ProcessID(我现在可以使用任务管理器找到它,但是如果有人知道通过ClassName,Exe名称或类似方法获取PID的简单方法,那也很棒!)所以,看起来像它应该是我真的需要使用PTRACE_PEEKDATA来读取内存,对吗?嗯,这就是问题所在,它似乎并不存在。我的代码如下所示:

#include <iostream>
#include <string>
#include <sys/ptrace.h>
#include <errno.h>

using namespace std;

int main()
{
    pid_t pid = 4847;
    int addr = 0x84a1bd8;
    long ret = ptrace(PTRACE_TRACEME, pid, NULL, NULL);
    cout << "ptrace Status: " << ret << endl;
    cout << "Errno: " << errno << endl;
    ret = ptrace(PTRACE_PEEKDATA, pid, (void*)addr, NULL);
    cout << "ptrace Status: " << ret << endl;
    cout << "Errno: " << errno << endl;
    ret = ptrace(PTRACE_DETACH, pid, NULL, NULL);
    cout << "ptrace Status: " << ret << endl;
    cout << "Errno: " << errno << endl;
    return 0;
}

输出如下:

ptrace Status: 0
Errno: 0
ptrace Status: -1
Errno: 3
ptrace Status: -1
Errno: 3

对Linux很新,我不知道我在哪里找到错误代码以及如何弄清楚这个错误实际意味着什么,而且我也不知道我是否正确地声明了地址。我应该将它声明为int的十进制等值吗?有什么我想念的吗?

感谢您的时间

1 个答案:

答案 0 :(得分:1)

找到解决方案,当使用ptrace()时,您必须按顺序调用:

ptrace(PTRACE_ATTACH, pid, NULL, NULL)
ptrace(PTRACE_PEEKDATA, pid, addr, NULL)
ptrace(PTRACE_DETACH, pid, NULL, NULL)

所以答案很简单:你需要在读取内存之前和之后进行附加和分离。

知道在attach和detach命令之间,进程会休眠,这也许是有用的,这意味着这个方法对我的目的不太好,但可能对其他人有用:)

感谢@PeterL。为了你的帮助。

相关问题