服務熱線
0755-33563420
CTF學習——加密與解密基礎
2019-04-19 16:10:20 來源:網站建設微信APP開發
新聞摘要:由于Win32程序內存尋址使用的是相對簡單的平坦尋址模式,并且Win32程序大量調用系統提供的API,而Win32平臺上的調試器如SoftICE等恰好有針對API設置斷點的強大功能,因而這些特點都給動態跟蹤破解帶來極大的方便。
由于Win32程序內存尋址使用的是相對簡單的平坦尋址模式,并且Win32程序大量調用系統提供的API,而Win32平臺上的調試器如SoftICE等恰好有針對API設置斷點的強大功能,因而這些特點都給動態跟蹤破解帶來極大的方便。
因為程序的作者用的是高級語言,Windows又是提倡“透明 ”,不希望程序員知道底層的操作 , 而只提供給他們高層的接口, 而相當多的高級函數調用某個一定的底層函數,所以解密者經常在底層函數上下斷點。所以在Windows中,只要Windows的函數被使用,想對任何尋找蛛絲馬跡的人隱藏什么東西是比較困難的。
為什么要對軟件進行動態分析呢?這主要是因為:
1、許多軟件在整體上完成的功能,一般要分解成若干模塊來完成,而且后一模塊在執行時,往往需要使用其前一模塊處理的結果,這一結果我們把它叫中間結果。如果我們只對軟件本身進行靜態地分析,一般是很難分析出這些中間結果的。而只有通過跟蹤執行前一模塊,才能看到這些結果。另外,在程序的運行過程中,往往會在某一地方出現許多分支和轉移,不同的分支和轉移往往需要不同的條件,而這些條件一般是由運行該分支之前的程序來產生的。如果想知道程序運行到該分支的地方時,到底走向哪一分支,不進行動態地跟蹤和分析是不得而知的。
2、有許多軟件在運行時,其最初執行的一段程序往往需要對該軟件的后面各個模塊進行一些初始始化工作,而沒有依賴系統的重定位。
3、有許多加密程序為了阻止非法跟蹤和閱讀,對執行代碼的大部分內容進行了加密變換,而只有很短的一段程序是明文。加密程序運行時,采用了逐塊解密,逐塊執行和方法,首先運行最初的一段明文程序,該程序在運行過程中,不僅要完成阻止跟蹤的任務,而且還要負責對下一塊密碼進行解密。顯然僅對該軟件的密碼部分進行反匯編,不對該軟件動態跟蹤分析,是根本不可能進行解密的。
逆向工程
對于(網絡)黑客來說,“hack”是褒義詞,“crack”則是貶義詞,后者指那些尋找網絡漏洞并進行惡意攻擊的行為。
對于(軟件)黑客來說,“crack”只是個中性詞,泛指對程序修改的行為,更喜歡稱自己為“逆向工程”學者。
逆向工程(Reverse Engineering)定義為:"the process of analyzing a subject system to identify the system's components and their interrelationships and create representations of the system in another form or at a higher level of abstraction." (Source: Chikofsky and Cross)
如果認為:
“源代碼 → 編譯器 → 可執行程序”的過程是“順向工程”的話;
“可執行程序 → 反編譯器或人工反編譯 → 源代碼”的過程就是逆向工程。
將逆向工程包括的內容可以分為3類:
1.軟件使用限制的去除,或軟件功能的添加
(1) 按照計算機類別,可以分為個人微型計算機、小型機、中型機、大型機等;
(2) 按照操作平臺或處理器類型,可以分為windows、MAC、UNIX,x86,risc等
(3) 按照限制類型,可以分為軟件使用時間限制,軟件功能模塊限制、軟件運行條件限制(軟件狗等)、軟件注冊限制等
(4) 可以是軟件功能限制的去除,也可以是軟件功能的添加。
2.軟件源代碼的再獲得或二進制代碼水平的Debug
(1) 按照計算機類別,可以分為個人微型計算機、小型機、中型機、大型機等;
(2) 按照操作平臺,可以分為windows、MAC、UNIX等
(3) 按照軟件層次,可以分為普通應用層軟件與操作系統源等。
3.硬件的復制、模擬
由此觀之,一般所謂的“軟件破解”只是逆向工程中非常初級的一小部分。
坦白地講,現在的逆向工程,真實目的就是為了再利用。據此,個人可以學習別人的編程技術及技巧,公司可以窺探別人的商業軟件秘密,或開發與之兼容的軟件;(二進制代碼層面的)Debug自然也是其中重要的目的之一。
據說,著名的殺毒軟件AVP代碼寫的實在太有條理,因此很容易被分析后“再利用”。有心人不僅可以將其病毒特征庫改頭換面后再推出,也可以利用逆向工程得到AVP某些模塊的源代碼,加入自己開發的產品中。
成為一個“逆向工程”大師,應該具有如下特征:
1.永遠保存好奇心,崇尚自由。這能促使探索;也能抵抗商業利欲的侵襲;有了它,枯燥的代碼世界才有了生氣。
2.勤奮與毅力:“讓我們搞清楚作為一名Cracker最需要具備的基本條件,其實那并不是扎實的匯編功底和編程基礎。你可以完全不懂這些,CRACKING的秘訣就是勤奮+執著!記住并能做到這兩點,你一樣可以變得優秀。”
3.精通至少一門編程語言,不僅僅是Coding,更重要的是編程思想。RAD工具也許是容易學的,但你要明白隱藏在它背后的機制。
4.扎實的匯編功底和系統編程的知識。
5.能發現“美麗”。是的,你能在枯燥的二進制代碼中見到美,那是數學和對稱的美麗。卓越的編譯器優化能力,簡潔而又高效的代碼,都能使你領略到她的存在。
【責任編輯:藝之都網站微信APP開發公司】 (Top) 返回頁面頂端
最新更新