当前位置: 首页 > article >正文

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] ; 基址偏移访问

逆向识别技巧:​

  1. 查找跨函数数据引用(XREF)
  2. 分析初始化代码段(.data节区)
  3. 跟踪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]      ; 调用第三个虚函数

虚表重建步骤:​

  1. 定位对象实例首地址
  2. 追踪虚表指针的交叉引用
  3. 重建虚函数地址列表
  4. 分析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符号执行求解


http://www.kler.cn/a/569317.html

相关文章:

  • 数据挖掘与数据分析
  • 【前端知识】Vue2.x与3.x之间的区别以及升级过程需要关注的地方
  • 数据结构(初阶)(七)----树和二叉树(堆,堆排序)
  • 【3天快速入门WPF】13-MVVM进阶
  • LeetCode 二分章节 (持续更新中)
  • 代码随想录算法训练营第三十天 | 卡码网46.携带研究材料(二维解法)、卡码网46.携带研究材料(滚动数组)、LeetCode416.分割等和子集
  • 探索AIGC的核心原理与应用前景
  • 【开源免费】基于SpringBoot+Vue.JS酒店管理系统(JAVA毕业设计)
  • 攻防世界WEB(新手模式)17-fileclude
  • 大语言模型中的 Token:它们是什么,如何工作?
  • Storm实时流式计算系统(全解)——下
  • 【C#】合理使用DeepSeek相关AI应用为我们提供强有力的开发工具,在.net core 6.0框架下使用JsonNode动态解析json字符串,如何正确使用单问号和双问号做好空值处理
  • 2025国家护网HVV高频面试题总结来了02(题目+回答)
  • 数据集笔记:新加坡停车费
  • Java8面试
  • 记录一次FastDFS内部文件迁移过程
  • 【网络安全 | 扫描子域+发现真实IP】CloakQuest3r安装使用详细教程
  • Apifox 2月更新|调试 AI 接口时展示思考过程,团队内支持共享数据库连接
  • ES from size聚合查询10000聚合查询,是每个分片先聚合,再统计。还是所有节点查询1万条后,再聚合
  • Ubuntu下QT安装和调试的常见问题(二)__cannot__find__IGL