プロセスからメモリを読み取るにはどうすればよいですか?OSによって違いますか?


11

経験豊富なウェブ開発者であるが、初心者の「低レベル」プログラマーである私にとって、このようなことはまだ一種のブードゥー教です。

メモリブロックを見つけて、それを読み取ること(たとえば、鉱山のゲームでタイマーを読み取ること)を開始する方法に興味がありますか?これはOS / OSバージョンによって異なりますか?

回答:


14

これはややトリッキーで、さらには複雑な質問です。ある意味では、これを深く掘り下げることができます。しかし、物事を少し簡素化するには:

鉱山のゲームでタイマーを読む」という例を考えてみましょう。

最初のステップは、メモリアドレス見つけることです。これは通常、さまざまな方法を使用してプロセスメモリ内の変数の場所を見つけることができるメモリエディタと呼ばれるツール(デバッガも行う場合があります)で行われます。一般的な方法は、ターゲットプロセスのメモリ空間で特定の値(たとえば、タイマーの値)を探し、ターゲット値を変更(たとえば、タイマーを進める)して、再度一致を探すことです。このプロセスは、正確な変数のみが残るまで、反復ごとに候補を特定します。プロセスのメモリ空間内でその変数のアドレスを取得するのは、メモリエディタでマウスをクリックするだけです。

2番目のステップは、その特定のアドレスのデータ変更することです。これを行う方法は、オペレーティングシステムによって異なります。Windowsの、名前のWinAPIのコールがありますWriteProcessMemory対象プロセスのメモリ空間内の指定されたアドレスへの書き込みあらかじめ定義されたデータに使用することができます。この例では、この関数を使用して、ターゲットプロセスのタイマー変数を希望する値で上書きし、ゲームのタイマーを効果的に変更します。

実際には、ターゲットプロセスのプロセスIDを見つけてから、不正プロセスをターゲットプロセスにアタッチして、メモリスペースを変更する機能を取得する必要があります。これは非常に簡単な作業ですが、質問への回答には寄与しないため、読者への演習として省略しました。;)


プロセスが実行されるたびに変数の場所は同じになりますか?
ブルノック

1
@brunoqcいいえ、ほとんど確実ではありません。
ダン

2

OSによってまったく異なります。まったくできない場合もあります。また、ターゲットのメモリ空間のどこにデータが必要なのかを知る手段が必要です。

Linuxで実行する方法は次のとおりです:https : //unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux


どのOSがそれを許可しませんか?あなたが、少なくとも、LinuxとWindowsの下でそれを行うことができますようだ
エヴァ

@Evanすべてのオペレーティングシステム、デバッグ目的でリモートプロセスのメモリ変更許可する(セキュリティ上の理由により制限される)必要があります。ただし、たとえばセキュリティ上の理由による特権の不一致により、特権の高いプロセスのプロセスメモリの読み取り/書き込みができなくなる可能性があることに注意してください。これの良い例は、ゲストユーザー特権を持つプロセスに管理者権限を持つプロセスのメモリの読み取り/書き込みを許可しないことです。これは、システム全体を危険にさらし、ゲストユーザーが管理者特権を取得する直接的な方法になる可能性があるためですシステム。
zxcdw

1

アプリケーションには、OSによってさまざまなメモリが割り当てられます。一般に、アプリケーションはメモリを要求する必要がありますが、その機能は、言語のせいでプログラマーにあいまいになる場合があります。

Cなどの言語では、特定のサイズのブロック要求が許可されますが、C ++、C#、Javaなどの他の言語では、などのキーワードを使用した要求が許可されますnew。各言語にはメモリを割り当てるいくつかの方法があるため、これは簡単な概要です。メモリをOSに解放するには、明示的に行うか、ガベージコレクターを使用します。

アプリケーション内のメモリへのアクセスは、メモリの割り当て方法によって異なります。CとC ++は、ポインタの概念を使用してメモリの場所を示す/追跡することで最もよく知られています。それ以外の場合、メモリアクセスは作成されたクラスまたは変数を介して処理されます。

ほとんどの場合、プログラム内の特定のメモリアクセスについて心配する必要はありません。言語構造とOSは、その懸念を効果的に覆い隠します。

ゲーム内のタイマーの例は、基礎となるメモリ割り当てについて心配する必要がない場合の良い例です。タイマーを表す変数があり、変数から読み取るだけです。

私の答えは、あなたがアプリケーションを書いているときに関連していますが、zxcdwの答えは、別のアプリケーションに属するメモリにアクセスすることに関連しています。LMGTFYの用語は、「デバッグ」と「リバースエンジニアリング」であり、そのトピックをさらに掘り下げます。

追加の読書:

  • コンピュータメモリに関するウィキペディアの記事は、物事のまともな概要を提供します。
  • 次に、メモリマップドI / Oに関するWikipediaの記事を参照して、進行中の陰謀についてより深く理解してください。
  • 最後に、仮想メモリに関する記事を参照して、各OSが他とは少し異なる方法でメモリマッピングを処理する方法についてのより良い答えを取得してください。

はい、この場合、私は自分で書いていないアプリケーションからメモリを読み取ることに関心があります。15人の担当者がいるとすぐに投票します;)
エヴァ

@Evan-仮想メモリに関する記事を間違いなく読んでください。これにより、進行中のマッピングをよりよく理解できます。アプリを分解するには、マッピングを理解する必要があります。ほとんどのデバッガーでは、実行中のプロセスにアタッチして、アプリケーションの指示とメモリを確認できます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.