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