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

embedded/2025/3/4 2:10:39/
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

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

逆向识别技巧:​

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

虚表重建步骤:​

  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.ppmy.cn/embedded/169774.html

相关文章

leetcode第40题组合总和Ⅱ

原题出于leetcode第40题https://leetcode.cn/problems/combination-sum-ii/题目如下&#xff1a; 给定一个候选人编号的集合 candidates &#xff08;candidate中有重复的元素&#xff09;和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合…

GPT 与BERT的异同

1.什么是BERT&#xff1a; BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种预训练语言表示模型&#xff0c;由Jacob Devlin、Ming-Wei Chang、Kenton Lee和Kristina Toutanova在2019年提出。BERT的核心思想是通过在大量未标注文本…

0x01 html和css

css 对于三种css使用方式&#xff1a; 第一种&#xff1a;行内样式 <span style"color: grey;">2024年05月15日 20:07</span>第二种&#xff1a;内部样式 <!DOCTYPE html> <html lang"en"> <head>...<style>span{…

DevOps原理和实现面试题及参考答案

解释 DevOps 的核心目标与文化价值观,如何理解 “CAMS” 模型? DevOps 的核心目标是打破开发(Development)和运维(Operations)之间的壁垒,通过自动化、协作和持续反馈,实现软件的快速、可靠交付,以更好地满足业务需求和客户期望。具体来说,DevOps 旨在缩短软件的交付…

对话式AI引擎:DeepSeek技术引领多模态交互新篇章

摘要 DeepSeek技术公司推出了一项创新服务——“对话式AI引擎”&#xff0c;仅需两行代码即可激活任意大型AI模型的语音对话功能。这项技术使得文本型AI模型迅速转变为具备实时语音对话能力的多模态交互模型&#xff0c;解决了大型AI模型在语音交互方面的不足&#xff0c;为AI行…

Linux mkdir 命令

Linux mkdir&#xff08;英文全拼&#xff1a;make directory&#xff09;命令用于创建目录。 语法 mkdir [-p] dirName 参数说明&#xff1a; -p 确保目录名称存在&#xff0c;不存在的就建一个。 实例 在工作目录下&#xff0c;建立一个名为 runoob 的子目录 : mkdir …

微信小程序自定义导航栏实现指南

文章目录 微信小程序自定义导航栏实现指南一、自定义导航栏的需求分析二、代码实现1. WXML 结构2. WXSS 样式样式解析:3. JavaScript 逻辑三、完整代码示例四、注意事项与优化建议五、总结微信小程序自定义导航栏实现指南 在微信小程序开发中,默认的导航栏样式可能无法满足所…

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…