<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      逆向區分技術總結

      [摘要]好久沒寫過文檔了, 今天把之前的關于逆向分析的一些心得總結一下, 反正閑著也是閑著(本文不包含什么新的技術, 只是將來源于各方的知識加上自己的心得進行總結而已, 高手就不用看了)。 我認為...

      好久沒寫過文檔了, 今天把之前的關于逆向分析的一些心得總結一下, 反正閑著也是閑著(本文不包含什么新的技術, 只是將來源于各方的知識加上自己的心得進行總結而已, 高手就不用看了)。

        我認為軟件安全攻防其本質是分析與抗分析之間的斗爭。 因為無論安全技術做的多么先進, 一旦其代碼意圖被分析者掌握, 就不在有安全性可言。 想要更快速的分析程序不但要了解各種各樣的軟件保護措施, 還需要更加清晰的認識逆向分析技術。 下面簡單的談談我對逆向工程的一些心得。

        我認為逆向分析從總體上主要可以分為代碼結構、數據結構、運算三點, 以下進行詳細說明(限于篇幅, 下面只是大綱模式, 具體內容相信網上都可以查到)。

        注:對于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版的類的還原心得給我, 呵呵。


      上面是電腦上網安全的一些基礎常識,學習了安全知識,幾乎可以讓你免費電腦中毒的煩擾。




      日韩精品一区二区三区高清