好久沒寫過文件了,今天把之前的關於逆向
分析的一些心得總結一下,反正閒著也是閒著(本文不包含什麼新的
技術,只是將**於各方的知識加上自己的心得進行總結而已,
高手就不用看了)。
我認為軟體安全攻防其本質是分析與抗分析之間的鬥爭。因為無論安全技術做的多麼先進,一旦其
**意圖被分析者掌握,就不在有安全性可言。想要更快速的分析程式不但要了解各種各樣的軟體保護措施,還需要更加清晰的認識逆向分析技術。下面簡單的談談我對逆向工程的一些心得。
我認為逆向分析從總體上主要可以分為**結構、資料結構、運算三點,以下進行詳細說明(限於篇幅,下面只是大綱模式,具體內容相信網上都可以查到)。
注:對於debug版本和release版本程式的處理思路上是一致的,因此下面沒有特別區分。但實現方式卻有很大區別,很多release版本**處理方式我還在摸索中,因此就不寫了。
一. **結構。
**結構決定了程式的執行過程以及資料走向。首先理解程式的**結構,可以把整個程式的框架給勾勒出來。接下來進行各個部分的點綴。可以有效提高逆向
速度。**結構分析總的分為以下幾點:
1. 比較操作。
a. 有符號數比較。
b. 無符號數比較。
c. 條件碼(各種條件碼的組合判斷我記不住,可以列成**以便查詢。平時用上的不多,除非要精確還原**)。
2. 條件分支。
a. 單分支條件(if)。
b. 雙分支條件(if-else)。
c. switch條件。
d. 組合條件。
e. 純算術實現邏輯分支(運算後條件碼的判斷,具體可參看加密解密第三版)。
f. 條件
設定指令(setcc)。
g. 條件傳輸指令(cmovcc)。
3. 迴圈。
a. 先執行迴圈(do-while)。
b. 後執行迴圈(for/while)。
c. 迴圈控制及break/continue。
4. 函式。
a. 函式呼叫及
功能的快速識別。
b. 呼叫約定。
c. 引數傳遞方式。
d. 堆疊平衡。
e. 函式匯出及匯入。
5. **優化。
a. **速度優化。
b. **大小優化。
二. 資料結構。
當識別了**結構並勾勒出整個**框架之後,接著要做的就是識別程式中的各種資料結構。比如程式是一棵大樹,現在已經有了枝幹,我們要做的就是新增樹葉。資料結構的分析我主要分為以下幾點。
1. 堆疊(debug版與release版的堆疊使用有很大區別)。
2. 全域性變數。
3. 區域性變數。
a. 堆疊中的區域性變數識別。
b. 暫存器變數。
4. 變數的匯入匯出。
5. 常量。
6. 陣列。
a. 簡單陣列。
b. **陣列。
7. 結構體與聯合體。
8. 鍊錶。
a. 單向鍊錶。
b. 雙向鍊錶。
c. 迴圈鍊錶。
d. 二叉樹。
e. 圖等高階鍊錶我沒逆向過。寫在這裡只是說明一下思路。
9. 類。
release版程式的類的還原我目前還不是很熟悉。對於release版沒被使用過的類
成員的分析還在摸索中。
a. 成員變數。
b. 普通成員函式(容易與編譯器預設的建構函式混淆)。
c. 虛函式表及繼承派生。
d. 通過建構函式識別類與類的關係。
e. 析構函式。
f. 類的作用域。
三. 運算。
當資料結構識別完畢後,程式大樹的樹枝和樹葉都有了,不過這棵樹依然不是活的。而運算就像是血液一樣將資料結構和**結構緊緊的聯合在一起。當運算處理完畢後,這個樹才是個活生生的樹,可以完成各項生命活動。運算分析我主要分為以下幾點。
1. 邏輯運算。
2. 資料型別轉換。
a. 零擴充套件。
b. 符號擴充套件。
3. 浮點運算。
a. 資料格式。
b. fpu暫存器。
c. 浮點操作。
4. 整數運算。
a. 加法減法。
b. 乘法除法。
c. 模運算。
d. 16、32位運算。
e. 大數運算。
5. 標誌位。
a. 溢位標誌位(cf/of)。
b. 零標誌位(zf)。
c. 符號標誌位(sf)。
d. 奇偶標誌位(pf)。
6. 運算的**優化及識別。
當然,真正的**逆向分析絕對不會是按照以上的順序死板的進行,而是靈活運用。以上所述純粹是基礎。當這些都掌握了之後,**的逆向速度會明顯的提高。這些知識整理在大腦中就像書的目錄一樣可以快速定位到所需要的部分(每個人的思維方式都不一樣,別人怎樣思維更快速我不知道)。
以上的框架也是我自己的乙個
學習過程。看上去和程式設計差不多,我學習的時候是通過c、c++程式的各種處理方式反過來一點一點的學習。學習一遍之後心裡自然有了個簡單的框架,我認為逆向分析作為基礎,如果能夠熟練掌握可以加快其他方面的學習進度,比如:
漏洞分析、外殼分析等。磨刀不誤砍柴時嘛。本文旨在拋磚引玉,希望有高手能夠提供一些關於release版的類的還原心得給我,呵呵。
逆向工程分析技術
為什麼執行下列程式,debug模式下三個結果是 1,0,1 release模式下的結果是三個都是0?include includeint main void int rtn 0 rtn sum a,0 printf rnt d n rtn system pause return 0 int sum ...
逆向分析細節總結
1 函式識別及引數傳遞 call指令 跳轉指令 返回位址 call指令跳轉的位址即被呼叫函式的起始位址 函式引數傳遞方式 1 堆疊傳遞引數 2 暫存器傳遞引數 fastcall thiscall 暫存器傳遞this指標 引數入棧順序,平衡堆疊 1 c c 和mfc程式預設使用 cdecl呼叫約定,引...
170512 逆向 靜態分析技術
1625 5 王子昂 總結 2017年5月12日 連續第223天總結 a.加密與解密idapro b.動態分析技術是把程式載入到記憶體中然後進行除錯 靜態分析技術則是根據程式進行逆向,獲得彙編 或源 然後從程式清單上分析程式流程,了解模組完成的功能 高階語音編寫的程式有兩種形式,一種被編譯成機器語言...