主页 > 游戏开发  > 

Windows逆向工程入门之MASM数据结构使用

Windows逆向工程入门之MASM数据结构使用
公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页

目录

第一章: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 ; 八进制表示法

存储特征对比矩阵:​

类型位宽值域范围机器码示例内存布局模式SBYTE8-128~12788 FF补码存储WORD160~65535B8 00 01小端序SDWORD32-2147483648~2147483647C7 45 FC FF FF FF扩展符号位REAL864±1.7E±308 (精确到15位小数)66 0F 28 05IEEE-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 STRUCT pid DWORD ? ppid DWORD ? flags BYTE ? _align BYTE 3 DUP(?) ; 结构体对齐填充 name QWORD ? ProcessInfo ENDS ; 嵌套结构应用 ThreadStruct STRUCT proc 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 RVA DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; // DLL名称RVA DWORD 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符号执行求解
标签:

Windows逆向工程入门之MASM数据结构使用由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Windows逆向工程入门之MASM数据结构使用