回答:
これはややトリッキーで、さらには複雑な質問です。ある意味では、これを深く掘り下げることができます。しかし、物事を少し簡素化するには:
「鉱山のゲームでタイマーを読む」という例を考えてみましょう。
最初のステップは、メモリアドレスを見つけることです。これは通常、さまざまな方法を使用してプロセスメモリ内の変数の場所を見つけることができるメモリエディタと呼ばれるツール(デバッガも行う場合があります)で行われます。一般的な方法は、ターゲットプロセスのメモリ空間で特定の値(たとえば、タイマーの値)を探し、ターゲット値を変更(たとえば、タイマーを進める)して、再度一致を探すことです。このプロセスは、正確な変数のみが残るまで、反復ごとに候補を特定します。プロセスのメモリ空間内でその変数のアドレスを取得するのは、メモリエディタでマウスをクリックするだけです。
2番目のステップは、その特定のアドレスのデータを変更することです。これを行う方法は、オペレーティングシステムによって異なります。Windowsの、名前のWinAPIのコールがありますWriteProcessMemory
対象プロセスのメモリ空間内の指定されたアドレスへの書き込みあらかじめ定義されたデータに使用することができます。この例では、この関数を使用して、ターゲットプロセスのタイマー変数を希望する値で上書きし、ゲームのタイマーを効果的に変更します。
実際には、ターゲットプロセスのプロセスIDを見つけてから、不正プロセスをターゲットプロセスにアタッチして、メモリスペースを変更する機能を取得する必要があります。これは非常に簡単な作業ですが、質問への回答には寄与しないため、読者への演習として省略しました。;)
OSによってまったく異なります。まったくできない場合もあります。また、ターゲットのメモリ空間のどこにデータが必要なのかを知る手段が必要です。
Linuxで実行する方法は次のとおりです:https : //unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux
アプリケーションには、OSによってさまざまなメモリが割り当てられます。一般に、アプリケーションはメモリを要求する必要がありますが、その機能は、言語のせいでプログラマーにあいまいになる場合があります。
Cなどの言語では、特定のサイズのブロック要求が許可されますが、C ++、C#、Javaなどの他の言語では、などのキーワードを使用した要求が許可されますnew
。各言語にはメモリを割り当てるいくつかの方法があるため、これは簡単な概要です。メモリをOSに解放するには、明示的に行うか、ガベージコレクターを使用します。
アプリケーション内のメモリへのアクセスは、メモリの割り当て方法によって異なります。CとC ++は、ポインタの概念を使用してメモリの場所を示す/追跡することで最もよく知られています。それ以外の場合、メモリアクセスは作成されたクラスまたは変数を介して処理されます。
ほとんどの場合、プログラム内の特定のメモリアクセスについて心配する必要はありません。言語構造とOSは、その懸念を効果的に覆い隠します。
ゲーム内のタイマーの例は、基礎となるメモリ割り当てについて心配する必要がない場合の良い例です。タイマーを表す変数があり、変数から読み取るだけです。
私の答えは、あなたがアプリケーションを書いているときに関連していますが、zxcdwの答えは、別のアプリケーションに属するメモリにアクセスすることに関連しています。LMGTFYの用語は、「デバッグ」と「リバースエンジニアリング」であり、そのトピックをさらに掘り下げます。
追加の読書: