コードインジェクションの仕組みを理解するためにminesweeper.exeを変更しています。シンプルに、私は掃海艇が開始する前にメッセージボックスを表示するようにします。だから、私は実行可能ファイルに "洞穴"を見つけて、メッセージボックスに表示する文字列を定義し、メッセージボックスを呼び出します。もちろん、実行可能ファイルのモジュールエントリポイントで値を変更してから、最初に追加のコードに指示してから、独自のコードを続行する必要があります。 それで私が何をするのか、洞窟で。 文字列アドレスをアセンブリ、マシンコードでスタックにプッシュする方法
"hello starbuck",0
push 0 //arg4 of MessageBoxW function
push the address of my string //arg3, must be title
push the address of my string //arg2, must be the message
push 0 //arg1
call MessageBoxW
...
今すぐ実行可能な変更のたびにあるコードのメモリアドレスので、それはMessageBoxW関数を呼び出すために、私はMessageBoxWは、インポートアドレステーブルに定義されているアドレスのオフセット与え、メモリにロードされています。
MessageBoxW
がちょうど
call MessageBoxW
後
IATにおけるアドレス1と命令で定義されている場合たとえば、
アドレス2の代わりにcall MessageBoxW
書き込みの で、私は
call address2 - address1
を書きです。
私の質問は、スタックに文字列のアドレスをプッシュするためにはどうすればいいですか? たとえば、ollydbgを使ってこれらの変更を行うと、私はプッシュするために "hello starbuck"の直接アドレスを与え、それが動作します。しかし、実行可能ファイルを再ロードした後、またはollydbgの外で起動すると、即時アドレスが変更されるため、当然失敗します。
ありがとうございます。 Yigit。
編集:この問題は、exeが開かれるたびにモジュールエントリポイントの上位語が変更されるために発生します。だから、他の文字列がスタックにどのようにプッシュされているか見るために、私はこれをしました:
コード内に "Destroy Canvas"という文字列があります。それはアドレス:00403E44にあります。アドレス0042878Eには、命令PUSH 00403E44
(68 44 3E 40 00)があります。これは、文字列へのポインタがスタックにプッシュされていることを意味します。その後、私はUltraEditでexeを開いて、対応するアドレス00027D8Eを見つけました。そこには、 "68 44 3E 40 00"の代わりに、 "68 44 3E 00 01"と書き込まれます。これで、OllyDbgがexeを読み込むと、これらのコードが更新されます。 00 01〜40 00。私は他の弦を見て、そのプッシュ命令も同様です。だから、もし私がUltraEditで "68 DA 9A 00 00"の代わりに "68 DA 9A 00 01"を書いて文字列をプッシュすると、それも更新されるだろうと思った。しかし、それはしません。この後、OllyDbgでexeを開くと、プッシュされるアドレスは "01009ADA"のままです。
だから私は、これらの「コードを更新する」手続きを編成するものがなければならないと思います。たぶんそれは再配置テーブルと何か関係があります、私は知らない。
私は別の質問としてこれを尋ねるべきでしょうか?
残念ながら、ここでも同じ問題があります。例えば、あなたが与えた最初の記事では、彼は "あなたがパスワードを見つけました"という文字列のポインタを渡すように "push 0100131C"を書いていました。今、0100131Cはその文字列の現在のアドレスです。だから、彼がollydbgからcalc.exeを起動すると、うまくいくでしょう。しかし、彼はexeに変更を保存し、再び外部に起動すると、クラッシュします。アドレス0100131Cは無関係のどこかを指摘するためです。彼がollydbgを閉じてそれを再起動してcalc.exeを再び開くと、彼は0100131Cというアドレスが "あなたはパスワードを見つけました"という文字列を指していないことを知ります。 – Yigit
これは、exeが起動するたびに別のアドレスにロードされるためです。 exeファイル内のコードと文字列の相対的な距離は変更されませんが、実際のアドレスは変わりません。 – Yigit
私は記事を書いた。プログラムはollydbgの外側でクラッシュせず、文字列はまったく同じ場所にあります。あなたはおそらく何かが明らかに欠けているでしょう。私は私のXP版の掃海艇でそれをやろうとしてくれるでしょう。 –