-2

そこで、私は Linux をいじることに戻り、ptrace に代わる優れた方法を見つけて、Windows で愛用していたものを置き換える独自の ReadProcessMemory 関数を作成しようとしています。/proc/XXXX/ ディレクトリ (XXXX はプロセス ID) の内容をいじろうとしています。

現在、基本的な GUI と UI に保持されているいくつかの特徴的な文字列を使用して、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

これらのライブラリが何であるかは完全にはわかりませんが、それらが OS のコア コンポーネントであると想定しており、Xfce フロントエンドを介して適切に統合できるように、物理アドレスを介してアクセスしています。

それで、ファイルの内容のリストはどこかにありますか?それとも、ファイルの内容を正確に頭のてっぺんから知っている人はいますか? または、探している値がメモリに保存されているのはどのファイルですか?

ptrace が気に入らない理由は、使用しようとしているゲームの UI とワーカーがフリーズするためです。私はかなり長い間回避策を考えてきましたが、まだ何かを実装しようと試みたことはありません。現在、大学の研究のために Linux を使用しなければならないので、ダウンタイムにもこれを試してみませんか? ?

4

2 に答える 2

1

Windows の ReadProcessMemory() は、メモリが読み取られているプロセスも停止すると思います。

ptrace() は一度に 4 バイトしか読み取れないという違いがあるため、ptrace() よりもターゲットプロセスからメモリを読み取る「邪魔にならない」方法はないと思います。

ただし、メモリに継続的にアクセスしたい場合 (たとえば、コンピューター ゲームの「ボット」)、次のようにします。

  • おそらく PTRACE_ATTACH を実行する必要があります
  • プロセスを停止する
  • ターゲット プロセスで ptrace を使用して open() および mmap() を呼び出す: 特別なアセンブラー コードを含むファイルをマップします。
  • ptrace を使用して、マップした特別なアセンブラー コードを実行する
  • プロセスのレジスタを復元し、通常の実行を継続します
  • PTRACE_ATTACH が必要な場合は PTRACE_DETACH

ファイル内のアセンブラー コードには、次のコードに相当するアセンブラーが含まれます。

  • コードもファイルにあるスレッドを作成します
  • スレッドは共有メモリ オブジェクトを作成し、この共有メモリ オブジェクトに書き込まれた「コマンド」を処理します。コマンドは基本的に memcpy() のリクエストです

これで、共有メモリ セクションを別のプロセスにマップし、memcpy() の要求を共有メモリ セクションに書き込むことができます。変更されたプロセスのスレッドは、関心のあるメモリの一部を共有メモリ セクションにコピーしたり、その逆を行ったりします。ターゲット プロセスの読み取り専用メモリの変更にも関心がある場合、スレッドは memcpy() に加えて mprotect() も実行できる必要があります。

ただし、注意してください。このようなプログラムはかなり複雑で、1 日で完了するわけではありません。

于 2013-10-06T15:05:43.737 に答える