反彙編簡介

2022-08-20 14:57:10 字數 3173 閱讀 1608

在傳統的軟體開發模型中,程式設計師使用編譯器、彙編器、鏈結器中的乙個或者幾個建立可執行程式,為了回溯程式設計過程,可以使用各種工具來撤銷彙編和編譯過程,這些工具就叫做反彙編器和反編譯器。

反彙編器:以機器語言作為輸入,得到組合語言形式的輸出結果

反編譯器:以機器語言作為輸入,得到高階語言形式的輸出結果

第一步:

確定進行反彙編的**區域,若指令和**混雜在一起,則區分它們就十分重要,以反彙編可執行檔案為例,該檔案必須符合可執行檔案的某種通用格式,如windows使用的可移植可執行(portable executable, pe)格式還有unix常用的可執行和鏈結格式(executable and linking format, elf),這些格式通常含有一種機制來確定檔案中**和**入口點的位置。

第二步:

第三步:

獲取指令並解碼任何所需的運算元後,需要對它的組合語言等價形式進行格式化,並將其在反彙編**中輸出。

第四步:

輸出一條指令後,繼續反彙編下一條指令,並重複上述過程,知道反彙編完檔案中的所有指令。

關於如何確定從何處開始反彙編、如何選擇下一條反彙編的指令、如何區分**和資料,以及如何確定何時完成對最後一條指令的反彙編,有兩種主要的反彙編演算法

該演算法採用非常簡單的方法來確定需要反彙編的指令的位置:一條指令結束,另一條指令開始的地方。

因此,確定起始位置最難,通常對於特定的檔案格式,可以通過檔案頭部找到標註為**的節,於是反彙編從乙個**段的第乙個位元組開始,以線性模式掃瞄整個**段,逐條反彙編每條指令,直到完成整個**段。

執行的基本步驟:

位置指標指向**段的開始處

從指標位置嘗試匹配指令,並得到指令長度n

若第2步成功,則反彙編接下來的n個資料,如果失敗則退出

位置指標指向上一條指令的末尾

判斷位置指標是否超出**段結尾,如果超出則結束,不超出則轉至第2步

優點:

能夠完全覆蓋程式的所有**段,執行起來簡單方便

存在的問題:

這種演算法並不會通過識別分支等非線性指令來了解程式的控制流。

對於指令長度相同的risc,反彙編時不會出現回溯現象,而對於指令長度可變的cisc則可能出現回溯,從而導致效率降低。

該演算法最主要的缺點就是,無法區分**中混入的資料,如果在某幾條指令中間插入一些無意義的資料,則會造成反編譯器將該資料當作**來反編譯,於是產生錯誤。

採用該演算法的反編譯器

gnu偵錯程式(gdb), 微軟公司的windbg偵錯程式和objdump實用工具的反彙編引擎。

遞迴下降演算法強調控制流的概念,控制流根據一條指令是否被另一條指令引用來決定是否對其進行反彙編。

遞迴下降演算法的乙個主要思路就是模擬cpu的執行過程,根據執行流程逐步對指令進行反彙編,或者說,形如編譯技術中的語法樹,根據樹的路徑遞迴下降式的對指令進行反彙編。

要準確理解遞迴下降的原理,首先要根據指令對cpu指令指標的影響進行分類:

1、順序流指令

順序流指令將執行許可權傳遞給緊隨其後的下一條指令,這種指令的反彙編過程以線性掃瞄的方式進行。

2、條件分支指令

條件分支指令提供兩條可能的指令路徑。如果為真,則執行分支,並且必須修改指令指標,使其指向分支的目標。但是,如果條件為假,則繼續以線性模式執行指令,並使用線性掃瞄方法反彙編下一條指令。因為不可能在靜態環境中確定條件測試的結果,遞迴下降演算法會反彙編上述兩條路徑。同時,它將分支目標指令的位址新增到稍後才進行反彙編的位址列表中,從而推遲分支目標指令的反彙編過程。

3、無條件分支指令

無條件分支並不遵循線性流模式,因此,它由遞迴下降演算法以不同的方式處理。與順序流指令一樣,執行權只能傳遞給一條指令,但那條指令不需要緊跟在分支指令後面,也就沒有理由反彙編緊跟在無條件分支後面的位元組。

遞迴下降反彙編器嘗試確定無條件跳轉的目標,並將目標位址新增到要反彙編的位址列表中。然而,對於靜態分析條件下無法確定跳轉目標的指令,則無法接著進行反編譯。

4、函式呼叫指令

函式呼叫指令的執行方式和無條件跳轉指令非常相似,唯一的不同在於,一旦函式完成,執行權將返回給緊跟在呼叫指令後面的指令。在這方面與條件分支類似,因為都生成兩條執行路徑。呼叫指令的目標位址被新增到推遲進行反彙編的位址列表中,而緊跟在呼叫後面的指令則類似於線性掃瞄的方式進行反彙編。

但是,從被呼叫函式返回時,如果**有意篡改函式的返回位址,則有可能在函式返回時,將控制權返回到乙個反彙編器無法預知的位址。

5、返回指令

有時,遞迴下降演算法訪問了所有的路徑,而且,函式返回指令沒有提供接下來將要執行的指令的訊息。這時,如果程式確實正在執行,則可以從執行時棧頂獲得乙個位址,並從這個位址開始恢復指令執行。但是反彙編器並不能訪問棧,因此,遞迴下降反彙編器會轉而處理前面擱置一旁的延遲反彙編位址列表。反彙編器從這個列表取出乙個位址,並從這個位址開始繼續反彙編過程。遞迴下降反彙編演算法正是因此而得名。

分析

遞迴下降演算法的主要優點在於,它具有區分**和資料的強大能力,作為一種基於控制流的演算法,它很少會在反彙編過程中錯誤的講資料值作為**處理。

遞迴下降演算法的主要缺點在於,他無法處理間接**路徑,如利用指標表來查詢目標位址的跳轉或呼叫,然而,通過採用一些用於識別指向**的指標的啟發式方法,遞迴下降反彙編器能夠提供所有**,並清楚的區分**與資料。

ida pro是一種最為典型的遞迴下降反彙編器

反彙編 迴圈

includeint main 00401010 55 push ebp 00401011 8bec mov ebp,esp 00401013 83ec 44 sub esp,44 00401016 53 push ebx 00401017 56 push esi 00401018 57 push ...

反彙編快速入門

我從事組合語言研究大概幾年前,因為是我為了開發sepl計算機語言編譯器。雖然到現在還沒有開發出 來,但是已經看到曙光了。為了研究彙編,我從反彙編入手,做了破解,脫殼,除錯等。但是彙編對我來說一直是讀天書,沒有任何突破。直到最近幾天我有了重大發現。有人說做黑客從反彙編sqlserver.exe檔案開始...

什麼是反彙編

反彙編 把目標 轉為 彙編 的過程,也可說是把機器語言轉為組合語言 低階轉高階的意思,常用於軟體破解。通常,編寫 程式是利用高階語言如c,pascal等高階語言進行程式設計的,然後再經過編譯程式生成可以被 計算機系統直接執行的檔案 機器語言 反彙編即是指將這些執行檔案 反編譯 還原成 組合語言 或其...