2

我正在尝试在 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 吗?有什么我想念的吗?

谢谢你的时间

4

1 回答 1

2

发现解决方案是使用 ptrace() 时必须按顺序调用:

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

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

知道在附加和分离命令之间,进程将休眠也可能很有用,这意味着这种方法不适合我的目的,但可能对其他人有用:)

感谢@PeterL。您的帮助。

于 2013-07-09T22:21:09.700 回答