9

コンパイル済みのDLL内のコードを「編集」できるかどうか知りたい。

IEは、2つの数値を加算するsum(a,b)内部 と呼ばれる関数があると想像します。Math.dllab

DLLのソースコードを紛失したとしましょう。だから私が持っているのはバイナリDLLファイルだけです。そのバイナリファイルを開き、関数が存在する場所を見つけて、sum(a,b)ルーチンを、たとえば、(合計の代わりに)aとの乗算を返す別のルーチンに置き換える方法はありますか?b

要約すると、バイナリコードファイルを編集することは可能ですか?

おそらくollydbgのようなリバースエンジニアリングツールを使用していますか?

4

3 に答える 3

12

はい、それは間違いなく可能です(DLLが暗号で署名されていない限り)が、それは困難です。DLLのサイズによっては、多くのセクションを更新する必要がある場合がありますが、単純な16進エディターでそれを行うことができます。生のバイナリを読み取ろうとせず、逆アセンブラを介して実行します。

コンパイルされたバイナリの中には、たくさんの秘教的なバイトがあります。通常、「call」、「jmp」などの命令としてアセンブリで記述されるすべてのオペコードは、マシンアーキテクチャに依存する同等のバイトに変換されます。逆アセンブラを使用する場合、逆アセンブラはこれらのバイナリ値をアセンブリ命令に置き換えて、何が起こっているのかをはるかに理解しやすくします。

コンパイルされたバイナリの中には、ハードコードされた場所への参照もたくさんあります。たとえば、「call add()」が表示される代わりに、「call0xFFFFF」になります。ここでの値は通常、ファイル内の特定のオフセットにある命令への参照です。通常、これは呼び出される関数に属する最初の命令です。それ以外の場合は、スタックセットアップ/クリーンアップコードです。これはコンパイラによって異なります。

置き換える命令が元の命令とまったく同じサイズである限り、オフセットは正しいままであり、ファイルの残りの部分を更新する必要はありません。ただし、置き換える命令のサイズを変更する場合は、場所へのすべての参照を手動で更新する必要があります(これは本当に面倒です)。

ヒント:追加する命令が置き換えたものよりも小さい場合は、残りの部分にNOPを埋め込んで、場所が外れないようにすることができます。

それがお役に立てば幸いです、そして幸せなハッキング:-)

于 2013-02-25T21:11:00.987 に答える
3

Detours、x86マシンで任意のWin32関数をインストルメント化するためのライブラリ。Detoursは、ターゲット関数のイメージを書き換えることにより、Win32関数をインターセプトします。Detoursパッケージには、任意のDLLとデータセグメント(ペイロードと呼ばれる)を任意のWin32バイナリにアタッチするためのユーティリティも含まれています。 ダウンロード

于 2013-02-25T07:51:44.447 に答える
1

もちろん、DLLを心ゆくまで16進編集して、あらゆる種類の凝ったことを行うことができます。しかし、問題は、そもそも関数を置き換えることを意図しているのに、なぜそんなに面倒なことをするのかということです。

新しい関数を使用して新しいDLLを作成し、古いDLLの関数を呼び出すコードを変更して、新しいDLLの関数を呼び出します。

または、アプリケーションのソースコードも失いましたか?;)

于 2013-02-25T21:18:30.453 に答える