微軟.NET程式的加密與解密

微軟.NET程式的加密與解密

1.2 12.3 13.2

圖書信息

作 者:單海波,王坤峰,李曉峰 編著
出 版 社:電子工業出版社
出版時間:2008-12-1
頁 數:356頁
開 本:16開
ISBN 9787121075520
分類: 圖書 >> 計算機/軟體安全 >>軟體安全
定價:¥49.00元

宣傳語

軟體安全主題網站——看雪學院《加密與解密》軟體安全系列叢書的第三本。
介紹代碼保護與加密解密技術在微軟.NET框架中的套用。

內 容 簡 介

本書是軟體安全主題網站——看雪學院《加密與解密》軟體安全系列叢書的第三本,主要介紹代碼保護與加密解密技術在微軟.NET框架中的套用。全書分為基礎篇、分析篇、保護篇和擴展篇四大部分,內容涉及.NET框架基礎、元數據與MSIL、.NET程式與核心調試、主流代碼保護及其逆向技術、非託管API套用、64位.NET程式調試等。本書的層次循序漸進,難度深入淺出,且注重實例分析,是軟體開發人員了解.NET核心及加密解密技術不可多得的參考書,適合.NET開發人員及加密與解密愛好者閱讀。

前 言

自微軟2000年6月宣布其.NET戰略以來的八年時間內,.NET技術得到了迅猛發展。越來越多的程式設計師選擇在.NET框架上開發程式,越來越多的企業選擇.NET作為自己產品的平台。有商業化的產品,就必然有對其進行保護的需求,於是加密與解密的戰場再一次從傳統的Win32平台擴展至.NET。可以說,.NET發展的這幾年,也是.NET程式加密解密技術飛速成長的幾年,其間出現了諸多很有特點的保護技術與逆向技術。但也許是受英語語言的限制及缺少資料的影響,國內許多企業和程式設計師對目前國內外最新的加密解密技術了解甚少,於是在選擇適合自己產品的保護方式時往往無從下手;而加密與解密愛好者在學習.NET逆向技術時,也感到缺乏這方面的資料。於是,我認為很有必要寫一本專注於.NET程式加密解密與核心調試的書,希望和讀者互相交流,共同提高。
本書的由來
在調試程式時經常會有這種體會:分析一個保護方式的最好方法就是了解它的歷史。因此,先來談談本書的誕生。
2004年經朋友介紹我知道了軟體安全主題網站——看雪學院,看著前輩高手們在其論壇(看雪論壇)上發表的一篇篇精華文章,實有相見恨晚之感。此時,.NET框架誕生已近4年,但自己對.NET可謂一無所知,國內對這方面的討論也很少。偶爾的機會,接觸到了.NET程式,並在codeproject網站上搜尋到一篇關於去除強名稱的文章,這也成了我步入該領域的入門指南。零零星星地,我開始在看雪論壇里發表一些關於.NET程式加密解密的文章,也認識了一些有著同樣興趣的朋友。
2006年,看雪論壇中關於.NET的討論漸成氣候,大家明顯感覺到國內在這方面與國外的差距很大,於是經看雪學院支持,將其論壇里在.NET程式加密解密上起步較早的朋友們集合起來,組成“.NET逆向小組”。小組成立以後,大家暢所欲言,互相交流,這段時間也成為小組每個成員成長進步最快的階段,談論的話題也已從簡單的MSIL修改與編譯的“高層次”深入到.NET核心的掛鈎與元數據結構的“低層次”上了。
也就是在這一年,看雪學院組織的《加密與解密》第三版的編寫啟動了實質性工作,並計畫在其中加入一個章節討論.NET程式的加密與解密。正在西藏支邊的我,空閒時間相對較多,於是毛遂自薦,希望負責該章節的編寫。想不到看雪學院很爽快地答應下來,這也給了我很大的鼓勵。寫作過程從開始到結束並不長,原因是這些年已經積累了一些.NET程式加密解密方面的資料,再加上國內外尚沒有專門討論該話題的書籍出現,因此寫起來倒也算輕鬆。唯一遺憾的是,看雪學院只給了50頁的版面,因此有許多內容被忍痛割愛、再三精簡,還有一些知識點根本沒有寫進去。2007年,在《加密與解密》第三版一書的.NET章節——.NET平台加解密完稿交付的同時,我就決定:單獨寫一本討論.NET軟體加密與解密問題的書。
本書從開始編寫到出版,前後共經歷近兩年的時間。這段時間恰是.NET保護技術飛速發展的兩年,因此在寫作過程中,我不斷地修改內容,力爭將.NET保護的最新發展囊括進來。一個人的力量總是有限的,於是我又積極地尋求小組成員的幫助,多虧他們無私地將自己的成果奉獻出來,才使我得以將精力專注於書籍本身而不是無休止地進行程式分析與調試。所以,讀者手中的這本書,內容全面、深淺適宜,是國內眾多.NET好手智慧的結晶。

