- 公开视频 -> 链接点击跳转公开课程
 - 博客首页 -> 链接点击跳转博客主页
 
目录
第一章: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符号执行求解