1. 程式人生 > >程式設計師的吸星大法-IDA反彙編工具初探

程式設計師的吸星大法-IDA反彙編工具初探

看過<<笑傲江湖>>的朋友一定知道吸星大法吧,這是一種可以吸取他人內功來使自己功力增長的神功,(段譽的北冥神功也是這樣, 扯遠了...).對於程式設計師來說,增長自己程式設計功力的一個好方法是閱讀其它人開發的程式的原始碼,從而把別人的技術來消化成為自己知識,這是不是很象吸星大法?
但開源的程式畢竟是在少數,大多數程式都只會分發可執行檔案及相關檔案,這時我們要想檢視此程式的程式碼,就只有把它反彙編,當然這需要一定的彙編功底,但是一個好的反彙編工具能為你閱讀反彙編出來的程式提供非常大的幫助.
瞭解反彙編的朋友也一定知道WINDASM這個有名的反彙編工具,比如我們用WINDASM反彙編一個程式,在其程式入口點反彙編得到如下程式碼:
//*********************** Program Entry Point *****************
:00401000 6A00                 push 00000000
:00401002 E8FF050000      call 00401606
:00401007 A316304000      mov [00403016], eax
:00401007 E8EF050000      call 00401600
:00401011 A30E304000      mov [0040300E], eax
:00401016 6A0A                 push 0000000A
:00401018 FF350E304000   push d

Word ptr [0040300E]
:0040101E 6A00                 push 00000000
:00401020 EF3516304000   push dword ptr [00403016]
:00401026 E806000000       call 00401031
:0040102B 50                     push eax
:0040102c E8C9050000      call 004015FA

如果不聯絡上下文及知道這是程式入口的話,很難看出來這一段程式碼到底是幹什麼的,但IDA就不一樣了,它不但會反彙編程式,並會盡量分析程式,並加上相應的註釋(正因為這樣,IDA反彙編一個大的程式會花非常長的時間),請看下面一段IDA反彙編出來的程式碼,是不是明瞭多了?
.text:00401000                 push     0               ; lpModuleName
.text:00401002                 call      GetModuleHandleA

 .text:00401007                 mov     hInstance, eax
.text:0040100C                call      GetCommandLineA
.text:00401011                 mov    dword_0_40300E, eax
.text:00401016                 push    0Ah
.text:00401018                 push    dword_0_40300E
.text:0040101E                 push    0
.text:00401020                 push    hInstance
.text:00401026                 call      sub_0_401031
.text:0040102B                 push    eax             ; uExitCode
.text:0040102C                 call      ExitProcess

IDA反彙編程式後,會生成一個 .idb檔案,裡面儲存了反彙編出來的程式碼及註釋及IDA的一些其它相關資料,我們可以直接在IDA中寫自己的分析結果和註釋並儲存,下次直接開啟.idb檔案就可以了,例如上面
.text:00401000                 push    0               ; lpModuleName
.text:00401002                 call      GetModuleHandleA
.text:00401007                 mov     hInstance, eax

我們可以看出來實際上就是hInstance = GetModuleHandleA(nil);我們可以在後面直接加上註釋,在.text:00401007這一行最後面的空白處點右鍵,在彈出的選單中選擇"註釋",然後在彈出的視窗中填上"取得當前模組例項控制代碼",這一行就會變為
.text:00401007                 mov     hInstance, eax  ; 取得當前模組例項控制代碼

這樣就為我們的反彙編出的程式碼增加了可讀性.
IDA不但可以在當前程式碼中加註釋,還可以更改其預設的符號名,比如
.text:00401011                 mov     dword_0_40300E, eax
其中的dwrd_0_40300E可以看出來是存放取得的命令列的緩衝區指標(可以雙擊符號名,函式名跳到其定義處),在dword_0_40300E上面點右鍵,選取"重新命名",然後在彈出的視窗中填入lpCommandline,點確定,這樣程式中所有使用到了dword_0_40300E這個變數的地方都會將dword_0_40300E替換為lpCommandline.如下所示:
.text:00401011                 mov     lpCommandline, eax
.text:00401016                 push    0Ah
.text:00401018                 push    lpCommandline

我們再來看

.text:00401026                 call    sub_0_401031這一行
可以從上面的程式碼看出來,這是呼叫的WinMain函式,在sub_0_401031上面點右鍵,選取"重新命名",然這個函式命名為WinMain,這時IDA就將所有sub_0_401031符號變為WinMain, 並且自動加上函式定義,並會在函式呼叫時入棧的引數後面加上其對應的變數註釋,這時我們反彙編出來的這一段程式碼就成了下面這個樣子的了:
.text:00401000 start           proc    near
.text:00401000                  push    0               ; lpModuleName

