2016-11-22 195 views
0

如何調試這個反彙編代碼?我必須用C++語言重寫這個函數。但起初我必須明白它是如何工作的。調試反彙編代碼

有什麼辦法可以調試它嗎?

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

您可以:

A)使用具有像氣體一些彙編的權利部分的(指令助記符)(您的商家在& T語法,所以氣是自然的選擇)編譯它(它可能需要一些語法修復才能編譯,並正確設置代碼段和起點等)。好處是,如果你對某些東西感興趣(如果你知道程序集足夠好的話),你也可以包含你自己的幫助程序指令來修改代碼。

B)取字節代碼值的中間部分,並簡單地在hexa編輯器中寫入文件...然後加載到調試器到內存中以編碼代碼段,在開始處設置cs:eip並在那裏去。這種方法的優點是你不需要修正任何語法,六進制字節值是十六進制字節值。

這兩種方法都有一個巨大的缺陷,像call 8048520 <[email protected]>這樣的東西不會調用所需的代碼,因爲它不是您的列表的一部分,也不會使它在相同的物理地址開始,因爲該列表取自,所以你必須瞭解Assembly以充分理解如何調整該代碼中的任何全局指針值,並且刪除那些calls,而是通過在調試器中手動修改該點中的寄存器/內存來模擬它們的功能(因此您必須完全瞭解那些最初稱之爲的)。

但是通常當這些練習給出時,二進制文件是可用的,所以學生可以在調試器上自己運行它,所以我想知道爲什麼你只有這個列表(問題看起來甚至太早)。


C)明顯的選項是調試它在紙面上,它是如此之短,與指令的參考指南,你可以很容易地查找任何指令和寫筆記原線旁邊,你的想法是怎麼回事。

和A-hybrid)將它作爲C++代碼的一部分,因此您可以調用實際的atoirand函數。這些當然可能與原始代碼不同,因此當您沒有完整的原始代碼時,您仍然不清楚如何獲得與原始代碼完全相同的結果。

從彼得的評論: 編譯具有gcc一個.S(擴展彙編源文件大多使用GCC)會給你方便地訪問到真正的libc atoirand功能。 GNU as(gas)甚至不需要EXTERN聲明。

+1

因爲它使用AT&T語法,所以你可以更容易地用gas組裝它,即把它放在'.S'文件中,然後運行編輯跳轉目標回到符號標籤,比如'call atoi',你很好走 –

+1

@PeterCordes謝謝,我沒有真正讀過代碼,所以我錯過了它在AT&T的事實。:)(我寧願不看它:) :) – Ped7g

+0

哈哈,是的,我經常不花很多時間試圖實際閱讀許多低質量的問題的代碼。閱讀大多數初學者可怕的代碼並不是很有趣,這就是爲什麼我對那些沒有良好文本描述的問題以及他們在調試器中發現的問題進行壓縮的原因。在這種情況下,格式很顯然是'objdump'輸出,所以我馬上就認出了它。 –