第一章 本冊程式修正與檔案存取
1.1 增加 config.h
1.2 改變金鑰變數的存取方式
1.3 改變全域變數 gbDecryptFlag 的存取方式
1.4 增加金鑰檔案的存取函式 - WanaFile
1.4.1 獲取特殊目錄絕對路徑的API - SHGetFolderPath
1.4.2 金鑰檔的定義
1.4.3 RES 檔
1.4.4 取得「我的勒索文件」絕對路徑 - WanaDirName
1.4.5 建立「我的勒索文件」- CreateWanaDir
1.4.6 取得「我的勒索文件」裡的檔案的完整路徑 - WanaFileName
1.4.7 讀取「我的勒索文件」裡的檔案內容 - ReadWanaFile
1.4.8 寫入「我的勒索文件」裡的檔案 - WriteWanaFile
1.4.9 讀取 RES 檔
1.4.10 定義存取巨集
1.4.11 銷毀解密金鑰 - WanaDestroyKey
第二章 多工篇
2.1 程序 - Process
2.1.1 程序是載入記憶體的執行檔
2.1.2 父程序產生子程序的 API - CreateProcess
2.1.3 子程序結束的 API - ExitProcess
2.1.4 子程序離開的方式比較 - ExitProcess vs. exit
2.1.5 父程序等待單一子程序的 API - WaitForSingleObject
2.1.6 範例程式 - LaunchIE
2.2 執行緒 - Thread
2.2.1 多工的基礎
2.2.2 產生執行緒的 API - CreateThread
2.2.3 離開執行緒的 API - ExitThread
2.2.4 離開執行緒的比較 - ExitThread vs return
2.2.5 勒索程式裡的執行緒
2.3 執行緒同步問題
2.3.1 「同時」共用「相同資源」而產生的問題
2.3.2 解決同步問題的機制
2.3.3 臨界區域 - Critical Section
2.3.4 互斥鎖 - Mutex
2.3.5 號誌 - Semaphore
2.3.6 事件 - Event
2.3.7 綜合範例程式 - DecQueue
2.4 勒索程式加密器製作
2.4.1 以互斥鎖確保只有一個勒索程式執行
2.4.2 定時檢查解密金鑰是否解密
2.4.3 定時更新 00000000.res
2.4.4 實行全系統加密
2.4.5 監視隨身碟隨時加密
第三章 網路篇
3.1 Socket 簡介
3.1.1 勒索病毒與網路
3.1.2 通訊協定 TCP/IP 的誕生
3.1.3 日常生活的比喻
3.2 Socket API
3.2.1 Winsock2 引入檔
3.2.2 註冊動態連結函式庫的 API - WSAStartup
3.2.3 網路位址及通訊埠轉換的 API - getaddrinfo
3.2.4 釋放 addrinfo 結構的 API - freeaddrinfo
3.2.5 開啟 socket 的 API - socket
3.2.6 設定 socket 選項的 API - setsockopt
3.2.7 綁定通訊埠的 API - bind
3.2.8 設定等候連線的 queue 的 API - listen
3.2.9 客戶端連線的 API - connect
3.2.10 伺服器端接受連線的 API - accept
3.2.11 傳送訊息的 API - send
3.2.12 接收訊息的 API - recv
3.2.13 斷開通訊的 API - shutdown
3.2.14 關閉 socket 的 API - closesocket
3.2.15 最後清理 Winsock DLL 的 API - WSACleanup
3.3 Socket 範例程式
3.3.1 客戶端程式
3.3.2 伺服器端程式
3.4 Socket 傳輸的注意事項
3.4.1 SendAll - 完整傳送訊息
3.4.2 RecvAll - 完整接收訊息
3.5 勒索程式解密伺服器製作
3.5.1 由回音伺服器修改而來的主程式
3.5.2 讀取客戶端傳來的已加密私鑰
3.5.3 準備解密器並匯入解密金鑰
3.5.4 將私鑰解密
3.5.5 已解密的私鑰傳送回客戶端
3.5.6 與客戶端中斷連線
3.6 勒索程式解密客戶端 - 快速伺服器連線秘技
3.6.1 伺服器 IP
3.6.2 問題的根源 - 逾時時間太久
3.6.3 製作快速連線的函式 - CreateSocket
3.6.4 改變 socket 輸出入模式的 API - ioctlsocket
3.6.5 檢測一個或多個 socket 狀態的 API - select
3.6.6 實作 CreateSocket
3.6.7 取得當前電腦的IP - GetLocalIP
3.6.8 將私鑰解密的客戶端 - DecryptClient
3.6.9 私鑰解密的執行緒 - DecryptClientThread
第四章 視窗篇
4.1 圖形使用者介面
4.2 控制元件與訊息
4.2.1 輸出文字的 API - DrawText
4.2.2 產生字型的 API - CreateFont
4.2.3 產生控制元件的 API - CreateWindow
4.2.4 傳送訊息的 API - SendMessage
4.2.5 以 CreateWindowEx 產生元件範例
4.3 資源
4.3.1 資源的建立
4.3.2 勒索程式的桌面圖片
4.3.3 資源的取得
4.3.4 取出資源 - RetrieveResource
4.3.5 配置記憶體取出資源 - AllocResource
4.3.6 根據資源 ID 設定桌面 - SetWanaDesktop
4.3.7 將勒索程式的 Q&A 放進資源
第五章 視窗篇 - 主對話框
5.1 勒索程式主對話框
5.1.1 勒索程式的對話框
5.1.2 產生對話框的 API - DialogBox
5.2 產生及設定字型
5.2.1 簡易字型巨集 - DefaultFont
5.2.2 在對話框宣告字型
5.2.3 給元件設定字型 - WM_SETFONT 訊息
5.2.4 由 HWND 取得 Resource ID 的API - GetDlgItem
5.2.5 刪除物件的 API - DeleteObject
5.3 漸層進度條
5.3.1 裝置內容 - Device Context 介紹
5.3.2 取得預設物件的 API - GetStockObject
5.3.3 選擇物件的 API - SelectObject
5.3.4 產生畫筆的 API - CreatePen
5.3.5 產生筆刷的 API - CreateSolidBrush
5.3.6 畫出漸層條 - DrawProgressBar
5.3.7 設定計時器的 API - SetTimer
5.3.8 取消計時器的 API - KillTimer
5.3.9 接收計時器訊息 - WM_TIMER 訊息
5.3.10 設定計時器更新進度條
5.3.11 靜態元件更新 - WM_CTLCOLORSTATIC 訊息
5.4 文字及背景顏色設定
5.4.1 對話框背景顏色設定
5.4.2 元件的文字背景顏色設定
5.5 顯示期限日期及倒數時間
5.5.1 取得時間的 API - time
5.5.2 轉換當地時間的 API - localtime_s
5.5.3 輸出日期時間到文字元件 - SetDateTime
5.5.4 輸出倒數時間到文字元件 - SetTimeLeft
5.6 啟動瀏覽器
5.7 Check Payment 及 Decrypt 按鈕
5.8 Copy 鈕與剪貼簿
5.8.1 配置 heap 記憶體的 API - GlobalAlloc
5.8.2 鎖定記憶體的 API - GlobalLock
5.8.3 解除鎖定記憶體的 API - GlobalUnlock
5.8.4 開啟剪貼簿的 API - OpenClipboard
5.8.5 清空剪貼簿的 API - EmptyClipboard
5.8.6 設置剪貼簿內容的 API - SetClipboardData
5.8.7 關閉剪貼簿的 API - CloseClipboard
5.8.8 勒索程式裡的 Copy 鈕
5.9 編輯框顯示 Bitcoin 帳戶
5.10 顯示 Q&A - RichEdit 及 ComboBox
5.10.1 由 RichEdit 顯示文件
5.10.2 設定 ComboBox 選項
第六章 視窗篇 - Check Payment 對話框
6.1 Check Payment 對話框
6.2 進度顯示 - Progress Bar
6.2.1 透過 SendMessage 設定進度條相關參數
6.2.2 用進度條顯示 DecryptClient 進度
6.3 取消鈕 - EndDialog
第七章 視窗篇 - Decrypt 對話框
7.1 Decrypt 對話框
7.2 設定文字及背景顏色
7.3 解密目錄選擇 - ComboBox
7.3.1 定義選項
7.3.2 取得既定目錄路徑的 API - SHGetKnownFolderPath
7.4 列出解密檔案 - ListBox
7.4.1 由DECQUEUE 取得解密檔名
7.4.2 將解密檔名傳到 ListBox - LB_ADDSTRING 訊息
7.4.3 選擇項目 - LB_SETCURSEL 訊息
7.5 檔名複製 - ListBox and Clipboard
7.5.1 取得 ListBox 項目長度 - LB_GETTEXTLEN 訊息
7.5.2 取得 ListBox 項目 - LB_GETTEXT 訊息
7.5.3 取得 ListBox 項目並設定剪貼簿
第八章 蠕蟲篇
8.1 模擬漏洞
8.1.1 有漏洞才有蠕蟲
8.1.2 蠕蟲的行為
8.1.3 WannaCry 入侵簡述(選讀)
8.1.4 模擬後門
8.2 模擬蠕蟲
第九章 完整原始程式及解說
9.1 base
9.1.1 config.h
9.2 Common
9.2.1 Common\ezfile.h
9.2.2 Common\ezfile.cpp
9.2.3 Common\hexdump.h
9.2.4 Common\hexdump.cpp
9.2.5 Common\ie.h
9.2.6 Common\ie.cpp
9.2.7 Common\socktool.h
9.2.8 Common\socktool.cpp
9.3 EZCrypt
9.3.1 EZCrypt\EZAES.h
9.3.2 EZCrypt\EZAES.cpp
9.3.3 EZCrypt\EZHybrid.h
9.3.4 EZCrypt\EZHybrid.cpp
9.3.5 EZCrypt\EZRC4.h
9.3.6 EZCrypt\EZRC4.cpp
9.3.7 EZCrypt\EZRSA.h
9.3.8 EZCrypt\EZRSA.cpp
9.4 WannaTry
9.4.1 WannaTry\keys.h
9.4.2 WannaTry\PriKey.cpp
9.4.3 WannaTry\PubKey.cpp
9.4.4 WannaTry\WanaFile.h
9.4.5 WannaTry\WanaFile.cpp
9.4.6 WannaTry\FileList.h
9.4.7 WannaTry\FileList.cpp
9.4.8 WannaTry\WanaZip.h
9.4.9 WannaTry\WanaZip.cpp
9.4.10 WannaTry\WanaEncryptor.h
9.4.11 WannaTry\WanaEncryptor.cpp
9.4.12 WannaTry\WanaDecryptor.h
9.4.13 WannaTry\WanaDecryptor.cpp
9.4.14 WannaTry\WanaProc.h
9.4.15 WannaTry\WanaProc.cpp
9.5 Decryptor
9.5.1 Decryptor\DecQueue.h
9.5.2 Decryptor\DecQueue.cpp
9.5.3 Decryptor\Decryptor.h
9.5.4 Decryptor\Decryptor.cpp
9.5.5 Decryptor\resource.h
9.5.6 Decryptor\Decryptor.rc
9.5.7 Decryptor\rsctool.h
9.5.8 Decryptor\rsctool.cpp
9.6 Server
9.6.1 Server\Server.cpp
9.7 Hole & Worm
9.7.1 Hole\Hole.h
9.7.2 Hole\Hole.cpp
9.7.3 Worm\WormProc.h
9.7.4 Worm\WormProc.cpp
9.7.5 Worm\Worm.cpp
附錄 A Visual Studio 專案
A.1 選擇右邊的「建立新的專案」
A.2 選擇「Windows 傳統型應用程式」
A.3 填上你的專案名稱,然後按下「建立」鈕
A.4 產生基本架構程式
附錄 B Windows 傳統應用程式基礎架構
B.1 主程式(程式進入點)- wWinMain
B.2 註冊視窗類別 - MyRegisterClass
B.3 產生視窗及初始化 - InitInstance
B.4 處理訊息的 Call Back 函式 - WndProc
B.5 對話框範例 - About
附錄 C 以資源編輯器來編輯對話框
C.1 在方案編管找到資源檔
C.2 滑鼠右鍵選擇加入
C.3 選擇「Dialog」
C.4 出現空白對話框
C.5 調整對話框大小
C.6 左側工具箱選擇元件
C.7 選擇元件放到對話框上
C.8 調整元件位置和大小
C.9 元件的位置和大小
附錄 D 主對話框元件參數
D.1 主對話框視窗參數
D.2 主對話框文字元件參數
D.3 勒索程式 Q&A 訊息 - RichEdit
D.4 主對話框按鈕元件參數
D.5 主對話框編輯框元件參數
D.6 主對話框圖片元件參數
D.7 主對話框勒索 Q&A 語系選擇
D.8 主對話框 Group Box 元件參數
D.9 漸層進度條
附錄 E Check Payment 對話框元件參數
E.1 Check Payment 對話框參數
E.2 Cancel 按鈕元件參數
E.3 進度條元件參數
E.4 文字元件參數
附錄 F Decrypt 對話框元件參數
F.1 Decrypt 對話框視窗參數
F.2 ComboBox 元件參數
F.3 按鈕元件參數
F.4 文字元件參數
F.5 ListBox 元件參數
附錄 G 模擬勒索程式建置測試流程
G.1 駭客電腦和受害者電腦的準備
G.2 建置專案產生各執行檔
G.3 受害電腦的準備工作
G.4 勒索程式開始攻擊
G.5 進行解密