.text:00401002                  call      GetModuleHandleA
.text:00401007                  mov     hInstance, eax  ; 取得當前模組例項控制代碼
.text:0040100C                 call      GetCommandLineA
.text:00401011                  mov     lpCommandline, eax
.text:00401016                  push    0Ah             ; nShowCmd
.text:00401018                  push    lpCommandline   ; lpCmdLine
.text:0040101E                  push    0               ; hPrevInstance
.text:00401020                  push    hInstance       ; hInstance
.text:00401026                  call      WinMain
.text:0040102B                  push    eax             ; uExitCode
.text:0040102C                  call      ExitProcess

是不是一目瞭解了呢?
當我們通過閱讀原始碼,能確定某一個子函式的作用及傳入的引數型別時,我們可以雙擊這個函式名,跳到函式定義處,在函式定義處點右鍵,使用"設定函式型別"功能來編輯函式定義(C++語法),這樣所有呼叫到這個函式的地方都會在入棧的引數後面加上其對應的變數註釋. 還可以通過在函式定義處後面空白處點右鍵加上"可重複註釋",這樣所有呼叫此函式的地方都會在後面加上這個重複的註釋.

如果想檢視某個變數或函式被呼叫的情況,可以通過在函式或變數名上點右鍵,點選"檢視運算元交叉索引處"功能,就可以在開啟的視窗中檢視到所有呼叫其的程式碼,並可通過雙擊跳到這段程式碼處.這是一個很有用的功能,能幫助你快速的搞清函式及變數的呼叫關係.

按下F12還可以檢視到程式的流程圖,CTRL+12可以檢視到函式的呼叫圖.

IDA還擁有符號除錯技術,能識別常見編釋器編釋的程式,例如下面反彙編出的VC6.0的程式程式碼段:
.text:00405427                 push    edx
.text:00405428                 call    _swscanf
.text:0040542D                 lea     eax, [esp+38h+arg_40]
.text:00405431                 push    offset unk_0_5DB1A4 ; const wchar_t *
.text:00405436                 push    eax             ; const wchar_t *
.text:00405437                 call    _wCScmp
.text:0040543C                 add     esp, 1Ch
.text:0040543F                 test    eax, eax
.text:00405441                 jz      short loc_0_405459

.text:00405443                 lea     ecx, [esp+24h+arg_40]
.text:00405447                 push    offset unk_0_5DB18C ; const wchar_t *
.text:0040544C                 push    ecx             ; const wchar_t *
.text:0040544D                 call    _wcscmp
就檢查到了其呼叫了MFC類庫中的函式,並把它們替換成了相應的函式名.

還可以呼叫IDA匯出.MAP檔案,來配合其它動態除錯工具如SOFT-ICE來進行程式碼分析.

IDA是一個非常強大的反彙編工具,這裡只是討論了一下它的一些基本的應用,希望能起到拋磚引玉的作用,如果對IDA應用有興趣的朋友可以來信討論,或參考段鋼先生的<<加密與解密>>一書,裡面對IDA的應用有較祥細的講解.
我的Mail:[email protected]

相關推薦

程式設計師大法-IDA彙編工具初探

看過<<笑傲江湖>>的朋友一定知道吸星大法吧,這是一種可以吸取他人內功來使自己功力增長的神功,(段譽的北冥神功也是這樣, 扯遠了...).對於程式設計師來說,增長自己程式設計功力的一個好方法是閱讀其它人開發的程式的原始碼,從而把別人的技術來消化成為

IDA彙編/編譯靜態分析iOS模擬器程式

轉載自:http://blog.csdn.net/hursing 開刀的類名叫 PluginWidgetIOS,利用lldb可以得到: (lldb) image lookup -r -s PluginWidgetIOS   7 symbo

彙編stepldr exe——第一次使用IDA彙編(作者 wogoyixikexie gliet)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

轉——一個超級wince牛人使用彙編工具修改程式的方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

大法NiFi——NiFi下載及安裝

轉載請註明出處:http://blog.csdn.net/dongdong9223/article/details/84882826 本文出自【我是幹勾魚的部落格】 Ingredients: NiFi:nifi-1.8.0-bin.zip(One mirro

大法NiFi——使用NiFi實現檔案同步功能

轉載請註明出處:http://blog.csdn.net/dongdong9223/article/details/84940992 本文出自【我是幹勾魚的部落格】 Ingredients: NiFi:nifi-1.8.0-bin.zip(One mirro

彙編工具objdump的簡單使用

objdump這個工具可以用來將二進位制檔案(例如linux下的ELF可執行檔案)轉成彙編程式碼讓我們進行分析 linux系統裡邊可以直接使用這個命令 最常用的就是:objdump -d -M intel ./pwn1 -d 就是反彙編  &n

程式設計師程式設計入門必備的7大工具,你用過幾個?

