揭開隱藏在視窗底下的封鎖危機
若想要了解駭客,研究電腦病毒是一個不錯的方式。病毒的設計,充滿了駭客天馬行空的想像及創意。尤其是歷史悠久的病毒,那更是經過好幾代不斷地精心修改,簡直可以說是千錘百鍊的藝術品。
這麼多病毒,為何選擇勒索病毒?其實,是它的鮮紅色的畫面吸引了我的注意。勒索病毒至今已有30年歷史,到目前仍困擾許多人們,其獨特之處值得作為研究的對象。本書將逐步重現勒索病毒的全貌,其中駭客的思路和創意,相信會帶給讀者相當大的啟發,並希望透過閱讀之後都能獲得滿滿的收獲。
製作出一隻勒索病毒,需要多少知識?翻開這本書,你想知道的答案都在裡面。
作者
北極星
一群浪人,愛好資訊安全與駭客技術。
書籍勘誤、與作者交流,請加入通往駭客之路粉絲團:
www.facebook.com/groups/TaiwanHacker/
序/導讀
目錄
第○章 本書大綱
0.1 本書的章節內容
0.2 Windows API 的函式名問題
0.3 星星
0.4 善用虛擬機
Part I 熱身篇
第一章 熱身一下
1.1 Visual Studio 的 hexdump
1.2 主控台應用程式
1.3 Hexdump
1.4 ASCII
1.5 Debug 模式
1.6 巨集定義
1.7 顯示記憶體 - hexdump.cpp
1.8 運用 ASCII 的小程式(選讀)
1.9 微軟的變數命令
Part II 基礎篇
第二章 記憶體管理
2.1 記憶體
2.1.1 堆積(Heap)
2.1.2 堆疊(Stack)
2.2 記憶體配置
2.2.1 記憶體配置函式 - HeapAlloc
2.2.2 釋放記憶體 - HeapFree
2.3 常用的記憶體函式
2.3.1 複製記憶體內容 - CopyMemory
2.3.2 填滿記憶體 - FillMemory
2.3.3 將記憶體清為0 - ZeroMemory
第三章 基本目錄處理
3.1 目錄處理API
3.1.1 複製檔案 - CopyFile
3.1.2 刪除檔案 - DeleteFile
3.1.3 移動檔案 - MoveFile
3.1.4 取得檔案屬性 - GetFileAttributes
3.1.5 設定檔案屬性 - SetFileAttributes
3.2 目錄掃瞄
3.2.1 開始掃瞄目錄 - FindFirstFile
3.2.2 掃瞄目錄 - FindNextFile
3.2.3 目錄掃瞄結束 - FindClose
3.3 磁碟機
3.3.1 取得邏輯磁碟機資訊 - GetLogicalDrives
3.3.2 取得磁碟機型態 - GetDriveType
3.4 全系統掃瞄範例
第四章 基本檔案處理
4.1 檔案開啟創建與關閉
4.1.1 開啟檔案 - CreateFile
4.1.2 舊版開啟檔案- OpenFile(參考,此函式不建議使用)
4.1.3 關閉檔案 - CloseHandle
4.2 讀寫檔案內容
4.2.1 讀取檔案 - ReadFile
4.2.2 寫入檔案 - WriteFile
4.3 檔案相關資訊
4.3.1 取得檔案時間 - GetFileTime
4.3.2 設定檔案時間 - SetFileTime
4.3.3 讀取、設定檔案時間的範例
4.4 檔案讀寫位置
4.4.1 改變讀寫檔案的位置 - SetFilePointer
4.4.2 進階改變讀寫檔案位置 - SetFilePointerEx
4.4.3 取得檔案讀取位置 - GetFilePointerEx
4.5 綜合練習 - ezfile.cpp
4.5.1 直接由檔案讀取到記憶體 - ReadBuffer
4.5.2 直接將記憶體寫進檔案 - WriteBuffer
4.5.3 如何知道讀寫了什麼
4.5.4 將檔案徹底刪除
4.5.5 更新檔案屬性
4.5.6 假刪除檔案及假回復檔案
Part III 密碼篇
第五章 邏輯運算與加密
5.1 邏輯運算
5.2 二值邏輯
5.3 基本邏輯運算子
5.3.1 AND 運算
5.3.2 OR 運算
5.3.3 NOT 運算
5.3.4 AND 與 OR 無法用於加密
5.4 XOR 邏輯運算子
5.4.1 XOR 運算
5.4.2 XOR 的特性
5.5 三值邏輯(純閒聊,可跳過)
第六章 RC4 加密演算法
6.1 XOR 簡易加密法
6.1.1 XOR 加密法簡述
6.1.2 XOR 加密範例程式
6.2 RC4 加密演算法
6.2.1 RC4 介紹
6.2.2 串流加密與區塊加密
6.2.3 RC4 與加殼
6.2.4 RC4 加密流程說明
6.3 C/C++ 範例程式
6.3.1 S-Box 初始化第一階段
6.3.2 S-Box 初始化第二階段
6.3.3 正式加密
6.3.4 實行加密和解密
第七章 BCrypt 函式庫
7.1 Microsoft 密碼函式庫
7.1.0 實作RC4 加密類別需要用到的 BCrypt 函式
7.1.1 開啟演算法提供者 - BCryptOpenAlgorithmProvider
7.1.2 產生對稱式金鑰 - BCryptGenerateSymmetricKey
7.1.3 加密 - BCryptEncrypt
7.1.4 解密 - BCryptDecrypt
7.1.5 銷毀金鑰 - BCryptDestroyKey
7.1.6 關閉演算法提供者 - BCryptCloseAlgorithmProvider
7.2 BCrypt 版的RC4
7.3 RC4 加密類別實作 - EZRC4.cpp
7.3.1 定義與宣告 - EZRC4.h
7.3.2 建構子 - EZRC4::EZRC4
7.3.3 解構子 - EZRC4::~EZRC4
7.3.4 產生金鑰 - EZRC4::GenKey
7.3.5 加密 - EZRC4::Encrypt
7.3.6 解密 - EZRC4::Decrypt
第八章 AES 對稱式加密演算法
8.1 區塊加密法
8.2 區塊加密法的模式
8.2.1 ECB - 電子密碼本模式
8.2.2 CBC - 密碼區塊連結模式
8.2.3 PCBC - 明文密碼塊連結
8.2.4 CFB - 密文回饋模式
8.2.5 OFB - 輸出回饋模式
8.2.6 CTR - 計數器模式
8.3 AES 加密演算法用到的 BCrypt 函式
8.3.1 開啟演算法提供者 - BCryptOpenAlgorithmProvider
8.3.2 取得內部參數 - BCryptGetProperty
8.3.3 產生對稱式金鑰 - BCryptGenerateSymmetricKey
8.3.4 加密 - BCryptEncrypt
8.3.5 解密 - BCryptDecrypt
8.3.6 銷毀金鑰 - BCryptDestroyKey
8.3.7 關閉演算法提供者 - BCryptCloseAlgorithmProvider
8.4 AES 加密法類別 - EZAES.cpp
8.4.1 定義與宣告 - EZAES.h
8.4.2 建構子 - EZAES::EZAES
8.4.3 解構子 - EZAES::~EZAES
8.4.4 產生金鑰 - EZAES::GenKey
8.4.5 記憶體加密 - EZAES::Encrypt
8.4.6 記憶體解密 - EZAES::Decrypt
第九章 加密基礎之數學篇
9.1 密碼保護資料,誰來保護密碼?
9.2 非對稱式加密法
9.2.1 RSA 密碼演算法
9.2.2 公鑰和私鑰
9.3 公開金鑰密碼的原理
9.3.1 餘數運算
9.3.2 指數運算
9.4 演算法的數學理論
9.5 簡化的演算步驟
9.6 實際計算示範
9.6.1 計算金鑰
9.6.2 實測金鑰
第十章 RSA 加密演算法
10.1 RSA 加密法運用的 BCrypt 函式
10.1.1 開啟演算法提供者 - BCryptOpenAlgorithmProvider
10.1.2 生非對稱式金鑰 - BCryptGenerateKeyPair
10.1.3 生非對稱式金鑰結束 - BCryptFinalizeKeyPair
10.1.4 加密 - BCryptEncrypt
10.1.5 解密 - BCryptDecrypt
10.1.6 銷毀金鑰 - BCryptDestroyKey
10.1.7 關閉演算法提供者 - BCryptCloseAlgorithmProvider
10.1.8 金鑰的匯出與匯入
10.1.9 將金鑰匯出 - BCryptExportKey
10.1.10 將非對稱式金鑰匯入 - BCryptImportKeyPair
10.2 RSA 加密法類別 - EZRSA.cpp
10.2.1 定義與宣告 - EZRSA.h
10.2.2 建構子 - EZRSA::EZRSA
10.2.3 解構子 - EZRSA::~EZRSA
10.2.4 產生金鑰 - EZRSA::GenKey
10.2.5 從記憶體匯入金鑰 - EZRSA::Import
10.2.6 從檔案匯入金鑰 - EZRSA::Import
10.2.7 將金鑰匯出至記憶體 - EZRSA::Export
10.2.8 將金鑰匯出至檔案 - EZRSA::Export
10.2.9 記憶體加密 - EZRSA::Encrypt
10.2.10 記憶體解密 - EZRSA::Decrypt
10.2.11 比對公鑰和私鑰 - ::RSAKeyMatch
第十一章 混合式加密
11.1 加密法的優先點
11.1.1 對稱式密碼的優缺點
11.1.2 非對稱式密碼的優缺點
11.2 混合式加密法類別 - EZHybrid.cpp
11.2.1 加密檔格式
11.2.2 定義與宣告 - EZHybrid.h
11.2.3 亂數產生 - ::GenRandom
11.2.4 建構子 - EZHybrid::EZHybrid
11.2.5 解構子 - EZHybrid::~EZHybrid
11.2.6 產生RSA 金鑰 - EZHybrid::GenKey
11.2.7 從記憶體匯入公鑰 - EZHybrid::ImportPublicKey
11.2.8 從記憶體匯入私鑰 - EZHybrid::ImportPrivateKey
11.2.9 從檔案匯入公鑰 - EZHybrid::ImportPublicKey
11.2.10 從檔案匯入私鑰 - EZHybrid::ImportPrivateKey
11.2.11 混合式密碼的加密 - EZHybrid::Encrypt
11.2.12 混合式密碼的解密 - EZHybrid::Decrypt
Part IV 加密篇
第十二章 掃描與檔案加密策略
12.1 時間就是金錢,駭客最懂
12.2 目錄過濾
12.3 檔案型態的分類
12.4 檔案大小分級
12.5 檔案型態與大小綜合評判
12.5.1 來回四趟處理
12.5.2 檔案型態與大小決定先後
12.6 大型檔案的預處理
12.6.1 預處理
12.6.2 預處理加密
12.7 鏈結串列介紹
12.7.1 鏈結串列(Linked List)
12.7.2 單向鏈結串列(Singly Linked List)
12.7.3 環狀單向鏈結串列(Circular Singly Linked List)
12.7.4 雙向鏈結串列(Doubly Linked List)
12.7.5 環狀雙向鏈結串列(Circular Doubly Linked List)
12.8 檔案資訊 - FileInfo.cpp
12.8.1 定義與宣告 - FileInfo.h
12.8.2 FileNode - 鏈結串列節點
12.8.3 FileList - 檔案資訊鏈結串列
12.8.4 建構子 - FileList::FileList
12.8.5 解構子 - FileList::~FileList
12.8.6 增加新資料到鏈結串列 - FileList::Insert
12.8.7 忽略不處理的目錄 - ::isIgnorePath
12.8.8 檔案型態分類 - ::ClassifyFileType
第十三章 混合式加密- 改
13.1 簡單的動作卻如此致命
13.2 加密檔格式
13.3 勒索程式的混合式加密 - WanaZip.cpp
13.3.1 定義與宣告 - WanaZip.h
13.3.2 WanaZip -混合式加密- 改的類別
13.3.3 亂數產生器 - ::GenRandom
13.3.4 建構子 - WanaZip::WanaZip
13.3.5 解構子 - WanaZip::~WanaZip
13.3.6 從記憶體匯入公鑰 - WanaZip::ImportPublicKey
13.3.7 從記憶體匯入私鑰 - WanaZip::ImportPrivateKey
13.3.8 從檔案匯入公鑰 - WanaZip::ImportPublicKey
13.3.9 從檔案匯入私鑰 - WanaZip::ImportPrivateKey
13.3.10 加密與預處理 - WanaZip::Encrypt
13.3.11 解密 - WanaZip::Decrypt
第十四章 勒索程式加密流程
14.1 勒索程式加密類別 - WanaEncryptor.cpp
14.1.1 定義與宣告 - WanaCryptor.h
14.1.2 建構子 - WanaCryptor::WanaCryptor
14.1.3 解構子 - WanaCryptor::~WanaCryptor
14.1.4 準備WANNATRY 目錄 - WanaCryptor::Init
14.1.5 準備RSA 金鑰 - WanaCryptor::SetupRSA
(節錄)