0

リバースエンジニアリングしようとしているこのプログラムがあります。それがコンパイラのオプティマイザなのか難読化なのかはわかりませんが、他の関数を呼び出すコードの一部は、数学によって計算され、次のように呼び出されます。

CALL EAX 

別のプログラムにDLLとしてロードされるまでは正しく動作します。ベースアドレスオフセットが変更されたため、すべての相対コードが正しく機能するようになりましたが、数学で計算されたすべての呼び出し/jmpが適切な領域に移動しません。

したがって、すべての絶対呼び出しを相対呼び出しにすることで、これを簡単に修正できると考えました。

コードをステップ実行し、すべての計算を計算させている間、正しいjmp/callオフセットを取得します。

パッチを割り当てるのに十分なスペースがないなどの問題はありません。絶対呼び出しは通常、前に私が物事を修正するためにも使用できる回線を使用しているので

絶対的な呼び出し、これは数学が終わるところです:

seg000:0044F7D1                 add     eax, 3B882683h
seg000:0044F7D6                 call    eax

のように変換されます

seg000:0044F7D1                 call     3B882683h

もちろん、eaxはすでに何かだったので、上記は機能しませんが、これは単なる擬似コードの例です。

私の質問はこれを行う方法ではありませんが、OllyDbgまたはIDA Proでこれを自動的に行うプラグインはありますか?

4

2 に答える 2

1

LoadLibrary を使用できます

KERNEL32.LoadLibraryA を使用する

KERNEL32.GetProcAddress

eaxに電話する

KERNEL32.FreeLibrary

また、ヘッダーをインポートすると、すべての関数アドレスが安定したアドレスに保存されます。関数のアドレスは変更されますが、関数のアドレスではなく、これらの安定したアドレスを常に呼び出します。

「pe explorer」などのプログラムでdll関数のアドレスを確認できます。 ここに画像の説明を入力

常に 00402008h を呼び出しますが、 00402008h は関数のアドレスではありません。00402008 の値は、関数のアドレスです。

  • FF25 08204000 は 00402008 の値を呼び出します
  • E8 05000000 は eip + 00000005 を呼び出します
于 2015-07-29T23:05:44.557 に答える
0

変数呼び出しの計算されたアドレスを取得したいのですが、これらは等しくないため、理解するのは非常に困難です。この部分でどのように説明したか

seg000:0044F7D1はeaxを追加し、3B882683h seg000:0044F7D6はeaxを呼び出します

そのようなプラグインを作成するのは本当に簡単ですが、それは決してそのようなものではありません。EAXはコードのその部分で変更される可能性があるため、呼び出しは「変数」です。想像してみてください。コードの一部がゲームなどのドアを制御します。EAXの通過が許可されていない場合、または他のレジスタが変更されて関数を呼び出して通過させない場合は、キーを持っているか、そのようなもので、コードはEAXを、呼び出しがドアを開くためのコードを実行するアドレスに変更します。変数を使用した呼び出しがあるため、これは単なる例です。あなたが考えるプラグインは、本当に巨大な塊になる可能性があり、バグや概要がない可能性のあるすべての呼び出しをリッスンする必要があります。

したがって、この呼び出しまで中断してレジスタを読み取るのが最も簡単な方法です。それがあなたの理解に役立つことを願っています、または私が正しい答えをしなかった、あなたがJMPと私を苛立たせるdllインジェクションについてのことを言ったのであなたの質問は少し誤解を招きます。プライベートメッセージまたはここで詳細を教えてください。

于 2011-10-09T19:29:36.413 に答える