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 にまったく慣れていないので、エラー コードがどこにあるのか、このエラーが実際に何を意味するのかを理解する方法がわかりません。また、アドレスを正しく宣言しているかどうかもわかりません。10 進数に相当する int として宣言する必要がありますか? 足りないものはありますか?

御時間ありがとうございます

4

1 に答える 1