2016-08-26 3 views
0

同じアセンブリコードポイントでクラッシュするゲームがあり、ソースコードがないため、exeファイルを直接編集して修正する唯一の方法です。逆アセンブルコードから直接exeバイナリを編集する

disassemblerによると、アドレス0x00629115では、ECXポインタが初期化されていないアドレスに0x0(おそらくCコードの初期化されていないポインタを使用しています)のチャンスが50%そのアドレスの前に、比較が成功した場合にクラッシュするコードをスキップするJGEコマンドがあります。

ここで私がやりたいことは、JECコマンドを0x00629106でJMPコマンドに変更して、常にクラッシュするコードをスキップすることです。

enter image description here

しかし、私は私がバイナリエディタで.exeファイルを開き、バイナリコード0x00629106のアドレスに行けば逆アセンブラに示されているものと同じではないことに気づきました。私はexeバイナリをどのように編集すべきかと思っています。

enter image description here

+0

いくつかの隣接バイトを検索し、それらがコード内で1回だけ見つかることを確認します。 – Dialecticus

答えて

2

実行可能コードが含まれていますが、ヘッダ、セグメントポインタ、...そうでもアドレスを持つに包まれたあなたのコードを見つけるために単独でこのアドレスを使用することはできませんオフセット。

位置に依存しないが認識可能な命令ストリングを見つけてそれを検索する必要があります(再配置が見つからない場合)。正しいものであることを確認してください。

位置に依存しないコードを探していることを確認してください。オフセット補正が失敗します。

パッチコードが元のコードよりも長い場合、これはより困難になります。利用可能なパッチのバイトサイズを維持するために、無駄な/未使用のコードやデータ、そこへのパッチ、およびそのゾーンへのbsrを見つけなければなりません。

もう最後の難しさ:いくつかのエディタは(開梱プログラムが正式に存在していませんが、this oneはかなり効率的であるため)または/およびそれが小さく、コードを「暗号化」するために実行可能パッカーを使用します。

トリックは:例えば、実行ファイルが7zipでうまく圧縮されない場合は、おそらく圧縮されています。いくつかの実行可能なデパッカーを使用して、実行可能なアンパック済みのexeを作成し、このバージョンを変更します(後で再パックする必要はありません)。

+0

16進エディタでコードを検索していただきありがとうございます。実際のアドレスは400000バイトの0x00229106であるようです...私は逆アセンブラが0x00629115に実際には実際のアドレスよりも大きいと考えている理由は分かりません;負の長さのヘッダー? – cr001

+1

またはこれはメモリ内の実際の物理アドレスです。セグメントをメモリに手動でロードしている場合や、システムローダからその情報にアクセスする場合を除き、それを信用することはできません。バイトを検索するだけです。 –

+1

@ cr001:ファイルの最初のバイトを打つ代わりに、フォールトへのNULLポインタ逆参照が必要なため、ファイルは仮想アドレス '0x00000000'のメモリにマップされません。コードのアドレスが与えられたときにWindows PEの実行可能ファイルで正しいオフセットを見つけることについてのSOの質問がありました。私はそれを見つけることができ、この質問を重複としてマークすることができます。 –

関連する問題