- 公開視頻 ->?鏈接點擊跳轉公開課程
- 博客首頁 ->????鏈接點擊跳轉博客主頁
目錄
第一章:MASM數據定義體系精要
1.1 基礎數據類型全景
1.1.1 整型數據規范
1.1.2 浮點數據編碼
1.2 復合數據結構
1.2.1 多維數組定義
1.2.2 復雜結構體
第二章:逆向工程數據結構重建
2.1 PE文件數據段逆向
2.1.1 全局變量定位
2.1.2 導入表解析
2.2 運行時數據結構
2.2.1 堆內存結構
2.2.2 線程環境塊(TEB)
第三章:高級逆向技術專題
3.1 虛函數表逆向
3.1.1 C++對象模型
3.2 反匯編對抗技術
3.2.1 控制流混淆
3.2.2 數據混淆
第一章:MASM數據定義體系精要
1.1 基礎數據類型全景
1.1.1 整型數據規范
; 標準定義語法
var_raw BYTE 0CCh ; 原始字節定義
var_signed SWORD -32768 ; 帶符號最大值
var_hex DWORD 0DEADBEEFh ; 十六進制表示法
var_oct QWORD 177777q ; 八進制表示法
存儲特征對比矩陣:?
類型 | 位寬 | 值域范圍 | 機器碼示例 | 內存布局模式 |
---|---|---|---|---|
SBYTE | 8 | -128~127 | 88 FF | 補碼存儲 |
WORD | 16 | 0~65535 | B8 00 01 | 小端序 |
SDWORD | 32 | -2147483648~2147483647 | C7 45 FC FF FF FF | 擴展符號位 |
REAL8 | 64 | ±1.7E±308 (精確到15位小數) | 66 0F 28 05 | IEEE-754標準 |
1.1.2 浮點數據編碼
fp_32 REAL4 3.1415926 ; 單精度浮點
fp_64 REAL8 2.7182818284 ; 雙精度浮點
fp_80 REAL10 1.6180339887 ; 擴展精度
IEEE-754編碼詳解:?
-
單精度浮點(REAL4):
- 符號位(1) + 指數位(8) + 尾數位(23)
- 偏移值:127 → 實際指數=存儲值-127
- 示例:0.15625 → 0_01111100_01000000000000000000000
-
擴展雙精度(REAL10):
- 顯式整數位設計(與x87 FPU兼容)
- 指數偏移值:16383 → 支持更大數值范圍
1.2 復合數據結構
1.2.1 多維數組定義
; 二維數組定義技巧
matrix DWORD 3 DUP(5 DUP(0)) ; 3行5列零矩陣
access_example:mov eax, matrix[ebx*4 + esi] ; 訪問matrix[row][col]
內存布局驗證:?
00403000: 00 00 00 00 00 00 00 00 00 00 00 00... ; 15個DWORD零值
1.2.2 復雜結構體
ProcessInfo STRUCTpid DWORD ?ppid DWORD ?flags BYTE ?_align BYTE 3 DUP(?) ; 結構體對齊填充name QWORD ?
ProcessInfo ENDS; 嵌套結構應用
ThreadStruct STRUCTproc ProcessInfo <>tid DWORD ?status DWORD ?
ThreadStruct ENDS
內存對齊規則:?
- 自然對齊原則:成員偏移量必須為類型大小的整數倍
- 手動填充技巧:使用BYTE數組補足對齊間隙
- 編譯器差異:MASM與MSVC對齊策略對比(/Zp參數)
第二章:逆向工程數據結構重建
2.1 PE文件數據段逆向
2.1.1 全局變量定位
; 典型全局變量訪問模式
mov eax, [00403000h] ; 絕對地址訪問
lea esi, [ebx+GlobalVarOffset] ; 基址偏移訪問
逆向識別技巧:?
- 查找跨函數數據引用(XREF)
- 分析初始化代碼段(.data節區)
- 跟蹤API參數中的常量地址
2.1.2 導入表解析
// IMAGE_IMPORT_DESCRIPTOR結構
typedef struct _IMAGE_IMPORT_DESCRIPTOR {DWORD OriginalFirstThunk; // INT RVADWORD TimeDateStamp;DWORD ForwarderChain;DWORD Name; // DLL名稱RVADWORD FirstThunk; // IAT RVA
} IMAGE_IMPORT_DESCRIPTOR;
動態IAT修改檢測:?
- 對比內存IAT與磁盤IAT差異
- 檢查跳轉指令(JMP [IAT])完整性
- 監控LoadLibrary/GetProcAddress調用
2.2 運行時數據結構
2.2.1 堆內存結構
// Windows堆塊結構(HEAP_ENTRY)
struct _HEAP_ENTRY {WORD Size; // 塊大小(含頭)WORD PreviousSize; // 前塊大小BYTE SegmentIndex;BYTE Flags;DWORD UnusedBytes;
};
堆溢出漏洞模式:?
- 覆蓋相鄰堆塊頭部信息
- 破壞空閑鏈表結構
- 利用Unlink操作寫入任意地址
2.2.2 線程環境塊(TEB)
; TEB關鍵成員訪問
mov eax, fs:[18h] ; 獲取當前TEB地址
mov ecx, [eax+30h] ; 獲取PEB地址
mov edx, [eax+20h] ; 獲取ClientId
關鍵偏移解析:?
+0x000 NtTib : _NT_TIB
+0x018 EnvironmentPointer : Ptr32 Void
+0x020 ClientId : _CLIENT_ID
+0x030 ActiveRpcHandle : Ptr32 Void
+0x034 ThreadLocalStorage : Ptr32 Void
第三章:高級逆向技術專題
3.1 虛函數表逆向
3.1.1 C++對象模型
; 典型虛函數調用
mov eax, [ecx] ; 獲取虛表指針
call [eax+10h] ; 調用第三個虛函數
虛表重建步驟:?
- 定位對象實例首地址
- 追蹤虛表指針的交叉引用
- 重建虛函數地址列表
- 分析RTTI信息(若有)
3.2 反匯編對抗技術
3.2.1 控制流混淆
; 動態計算跳轉目標
call $+5
pop eax
add eax, 15h
jmp eax
反制策略:?
- 動態調試跟蹤執行流
- 使用符號執行恢復路徑
- 二進制插樁記錄跳轉軌跡
3.2.2 數據混淆
// 加密字符串存儲
char encrypted_str[] = {0xA1,0xB2,0xC3,0x00};void decrypt(char* str) {for(int i=0; str[i]; ++i)str[i] ^= 0x55;
}
自動化識別方法:?
- 查找連續異或操作模式
- 檢測解密函數特征(循環結構+位操作)
- 使用angr符號執行求解