経験豊富なWeb開発者ですが、初心者の "低レベル"プログラマーである私にとって、このようなものは一種のブードゥー教です。
メモリブロックを見つけてそれを読み取る方法(たとえば、鉱山のゲームでタイマーを読み取る方法)に興味があるのでしょうか。これはOS/OSバージョンによって異なりますか?
これはややトリッキーで複雑な質問ですが、これでかなり深く理解できます。しかし、物事を少し簡単にするために:
「鉱山のゲームでタイマーを読み取る」の例を考えてみましょう:
最初のステップは、メモリアドレスを見つけることです.これは通常、memory editor(デバッガーも行う場合があります)さまざまなメソッドを使用して、プロセスメモリ内の変数の場所を見つけることができます。一般的な方法は、ターゲットプロセスのメモリ空間で特定の値(たとえば、タイマーの値)を探し、次にターゲット値を変更して(たとえば、タイマーを進める)、もう一度一致を探します。このプロセスでは、正確な変数のみが残るまで、反復ごとに候補を絞り込みます。プロセスのメモリ空間内でその変数のアドレスを取得することは、メモリエディタでマウスをクリックするだけです。
2番目のステップは、特定のアドレスのデータを変更することです.これがどのように行われるかは、オペレーティングシステムによって異なります。 Windowsでは、WriteProcessMemory
という名前のWinAPI呼び出しがあり、これを使用して、定義済みのデータをターゲットプロセスのメモリ空間内の特定のアドレスに書き込むことができます。この例では、この関数を使用して、ターゲットプロセスのタイマー変数を独自の目的の値で上書きし、ゲームのタイマーを効果的に変更します。
実際には、ターゲットプロセスのプロセス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の用語は、そのトピックをさらに掘り下げるための「デバッグ」と「リバースエンジニアリング」です。
追加の読み物: