【发布时间】:2013-07-09 21:28:22
【问题描述】:
我正在尝试在 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 吗?我有什么遗漏吗?
感谢您的宝贵时间
【问题讨论】:
-
查看 perror() 调用。另外,www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/…
-
谢谢 - 错误列表将永远有用。如果我的程序没有以权限运行,这可能是错误 3 的原因吗?由于它可能无法访问该进程...
-
@PeterL。我刚刚从终端输入“sudo ./ConsoleApplication”运行程序,它没有做任何不同的事情。 PID 作为一个整数值绝对是正确的,我有什么遗漏吗?肯定不可能这么简单!
-
您是如何确定 4847 为 PID 的?您可能需要修改 main() 以采用 args,其中之一是您希望监控的 PID。
-
@PeterL。我在任务管理器和 GameConquerer 中确定了它,两者都说明了我正在尝试监控的进程的 PID ......我知道它会改变,但现在我不介意手动输入它,至少在我能得到之前通过进程管理和内存读取的第一阶段。