作為入門級別的程式設計師,幾款趁手的程式設計軟體是最需要的。除了Git、Visual Basic……等等,其實還有很多很很酷的程式設計工具。接下來就給大家看7款不一樣的程式設計工具,如有心動,純屬巧合。 0.Warp,一款非常簡單且由於共享的工具。 Warp允許任何人共享他們的終端。只

程式設計師最喜歡的5個開發工具,每個人都會喜歡它!

Atom Atom是github專為程式設計師設計的跨平臺文字編輯器,它支援巨集,自動分屏功能,並與檔案管理器整合。 (1)、免費 (2)、git原生支援 (3)、豐富的外掛 (4)、自定義介面 Emacs (1)、瀏覽網頁以觀看視訊併發送和接收電子郵件。 (2)、偵錯程式 (3)、玩遊戲,

程式設計師必知的七個圖形工具

流程圖:Graphviz 說到流程圖還是再次提及一下,我們之前說到的 Graphviz 。 Graphviz (英文:Graph Visualization Software的縮寫)是一個由AT&T實驗室啟動的開源工具包,用於繪製DOT語言指令碼描述的圖形。它

Web前端程式設計師推薦7個實用的JavaScript工具

   在web前端開發中,JavaScript是必備的全能指令碼語言,可以建立更加友好的使用者互動式網站和應用。但也正是由於JS程式碼在前端執行,所以很多初學者在剛開始寫JS程式碼的時候,基本上都不會太考慮網站效能問題。今天小編為大家分享7個可以幫你優化網站效能的JavaS

vxworks環境下彙編工具使用技巧

平臺:windows 環境:vxworks6.8 工具:objdumpmips  nmmips 使用方法介紹: 1、設定環境:進入dos中,cd到你的WinRiver下 執行下面的命令,這樣就可以使用vxworks的小工具了 wrenv.exe -p vxworks

強大的W32Dasm彙編工具使用教程

W32Dasm是一個強大的反彙編工具,操作簡單,使用方便。通常被程式設計師使用,當然也可被用來Crack軟體了,很適合Cracker使用。我在這把與crack相關的功能簡述如下: 1.0 開始 2.0 儲存反彙編文字檔案和建立方案檔案 3.0 反彙編文字程式碼的基本操作

Linux下的objdump彙編工具

1.  [[email protected] controller1]$ objdump --help  Usage: objdump <option(s)> <file(s)>  Display information from obje

Linux下 視覺化 彙編工具 EDB 基本操作知識

     自己在上網搜edb的操作姿勢的時候發現這方面的資料有點少,下面總結一下自己摸索出來的edb操作姿勢: EDB操作基礎知識:首先點選執行,這時程式會執行前面的初始化函式到main,此時可以開始

程式設計師軟體開發最好的IDE整合工具eclipse各個版本的詳細介紹。詳細介紹,送給初學者的朋友

Eclipse IDE for Java EE Developers 該版本集成了Java ee開發常用外掛,方便動態web網站開發。適合Java web開發者使用。集成了XML編輯器、資料庫檢視工具,提供jsp視覺化編輯器。

#程式設計師排名血汗工廠,卻被吐槽:矯情,享受高新福利你怎麼不說

雖說現在網際網路行業發展的迅速,另外網際網路行業也是十分的熱門,為什麼現在大家都想加入到網際網路行業、IT行業呢,幾乎沒有工科行業比得上程式設計師這個崗位,當然,錢不是白拿的,付出的勞動與收穫肯定是成正比的,哪個行業都是如此。 在這裡我推薦下自己整理的資料,我自己是一名從事了5年java開發

IDA 逆向工程 彙編使用

IDA pro 7.0版本 from:freebuf 用到的工具有IDA pro 7.0  ,被反彙編的是百度雲(BaiduNetdisk_5.6.1.2.exe)。 首先,IDA pro的長相如下: 共有(File , Edit , Jump , Search , View , Deb

程式設計師被領導批不加班影響氛圍,怒懟:效率高不行?上班划水?

按質按量完成工作任務,不額外消耗公司資源,得到的卻是領導的批評,換誰能高興?就有一名程式設計師因為工作效率高完成任務快,幾乎每天到點下班不加班,就這樣也被領導喊去談話批評了一番,對此這名程式設計師吐槽稱:本人高階開發,平時工作效率比較高,程式碼穩定性也高,所以平時也不怎麼加班。沒想到被大領導約談了,

apk decompile 線上編譯工具-toolfk程式設計師線上工具

      本文要推薦的[ToolFk]是一款程式設計師經常使用的線上免費測試工具箱,ToolFk 特色是專注於程式設計師日常的開發工具,不用安裝任何軟體,只要把內容貼上按一個執行按鈕,就能獲取到想要的內容結果。ToolFk還支援  BarCod