2013-02-25 7 views
5

既にコンパイルされたDLL内のコードを "編集"できるかどうかを知りたいと思います。コンパイルされたDLLの関数を変更する方法

I.E. a

bはのは、私は私のDLLのソースコードを失ってしまったとしましょう2つの数値を追加しMath.dllsum(a,b)と呼ばれる機能があることを想像してみてください。だから私が持っているのはバイナリDLLファイルだけです。 私はそのバイナリファイルを開いて、私の関数のある場所を探してと(合計ではなく)bの乗算を返す別のルーチンなど、sum(a,b)ルーチンを置き換える方法はありますか?

要約すると、バイナリコードファイルを編集できますか?

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

+0

オンディスクよりもメモリ内の方がはるかに簡単です。 [AuthentiCode](http://msdn.microsoft.com/en-us/library/ms537359(v = vs.85).aspx)やオンデマンド認証を確実にするその他の妥当性検証と似ていないことを願っています。適度にインテリジェントなローダーが負荷のためにPEイメージを準備しているときに、ディスクイメージが改ざんされていない可能性があります。 – WhozCraig

+0

関数がdllでエクスポートされた場合、dllをラップするだけではどうですか? –

+0

私はDLL内のエクスポートされた関数について話しているだけではありません。合計(a、b)がDllの内部で使用されるプライベート関数の場合はどうなりますか?輸出されたものを公的に使用するものではありません。このルーチンを見つけて変更するのは可能でしょうか? – Herno

答えて

7

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

コンパイルされたバイナリの中には、一連の難解なバイトが表示されます。通常、 "call"、 "jmp"などの命令としてアセンブリーで記述されるすべてのオペコードは、マシン・アーキテクチャーに応じたバイトに変換されます。逆アセンブラを使用すると、逆アセンブラはこれらのバイナリ値をアセンブリ命令に置き換えて、何が起こっているのかを理解するのがはるかに簡単になります。

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

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

ヒント:追加する指示が小文字のの場合は、置き換えたものよりも残りの部分をNOPで埋めて、場所が落ちないようにすることができます。

助け、そして幸せなハッキング希望あなたは、もちろん、あなたの心のコンテンツへのDLLを六角編集し、派手なもののすべてのソートを行うことができます:-)

+0

ありがとう!あなたの答えはとても有用で有益でした!私は、オフセットについて考えていないし、直接私のdllにパッチを当てることに関係する変更を扱う。 – Herno

2

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

1

。しかし、あなたの意図が最初に機能を置き換えることになっているなら、問題はなぜそのすべての問題に行くのですか?

新しい機能を備えた新しいDLLを作成し、古いDLLで 呼び出し機能が新しいDLL内の関数を呼び出すようにするコードを変更します。

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

+0

実際には良い解決策のように聞こえます:) – ppumkin

関連する問題