本書的特點

我對這本書的整體結構及包含的內容是下了一番工夫琢磨的。首先,我想書在難度上要由淺入深,既讓初次接觸.NET的讀者有耐心和信心讀下去,又要讓熟悉.NET高層開發的讀者能了解相當底層的知識,總體難度為中等偏上。其次,我非常注意可操作性,這是加密解密書籍的重要特點,讀者跟著書中的示例及說明進行操作,便可更加牢固和深入掌握知識點。其三是知識點的完備性,本書基本涵蓋了目前.NET程式加密與解密領域的所有知識點並能突出重點,因此既可順序閱讀,也可作為手冊隨時查閱。
關於加密解密的學習要注意兩點:一是知識點的掌握,二是方法的掌握,且後者更重要。讀者在閱讀本書時,一定要注意體會書中的操作技巧,學會舉一反三,方能以不變應萬變。
某位大牛說過,技巧與技術是不同的。而本書介紹的都是技巧,因此如何將這些技巧轉換為技術,則要靠各位讀者自己不懈的努力了。
對讀者的要求
本書是針對有一定Win 32和.NET編程和加密解密經驗的讀者而寫的。其中,Win32加密解密的基礎知識可以從看雪學院的《加密與解密》第三版中獲得,而.NET程式設計的書籍市面上比比皆是,讀者可自行選擇。
.NET是跨層次的平台,因此對讀者的語言要求比較特殊。高層次平台中,讀者應熟悉C#或VB.NET等面向.NET的託管程式設計語言;底層調試中,又要求讀者熟悉C++、ASM等Win 32程式語言。如果有餘力,可以再學習C++/CLI,它是託管與非託管混合編程的語言,對理解.NET平台的底層運行是非常有幫助的。
本書適合以下讀者:
 希望通過學習.NET框架底層知識,提高自身軟體開發水平的.NET程式設計師;
 希望了解.NET加密解密基本原理,以選擇合適的.NET保護程式的程式設計師或公司;
 對軟體加密與解密感興趣,並希望了解.NET程式逆向分析技術的讀者。
最後,英語雖不是必需,但在這些年的實踐中,我深深感到語言的差異嚴重影響了知識的普及,而且很好地掌握英語會讓讀者在成長路上如虎添翼,因此建議每一名讀者要學好計算機英語。
關於配套下載檔案
本書涉及的所有實例和代碼檔案可以到博文視點主頁下載,檔案下載:http//broadview.com.cn。大部分代碼均在2.0版.NET框架下使用Visual Studio 2005編譯,讀者也可以選擇最新的Visual Studio 2008。代碼選擇的語言主要為C++和C#,少部分為C++/CLI。
本書配套下載檔案中還提供了部分需要使用的逆向分析工具、以前沒有提供的工具以及現有工具的最新版。
致謝
感謝看雪學院的大力支持,您是我能寫完本書的第一動力。
感謝博文視點的畢寧、顧慧芳兩位老師為本書的寫作與出版付出的辛勤勞動。
感謝看雪論壇.NET逆向小組的所有同事,特別是inraining、dreaman、rick、tracky、MegaX、Wickg Hu在.NET加密解密核心技術上的無私分享。
感謝家人對我的支持,在生活上為我分擔了無數煩惱。
技術支持
雖然我已竭盡全力力求書中的內容及下載檔案內容的準確性,但限於水平,錯誤在所難免。因此,我會在Blog及看雪論壇中發布本書的更正內容,也歡迎各位讀者就書中內容及.NET逆向技術發表看法,進行討論。本書筆者意在拋磚引玉,若能激起大家對.NET軟體安全問題的關注和交流,並藉此結識更多的朋友,那么投入的時間與精力也就值了。
看雪學院:http://www.pediy.com
作者Blog:http://vxer.cn/blog
單海波
2008年5月

