IDA Pro:Windows或Linux反編譯器和調(diào)試器
IDA Pro Advanced是目前最棒的一個靜態(tài)反編譯軟件,是破解者不可缺少的利器!巨酷的反編譯軟件,破解高手們幾乎都喜歡用這個軟件。
下載鏈接:http://down.51cto.com/data/149279
>>去網(wǎng)絡(luò)安全工具百寶箱看看其它安全工具
I 介紹
幾天前我烈軍屬了一篇關(guān)于解密程序的教程,而這篇也是一個對于高效的,極好的IDA Pro 4.0x教程。通常菜鳥不喜歡,而高手又崇拜它。不喜歡的原因是因為IDA相對于w32dasm來說有更多的附加功能和作用,有更大的復(fù)雜性
在下面的教程中由于你過去可能喜歡使用w32dasm,我將盡力給出一個簡單和清楚的解釋來介紹如何使用IDA。也將試差回答"什么是最好的反匯編?"這里其實沒有一個簡單的回答。對于更多的高手來說可以讀這個:向菜鳥100%解釋IDA的使用過程。
II. IDA: 一個高效的反匯編工具
當(dāng)你運行IDA Pro時,你所最先注意到的是它的界面比w32dasm更加專業(yè),這里比w32dasm有更多的選項或更先進的地方。它的優(yōu)點是可以更好的反匯編和更有深層分析。而缺點是使用IDA更困難。
實際上IDA同w32dasm有很多相同的功能:可以快速到達指定的代碼位置;可以看到跳到指定的位置的jmp的命令位置;可以看參考字符串;可以保存靜態(tài)匯編等。
現(xiàn)在讓我們運行和反匯編一個小程序(我使用starclean.exe)一個窗口彈出來,那里有很多選項,不要動它,僅僅點擊OK。讓IDA來分析,當(dāng)它結(jié)束后在name的選項中同w32dasm中參考字符串一樣,查找"a"字符。在name窗口中搜索欄中按a,然后開始查找,一旦找到,按enter或雙擊它,它就將到達正確的位置。按ctrl+enter將到達下一個位置。參考字符串就在光標(biāo)附近。IDA就可以到達相應(yīng)的位置了。
另一個同w32dasm相同的:jmp和call參考在IDA也是有效的。在w32dasm反匯編的代碼同IDA中相同的。
代碼開始(w32dasm)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403B50(C)
|
:00403B5F 81FAFC000000 cmp edx, 000000FC
:00403B65 0F8478010000 je 00403CE3
:00403B6B 8D8424B4000000 lea eax, dword ptr [esp+000000B4]
:00403B72 6804010000 push 00000104
:00403B77 50 push eax
* Reference To: KERNEL32.GetModuleFileNameA, Ord:00E9h
|
:00403B78 8B2D88924000 mov ebp, dword ptr [00409288]
:00403B7E 6A00 push 00000000
:00403B80 FFD5 call ebp
:00403B82 85C0 test eax, eax
:00403B84 7516 jne 00403B9C
* Possible StringData Ref from Data Obj ->"
"
|
:00403B86 BE206A4000 mov esi, 00406A20
:00403B8B 8DBC24B4000000 lea edi, dword ptr [esp+000000B4]
:00403B92 B905000000 mov ecx, 00000005
:00403B97 F3 repz
:00403B98 A5 movsd
:00403B99 66A5 movsw
:00403B9B A4 movsb結(jié)束結(jié)束
#p#
代碼開始(IDA Pro 4.0x)
00403B5F loc_403B5F:; CODE XREF: sub_403B00+50j
00403B5F cmp edx, 0FCh
00403B65 jz loc_403CE3
00403B6B lea eax, [esp+1B8h+var_104]
00403B72 push 104h
00403B77 push eax
00403B78 mov ebp, ds:GetModuleFileNameA
00403B7E push 0
00403B80 call ebp ; GetModuleFileNameA
00403B82 test eax, eax
00403B84 jnz short loc_403B9C
00403B86 mov esi, offset aProgramNameUnk ; "
"
00403B8B lea edi, [esp+1B8h+var_104]
00403B92 mov ecx, 5
00403B97 repe movsd
00403B99 movsw
00403B9B movsb
代碼結(jié)束
你在這里看到,IDA提供了更多的細節(jié)信息,它是更加清楚,用一個參考作為例子。 在w32dasm中如下:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403B50(C)
在IDA Pro中如下:
CODE XREF: sub_403B00+50j
IDA provides 使用更短的行來提供更多的信息。
1. 用一個jump (j)
2. jump到代碼的位置位于00403B50 (=403B00+50)
3. 函數(shù)/call本身在403B00(403B00+50)
4. jump在.code section
如果參考的是一個call那么它將如下:
CODE XREF: sub_403B00+50p
另一個大的優(yōu)點是IDA可以轉(zhuǎn)換變量。你可以雙擊變量以找到它們保存的地址處: lea edi, [esp+1B8h+var_104]。
功能中最有用的之一是使用近似查找。很容易解釋:IDA盡力記住寄存器所關(guān)聯(lián)的庫函數(shù)。如下:
代碼開始 (IDA Pro)
004012D2 loc_4012D2:; CODE XREF: sub_401280+5Fj
004012D2 movsx ecx, byte ptr [eax]
004012D5 push eax
004012D6 lea ebp, [ebp+ecx*2+0]
004012DA call edi ; CharNextA; Return a pointer to the next character in a
; string
004012DC cmp byte ptr [eax], 0
004012DF jnz short loc_4012D2
代碼結(jié)束
#p#
代碼開始 (w32dasm)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004012DF(C)
|
:004012D2 0FBE08 movsx ecx, byte ptr [eax]
:004012D5 50 push eax
:004012D6 8D6C4D00 lea ebp, dword ptr [ebp+2*ecx]
:004012DA FFD7 call edi
:004012DC 803800 cmp byte ptr [eax], 00
:004012DF 75F1 jne 004012D2代碼結(jié)束
你注意到它們的不同了嗎?IDA將向解釋每一件事情。
在IDA中另一個同w32dasm近似的是十分簡單的,如:"Goto code location" 等同于在IDA"Jump - Jump to adress" . 或者 "Goto entrypoint" 等同于在IDA"Jump - Jump to entry point" .
那些就是在你了解IDA開始使用它前最為重要的東西。有時 ,IDA顯示大量的"db",參考字符串,僅有代碼。僅僅可以設(shè)好光標(biāo),按"c"鍵,IDA轉(zhuǎn)換代碼如下
開始 (在按'C'之前)
00401228 dd offset unk_406130
0040122C db 8Bh ; ?0040122D db 35h ; 5
0040122E dd offset RegSetValueExA
00401232 db 6Ah ; j
00401233 db 1 ;
00401234 db 6Ah ; j
00401235 db 0 ;
00401236 db 68h ; h
00401237 dd offset aName ; "Name"
0040123B db 51h ; Q
0040123C db 0FFh ;
0040123D db 0D6h ; ?0040123Edb 8Bh ; ?0040123F db 4Ch ; L
00401240 db 24h ; $
00401241 db 8 ;
00401242 db 68h ; h
代碼結(jié)束
開始 (在按'C'之前)
0040122C mov esi, ds:RegSetValueExA
00401232 ; ---------------------------------------------------------
00401232 push 1
00401234 push 0
00401236 push offset aName ; "Name"
0040123B ; ------------------------------------------------------
0040123B push ecx
0040123C call esi ; RegSetValueExA
0040123E mov ecx, [esp+8]
00401242 push 100h
00401247 push offset unk_406030
0040124C ; -------------------------------------------------------
0040124C push 1
0040124E push 0
00401250 push offset aCode ; "Code"
00401255 ; --------------------------------------------------
00401255 push ecx
00401256 call esi ; RegSetValueExA
00401258 mov eax, [esp+8]
0040125C push eax
0040125D call ds:RegCloseKey
代碼結(jié)束
#p#
IDA另一個優(yōu)點(快速相加):
1. 能夠?qū)32dasm無法反匯編的最難的軟件進行反匯編(如加殼程序)
2. 能夠以.asm .sym 和甚至是 .exe及其它文件形式保存
3. 壓縮的靜態(tài)匯編,可以節(jié)省大量的磁盤空間。
4. 可以重命名函數(shù)
5. 能夠分析巨大的程序
III. w32dasm??
你看完了后你現(xiàn)在可以自問"如果IDA這么好看,為什么我還要使用w32dasm?"下面就是對于這個的解釋:
首先是速度,對于IDA來分析一個小程序是非常非常的快,但是如果分析一個大的exe它就要花費3個小時或更多的時間來全面分析exe。
其次,如果你對于一個指定的搜索,IDA將很慢的,而在w32dasm中在文本方面中搜索是很快的。
第三:當(dāng)分析一個僅有簡單的保護的程序時,w32dasm就為首選。因為你就不需要在IDA那些附加的功能了。
上面的三個因素可以說明一切了 :-) 如果你知道其它的使用w32dasm原因的話,請告訴我。
IV. 結(jié)束
又一個教程結(jié)束了。享受IDA and w32dasm以及所有.....享受研究和保持學(xué)習(xí)和繼續(xù)研究和破解吧。不是為了解密,僅是文章,寫下你的文章,傳播你的知識。對于解密這是重要的來說。不要用于解密吧。