2011-01-02 12 views
2

コードインジェクションの仕組みを理解するために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 MessageBoxWIATにおけるアドレス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"のままです。

だから私は、これらの「コードを更新する」手続きを編成するものがなければならないと思います。たぶんそれは再配置テーブルと何か関係があります、私は知らない。

私は別の質問としてこれを尋ねるべきでしょうか?

答えて

0

あなたの解決策:UTF-16である必要があり、追加

文字列。

文字列「こんにちは」の場合は、00hという「H.e.l.l.o」と書いてください。この文字列の末尾に少なくとも00h00h00h(3 X 0の) があることを確認してください。また、あなたが CALL DWORD PTR DS []のDWORD PTRとそれを呼び出すのMsgBox CALたときにことを確認してください:で[10010B8]

詳細:

LoadLibrary文字列の近くで(Unicodeではない)、文字列をUTF-16で追加します。つまり、00hで区切られた各ASCII文字と少なくとも00h00h(00hが表されます)

プログラムのエントリポイントには、おそらくこれがあります:

0123あなたのコードを注入( "winmine_" を書いていない)01004A5Fで

01003E21 JMP winmine_.01004A5F 
01003E26 NOP 
01003E27 NOP 
01003E28 CALL winmine_.0100400C 

01003E21 PUSH 70 
01003E23 PUSH winmine_.01001390 
01003E28 CALL winmine_.0100400C 

はPUSH 70行をダブルクリックしてJMP 01004A5Fと交換してください

01004A5F PUSH 0 
01004A61 PUSH winmine_.01004A5F 
01004A66 PUSH winmine_.01004A5F 
01004A6B PUSH 0 
01004A6D CALL DWORD PTR[010010B8] ;msgbox 

エントリポイントでジャンプを追加するときに削除した元のコードを追加し、通常のプログラム実行に戻ります。

01004A72 PUSH 70 
01004A74 PUSH winmine_.01001390 
01004A79 JMP winmine_.01003E28 

MessageBoxWのアドレスを検索するには、CTRL + Nキーを押して、登録された関数の順序付きリストを取得します。

は、文字列としては、それは次のようになります。

01004A58 UNICODE "Hello",0 

をお楽しみください。

オリジナルの投稿: あなたの文字列をexeに注入したら、OllyDbgで逆アセンブリウィンドウを右クリックし、検索 - >すべての参照テキスト文字列を入力してみてください。 あなたの文字列とそのアドレスを見つけることができるはずです。

は、ここでは、慎重に読んでください2件の記事です:あなたがあなた自身のメッセージとどのようにexeファイル内の既存の(未使用)の文字列を置き換えることができますどのように説明されているこの記事のパート2では

http://osix.net/modules/article/?id=633

カスタム関数で呼び出すことができます。この記事のパート2では

http://osix.net/modules/article/?id=758

テキストセクションと文字列とどのようにそれらを参照するためにについての説明があります。

これは、Windowsアプリケーションを復元するための多くの情報を提供するはずです。

窓のゲームを逆転させるのボーナスのチュートリアルとして

:私はあなたが最初AXとそのように斧

mov ax,OFFSET string1 ;or use LEA ax,string1 
push ax 

を押して、あなたを作成するためのアドレスを送信する必要があると思い http://osix.net/modules/article/?id=723(フリーセル)

+0

残念ながら、ここでも同じ問題があります。例えば、あなたが与えた最初の記事では、彼は "あなたがパスワードを見つけました"という文字列のポインタを渡すように "push 0100131C"を書いていました。今、0100131Cはその文字列の現在のアドレスです。だから、彼がollydbgからcalc.exeを起動すると、うまくいくでしょう。しかし、彼はexeに変更を保存し、再び外部に起動すると、クラッシュします。アドレス0100131Cは無関係のどこかを指摘するためです。彼がollydbgを閉じてそれを再起動してcalc.exeを再び開くと、彼は0100131Cというアドレスが "あなたはパスワードを見つけました"という文字列を指していないことを知ります。 – Yigit

+0

これは、exeが起動するたびに別のアドレスにロードされるためです。 exeファイル内のコードと文字列の相対的な距離は変更されませんが、実際のアドレスは変わりません。 – Yigit

+1

私は記事を書いた。プログラムはollydbgの外側でクラッシュせず、文字列はまったく同じ場所にあります。あなたはおそらく何かが明らかに欠けているでしょう。私は私のXP版の掃海艇でそれをやろうとしてくれるでしょう。 –

0

文字列のオフセットは、EXEに埋め込まれている場合は変更しないでください。それはリソースとしてロードされるのか、動的に割り当てられるのか、それとも何ですか?後者の場合は、動的に作成されたアドレスをプッシュする必要があります。しかし、静的な文字列は常に同じオフセットアドレスでロードする必要があります。

+0

はいオフセットは変更されず、実行可能ファイルの '.text'セクションに文字列があります。しかし、私はUltraEditまたはいくつかの他の16進エディタでexeを開いたと仮定し、私の文字列はアドレス0x000190DAで始まります。今私は引数を渡すための "プッシュ0x000190DA"を書く場合、実行可能ファイルがロードされると、それは私の文字列とは別の場所を指します。だから私の "MessageBoxW呼び出し"命令が "address2"にある場合、 "push address2 - 0x000190DA"または何を書き込むべきですか? – Yigit

+0

私は何が起こっているか完全にはわからない。私の理解は、あなたのアプリケーションがロードされるたびにアドレスのセグメント部分が異なるかもしれないが、アドレスのオフセット部分は同じでなければならないということです。したがって、EXEは毎回異なるアドレスにロードされますが、セグメントのみが異なる必要があります。私がassemberして以来、それはしばらくしているが、私は文字列アドレス(オフセット)が命令に組み込まれているので、変更できないことを知っている。おそらくあなたは何か他のことが起こっているでしょう。 –

0

あなたがする必要があるMessageBox:

mov ax,16   ;16 = Critical Icon (for example) 
push ax 
lea dx,title 
push dx 
lea dx,text 
push dx 
mov ax,0    ;0 is like NULL for the window's handle 
push ax 
call MesssageBox... 
+0

うまく動作しません。アドレスの下位ワードをスタックにプッシュします。代わりにeaxを押さえようとすると、eaxのハイ・ワードは何かなので、とにかく動作しません。それでもEIPの言葉を見つける必要があります。しかし、EIPは読むことができません。 – Yigit

関連する問題