逆向區(qū)分技術(shù)總結(jié)
發(fā)表時間:2023-05-31 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]好久沒寫過文檔了, 今天把之前的關(guān)于逆向分析的一些心得總結(jié)一下, 反正閑著也是閑著(本文不包含什么新的技術(shù), 只是將來源于各方的知識加上自己的心得進(jìn)行總結(jié)而已, 高手就不用看了)。 我認(rèn)為...
好久沒寫過文檔了, 今天把之前的關(guān)于逆向分析的一些心得總結(jié)一下, 反正閑著也是閑著(本文不包含什么新的技術(shù), 只是將來源于各方的知識加上自己的心得進(jìn)行總結(jié)而已, 高手就不用看了)。
我認(rèn)為軟件安全攻防其本質(zhì)是分析與抗分析之間的斗爭。 因為無論安全技術(shù)做的多么先進(jìn), 一旦其代碼意圖被分析者掌握, 就不在有安全性可言。 想要更快速的分析程序不但要了解各種各樣的軟件保護(hù)措施, 還需要更加清晰的認(rèn)識逆向分析技術(shù)。 下面簡單的談?wù)勎覍δ嫦蚬こ痰囊恍┬牡谩?
我認(rèn)為逆向分析從總體上主要可以分為代碼結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、運(yùn)算三點, 以下進(jìn)行詳細(xì)說明(限于篇幅, 下面只是大綱模式, 具體內(nèi)容相信網(wǎng)上都可以查到)。
注:對于Debug版本和Release版本程序的處理思路上是一致的, 因此下面沒有特別區(qū)分。 但實現(xiàn)方式卻有很大區(qū)別, 很多Release版本代碼處理方式我還在摸索中, 因此就不寫了。
一. 代碼結(jié)構(gòu)。
代碼結(jié)構(gòu)決定了程序的執(zhí)行過程以及數(shù)據(jù)走向。 首先理解程序的代碼結(jié)構(gòu), 可以把整個程序的框架給勾勒出來。 接下來進(jìn)行各個部分的點綴。 可以有效提高逆向速度。 代碼結(jié)構(gòu)分析總的分為以下幾點:
1. 比較操作。
A. 有符號數(shù)比較。
B. 無符號數(shù)比較。
C. 條件碼(各種條件碼的組合判斷我記不住, 可以列成表格以便查詢。 平時用上的不多, 除非要精確還原代碼)。
2. 條件分支。
A. 單分支條件(if)。
B. 雙分支條件(if-else)。
C. Switch條件。
D. 組合條件。
E. 純算術(shù)實現(xiàn)邏輯分支(運(yùn)算后條件碼的判斷, 具體可參看加密解密第三版)。
F. 條件設(shè)置指令(SETcc)。
G. 條件傳輸指令(CMOVcc)。
3. 循環(huán)。
A. 先執(zhí)行循環(huán)(do-while)。
B. 后執(zhí)行循環(huán)(for/while)。
C. 循環(huán)控制及break/continue。
4. 函數(shù)。
A. 函數(shù)調(diào)用及功能的快速識別。
B. 調(diào)用約定。
C. 參數(shù)傳遞方式。
D. 堆棧平衡。
E. 函數(shù)導(dǎo)出及導(dǎo)入。
5. 代碼優(yōu)化。
A. 代碼速度優(yōu)化。
B. 代碼大小優(yōu)化。
二. 數(shù)據(jù)結(jié)構(gòu)。
當(dāng)識別了代碼結(jié)構(gòu)并勾勒出整個代碼框架之后, 接著要做的就是識別程序中的各種數(shù)據(jù)結(jié)構(gòu)。 比如程序是一棵大樹, 現(xiàn)在已經(jīng)有了枝干, 我們要做的就是添加樹葉。 數(shù)據(jù)結(jié)構(gòu)的分析我主要分為以下幾點。
1. 堆棧(Debug版與Release版的堆棧使用有很大區(qū)別)。
2. 全局變量。
3. 局部變量。
A. 堆棧中的局部變量識別。
B. 寄存器變量。
4. 變量的導(dǎo)入導(dǎo)出。
5. 常量。
6. 數(shù)組。
A. 簡單數(shù)組。
B. 多維數(shù)組。
7. 結(jié)構(gòu)體與聯(lián)合體。
8. 鏈表。
A. 單向鏈表。
B. 雙向鏈表。
C. 循環(huán)鏈表。
D. 二叉樹。
E. 圖等高級鏈表我沒逆向過。 寫在這里只是說明一下思路。
9. 類。
Release版程序的類的還原我目前還不是很熟悉。 對于Release版沒被使用過的類成員的分析還在摸索中。
A. 成員變量。
B. 普通成員函數(shù)(容易與編譯器默認(rèn)的構(gòu)造函數(shù)混淆)。
C. 虛函數(shù)表及繼承派生。
D. 通過構(gòu)造函數(shù)識別類與類的關(guān)系。
E. 析構(gòu)函數(shù)。
F. 類的作用域。
三. 運(yùn)算。
當(dāng)數(shù)據(jù)結(jié)構(gòu)識別完畢后, 程序大樹的樹枝和樹葉都有了, 不過這棵樹依然不是活的。 而運(yùn)算就像是血液一樣將數(shù)據(jù)結(jié)構(gòu)和代碼結(jié)構(gòu)緊緊的聯(lián)合在一起。 當(dāng)運(yùn)算處理完畢后, 這個樹才是個活生生的樹, 可以完成各項生命活動。 運(yùn)算分析我主要分為以下幾點。
1. 邏輯運(yùn)算。
2. 數(shù)據(jù)類型轉(zhuǎn)換。
A. 零擴(kuò)展。
B. 符號擴(kuò)展。
3. 浮點運(yùn)算。
A. 數(shù)據(jù)格式。
B. FPU寄存器。
C. 浮點操作。
4. 整數(shù)運(yùn)算。
A. 加法減法。
B. 乘法除法。
C. 模運(yùn)算。
D. 16、32位運(yùn)算。
E. 大數(shù)運(yùn)算。
5. 標(biāo)志位。
A. 溢出標(biāo)志位(CF/OF)。
B. 零標(biāo)志位(ZF)。
C. 符號標(biāo)志位(SF)。
D. 奇偶標(biāo)志位(PF)。
6. 運(yùn)算的代碼優(yōu)化及識別。
當(dāng)然, 真正的代碼逆向分析絕對不會是按照以上的順序死板的進(jìn)行, 而是靈活運(yùn)用。 以上所述純粹是基礎(chǔ)。 當(dāng)這些都掌握了之后, 代碼的逆向速度會明顯的提高。 這些知識整理在大腦中就像書的目錄一樣可以快速定位到所需要的部分(每個人的思維方式都不一樣, 別人怎樣思維更快速我不知道)。
以上的框架也是我自己的一個學(xué)習(xí)過程。 看上去和程序設(shè)計差不多, 我學(xué)習(xí)的時候是通過C、C++程序的各種處理方式反過來一點一點的學(xué)習(xí)。 學(xué)習(xí)一遍之后心里自然有了個簡單的框架, 我認(rèn)為逆向分析作為基礎(chǔ), 如果能夠熟練掌握可以加快其他方面的學(xué)習(xí)進(jìn)度, 比如:漏洞分析、外殼分析等。 磨刀不誤砍柴時嘛。 本文旨在拋磚引玉, 希望有高手能夠提供一些關(guān)于Release版的類的還原心得給我, 呵呵。
上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識,學(xué)習(xí)了安全知識,幾乎可以讓你免費電腦中毒的煩擾。