2016-11-22 8 views
0

どうすればこの逆アセンブルされたコードをデバッグできますか?この関数をC++言語に書き直す必要があります。しかし、最初はその仕組みを理解しなければなりません。逆アセンブルされたコードをデバッグ

これをデバッグする方法はありますか?

A)(それをコンパイルする(リスティングがAT & T構文であるため、ガスが自然な選択である)ガスのようないくつかのアセンブラで右(命令ニーモニック)にその一部を使用する:あなたがかもしれ

0804865a <generate_key>: 
804865a: 55      push %ebp 
804865b: 89 e5     mov %esp,%ebp 
804865d: 57      push %edi 
804865e: 56      push %esi 
804865f: 53      push %ebx 
8048660: 83 ec 18     sub $0x18,%esp 
8048663: 8b 7d 0c     mov 0xc(%ebp),%edi 
8048666: ff 75 08     pushl 0x8(%ebp) 
8048669: e8 b2 fe ff ff   call 8048520 <[email protected]> 
804866e: 83 c4 10     add $0x10,%esp 
8048671: 85 c0     test %eax,%eax 
8048673: 89 c3     mov %eax,%ebx 
8048675: 75 0f     jne 8048686 <generate_key+0x2c> 
8048677: e8 d4 fe ff ff   call 8048550 <[email protected]> 
804867c: b9 40 42 0f 00   mov $0xf4240,%ecx 
8048681: 99      cltd 
8048682: f7 f9     idiv %ecx 
8048684: 89 d3     mov %edx,%ebx 
8048686: 31 c9     xor %ecx,%ecx 
8048688: be 1b 00 00 00   mov $0x1b,%esi 
804868d: eb 13     jmp 80486a2 <generate_key+0x48> 
804868f: 8d 04 c9     lea (%ecx,%ecx,8),%eax 
8048692: 31 d2     xor %edx,%edx 
8048694: 01 d8     add %ebx,%eax 
8048696: f7 f6     div %esi 
8048698: 8a 82 18 9e 04 08  mov 0x8049e18(%edx),%al 
804869e: 88 04 0f     mov %al,(%edi,%ecx,1) 
80486a1: 41      inc %ecx 
80486a2: 3b 4d 10     cmp 0x10(%ebp),%ecx 
80486a5: 73 05     jae 80486ac <generate_key+0x52> 
+0

シンプルに、再構成してください。 – Jester

+0

Windowsプログラムはありますか? –

+3

これを行う最良の方法は、a)アセンブリ言語を学び、b)それをCまたはC++コードにリバースエンジニアリングすることです。明らかに、これはここでの質問には広すぎます。 –

答えて

1

いくつかの構文修正がコンパイル可能で、コードセグメントや開始点などを正しく設定する必要があります)。アドバンテージは、何かに興味があるならば、コードを修正するための独自のヘルパー命令を含めることができるということです。

B)バイトコード値の中間部分をとり、ファイルにhexaエディタで書き込んでから、デバッガにロードしてコードセグメントのメモリにロードします。先頭にcs:eipと設定します。この方法の利点は、構文を修正する必要がないことです.hexaバイトの値はhexaバイトの値です。

どちらのアプローチにも1つの巨大な落とし穴があります。call 8048520 <[email protected]>のようなものは、あなたのリストに含まれていないため、希望のコードを呼び出すことも、同じ物理アドレスから開始することもほとんどありません。もう一度、アセンブリ内でそのコード内のグローバルポインタ値を調整する方法を完全に理解する必要があります。また、callsを削除し、代わりにその場所のレジスタ/メモリをデバッガで手作業でシミュレートします(完全にそれらの呼び出しが元々何をしたかを理解する)。

通常、これらの演習が行われると、バイナリが利用できるので、学生は自分でデバッガで実行することができます。なぜこのリストだけを持っているのだろうと思います。


C)は、明白なオプションは、命令のリファレンスガイドと一緒にあなたが簡単にあなたが起こっていると思うものを、次の原稿ラインに任意の命令を検索し、メモを書くことができ、とても短いですが、紙の上にそれをデバッグすることです。

そしてA-ハイブリッド)をC++コードの一部として実行するので、実際のatoirand関数を呼び出すことができます。これらは当然元のものとは異なる可能性があります。元のコードをそのまま使用できない場合、元のコードとまったく同じ結果を得る方法はまだ不明です。

ピーターさんのコメントから: gcc.S(主にGCCが使用するアセンブリソースファイルの拡張子)をコンパイルすると、あなたに本当のlibc atoirand機能に簡単にアクセスできるようになります。 GNU as(ガス)でもEXTERN宣言は必要ありません。

+1

AT&Tの構文を使用しているので、ガスでアセンブルする方がずっと簡単です。 gccを実行してください。ジャンプターゲットを 'call atoi'のような記号ラベルに戻してください。 –

+1

@PeterCordesありがとうございました。コードを実際に読んでいないので、AT&T 。:)(私はとにかくそれを見ないことを好む:)) – Ped7g

+0

母、ええ、私はしばしば低品質のASMの質問の多くでコードを実際に読み取ろうと多くの時間を費やしていません。ほとんどの初心者の恐ろしいコードを読むのは楽しいことではありません。なぜなら、私は、問題の良いテキスト記述とデバッガで見つかったものを持っていない質問をdownvotingすることにかなり積極的です。この場合、書式設定は明らかに 'objdump'出力でしたので、すぐに認識しました。 –

関連する問題