プログラムでバイナリファイルの非常に小さな部分を置き換える適切な方法は何ですか?
-
25-09-2019 - |
質問
ゲームプレイバイナリの一部(QVMシステム)の一部をコンパイルするゲームコード(Ioqoake3プロジェクトから)があります。現在、この操作の以前に保存されていたバイナリをロードすることにより、潜在的にスピードアップできます(ファイルの変更予防措置が整っています)。
しかし、これらのバイナリに保存された機能へのポインターは、セッションを通じて永続的ではありません。
その場でそれらを変える適切な方法は何でしょうか? (メインアプリケーションで利用可能なアセンブラーとアセンブリがあると考えると)
解決
それは、実行可能ファイルのための通常のローダーがほとんどのことです。彼らは通常、ファイルのロードされた場所に基づいて変更する必要があるアドレスへの参照がある場所のテーブルを保存することで機能します。通常、それらはそれらの各場所に相対アドレスを保存するため、ファイルをロードするには、テーブルを見て、それらの各アドレスにあるものに基本負荷アドレスを追加し、その結果をメモリにロードするためにその結果を配置します。
他のヒント
関連する関数ポインターのテーブルをパラメーターとして渡します。または、生成コードを生成するコードに依存して、コードの場所と比較して固定されたデータ領域に依存することもできます。
私はこのようなものをいじっていたとき、私は読み取り/書き込み/実行ページをセットアップし、前半を生成コードに使用し、後半をデータに使用することを思い出します。コードが制御されると、次のようになります。
call l
l:
pop eax ; eax has the current eip
and eax, 0fffff000h ;round down to the page size, 4K AKA 0x1000
add eax, 800h ;now eax points at the data area
...等々。
大規模な生成コードの場合、それを完全に吹き飛ばされたDLLとして保存し、システムが提供する移転とアドレスの修正サービスを利用することをお勧めします。
所属していません StackOverflow