目 錄

第一部分 基 礎 篇
第1章 微軟.NET框架基本原理 2
1.1 什麼是.NET 2
1.2 編寫第一個.NET程式 3
1.2.1 .NET開發環境 3
1.2.2 程式的編譯 5
1.3 逆向第一個.NET程式 8
1.3.1 用ildasm反編譯.NET程式 8
1.3.2 反編譯的結果:MSIL與元數據 10
1.3.3 用ilasm進行再編譯 11
1.4 程式的運行:CLR與JIT 12
1.5 小結 16
第2章 MSIL中間語言 17
2.1 MSIL語言基礎 17
2.1.1 IL程式基本結構 17
2.1.2 2.0版IL支持的新特性 19
2.1.3 一個完整的代碼示例 21
2.2 MSIL的運行機制:堆疊機 23
2.3 MSIL指令 25
2.3.1 流程控制指令 25
2.3.2 算術指令 27
2.3.3 參數、局部變數與欄位定址指令 32
2.3.4 方法調用 34
2.3.5 類與值類型操作指令 37
2.3.6 向量操作指令 39
2.4 小結 42
第3章 PE結構擴展與元數據 43
3.1 .NET對PE結構的擴展 43
3.2 元數據及其結構 46
3.2.1 什麼是元數據 46
3.2.2 元數據的存儲形式(1):堆 47
3.2.3 元數據的存儲形式(2):表 49
3.2.4 元數據的Signature 58
3.3 元數據的標識及其解碼 60
3.4 元數據的驗證 63
3.5 小結 65
第二部分 分 析 篇
第4章 靜態分析技術 68
4.1 靜態反編譯軟體 68
4.1.1 Reflector的使用 68
4.1.2 Dis#的使用 72
4.1.3 其他反編譯軟體 75
4.2 代碼修改技術 78
4.3 代碼復用技術 80
4.4 混合編譯程式的靜態分析 82
4.5 .NET程式本地化技術 86
4.5.1 基礎知識 86
4.5.2 利用可視化工具的本地化 88
4.5.3 利用MSIL的本地化 89
4.6 小結 91
第5章 動態調試技術 92
5.1 .NET動態調試的分類 92
5.2 混合模式調試 93
5.2.1 GuiDbg的套用 94
5.2.2 PeBrowseDbg的套用 99
5.3 本地調試 104
5.3.1 OLLYDBG的套用 105
5.3.2 WinDbg的套用 109
5.4 小結 116
第三部分 保 護 篇
第6章 強名稱保護 118
6.1 給程式簽署強名稱 118
6.1.1 什麼是強名稱 118
6.1.2 單個程式集的簽署 119
6.1.3 引用有強名稱的程式集 123
6.2 強名稱的去除和替換 125
6.2.1 去除和替換強名稱的原理 125
6.2.2 利用工具的自動實現 126
6.3 代碼與強名稱的結合 128
6.4 小結 131
第7章 名稱混淆 132
7.1 名稱混淆的基本原理 132
7.2 手動實現名稱混淆 133
7.3 名稱混淆的局限性 139
7.4 常見名稱混淆形式 140
7.5 反名稱混淆的一般方法 143
7.6 小結 145
第8章 流程混淆 146
8.1 流程混淆的基本原理 146
8.2 常見流程混淆的方式:基於跳轉的混淆 148
8.2.1 代碼塊的易位 149
8.2.2 連續跳轉 151
8.2.3 跳轉表 153
8.2.4 邏輯跳轉 154
8.2.5 switch跳轉 157
8.3 流程混淆的擴展:語法混淆 160
8.3.1 讓堆疊溢出 160
8.3.2 利用高級語言不支持的語法 161
8.3.3 利用高級語言間的語法差異 166
8.3.4 利用反編譯引擎的缺陷 167
8.3.5 插入無效指令編碼 170
8.4 反流程混淆的一般方法 171
8.5 小結 173
第9章 輔助保護手段 174
9.1 用戶字元串編碼 174
9.1.1 一般編碼 175
9.1.2 使用強名稱的編碼 176
9.2 給程式集添加錯誤元數據 180
9.2.1 #GUID堆大小錯誤 180
9.2.2 TypeDef的Extends項錯誤 181
9.2.3 利用PE結構 182
9.2.4 添加多個Module 184
9.3 打包 186
9.4 特殊的.NET屬性 189
9.5 利用系統特性 192
9.6 小結 193
第10章 殼保護 194
10.1 什麼是程式集整體保護 194
10.2 純.NET實現的壓縮殼 195
10.3 基於Win32的殼 201
10.4 掛鈎核心的殼 205
10.5 什麼是基於每個方法的保護 216
10.5.1 常見的掛鈎形式 217
10.5.2 更進一步的保護 222
10.5.3 實現方式 223
10.5.4 一般分析方法 225
10.6 小結 226
第11章 其他保護方式 227
11.1 許可證保護 227
11.1.1 許可證機制簡介 227
11.1.2 .NET許可證機制的擴展 231
11.1.3 一般分析方法 236
11.2 算法的運用 237
11.2.1 .NET提供的算法空間 238
11.2.2 對稱算法的.NET實現 239
11.2.3 非對稱算法的.NET實現 243
11.2.4 數字簽名的.NET實現 247
11.3 虛擬機保護 248
11.4 編譯為本地代碼 250
11.5 動態方法委託調用 254
11.6 小結 260
第四部分 擴 展 篇
第12章 非託管API 262
12.1 非託管API綜述 262
12.2 宿主API 263
12.3 合成API 267
12.4 強名稱API 271
12.5 元數據API 273
12.6 分析API 283
12.7 小結 293
第13章 MONO、SSCLI與.NET核心調試 294
13.1 MONO簡介 294
13.2 SSCIL簡介 300
13.3 .NET框架核心調試 306
13.4 小結 309
第14章 Win64平台上的.NET 310
14.1 64位編程的一般性問題 310
14.2 C++編程的改變 311
14.2.1 彙編級的改變 313
14.2.2 .NET編程的改變 317
14.3 64位PE結構 317
14.4 64位.NET程式調試 320
14.5 小結 327
附錄A 元數據表 328
參考文獻 340

文摘

第一部分 基礎篇
第1章 微軟.N ET框架基本原理
了解.NET框架的程式運行原理及代碼編寫方法是學習.NET加密與解密的基礎。本章不去長篇大論“什麼是.NET”,因為大多數編程書籍已將這個問題解釋得很清楚了,從加密與解密的角度幫助讀者了解.NET框架才是本章的核心內容。
接下來的內容將以四步走的形式介紹:通過編譯第一個.NET程式,學習SDK的基本使用,對.NET程式的運行有感性認識;通過反編譯,學習ildasm的使用,掌握.NET逆向的初步技巧;通過修改IL代碼並再次編譯,對MSIL語言和元數據有初步認識;最後,在以上三步的基礎上,理解.NET框架最重要的兩個概念:CLR與JIT。
1.1 什麼是.NET
.NET是架構於作業系統之上的平台,它是一套虛擬機,其核心功能由一系列運行在用戶層(RING3層)的DLL檔案實現。相對於讀者已經非常熟悉的Win32平台,或是尚未普及的、Win64平台,.NET是既有聯繫又有區別。聯繫是指,.NET框架構建在Win32/64平台之上,它的核心程式是一系列運行於用戶層的DLL,這就決定了.NET的核心實現仍是基於win32/64;區別是指,傳統用戶層DLL(如Kernel32.dU、user32.dll等)的主要功能是提供API,而同樣是由DLL實現的,NET功能要強大得多,它提供了一套完整的程式開發框架,包括新的程式語言、新的程式運行方式、新的服務等,這些都遠遠超過API涵蓋的範圍。從上述區別方面來說,可以將.NET當作一個全新的平台來學習。
如果讀者熟悉Java或者虛擬機的概念,那么理解.NET會非常容易。如果讀者是個新手,也不用擔心,只要把握住以下三個.NET最重要的特性。
(1)統一了程式語言。過去,不同程式語言間的協作總有著或多或少的兼容性問題,使用比較麻煩。.NET則統一了程式語言:無論程式是用c#,還是c++,或是VB編寫,最終都被編譯為.NET中間語言MSIL(簡稱IL)。這種統一對程式開發的貢獻不言而喻,但同時也方便了軟體逆向:無須再分別為每一種語言單獨編寫反編譯器。

相關詞條

熱門詞條

聯絡我們