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

目录

第一章:MASM数据定义体系精要

[1.1 基础数据类型全景](#1.1 基础数据类型全景)

[1.1.1 整型数据规范](#1.1.1 整型数据规范)

[1.1.2 浮点数据编码](#1.1.2 浮点数据编码)

[1.2 复合数据结构](#1.2 复合数据结构)

[1.2.1 多维数组定义](#1.2.1 多维数组定义)

[1.2.2 复杂结构体](#1.2.2 复杂结构体)

第二章:逆向工程数据结构重建

[2.1 PE文件数据段逆向](#2.1 PE文件数据段逆向)

[2.1.1 全局变量定位](#2.1.1 全局变量定位)

[2.1.2 导入表解析](#2.1.2 导入表解析)

[2.2 运行时数据结构](#2.2 运行时数据结构)

[2.2.1 堆内存结构](#2.2.1 堆内存结构)

[2.2.2 线程环境块(TEB)](#2.2.2 线程环境块(TEB))

第三章:高级逆向技术专题

[3.1 虚函数表逆向](#3.1 虚函数表逆向)

[3.1.1 C++对象模型](#3.1.1 C++对象模型)

[3.2 反汇编对抗技术](#3.2 反汇编对抗技术)

[3.2.1 控制流混淆](#3.2.1 控制流混淆)

[3.2.2 数据混淆](#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 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符号执行求解

相关推荐
蒙奇D索大13 分钟前
【数据结构】图论进阶:生成树、生成森林与权值网络的终极解析
数据结构·考研·图论·改行学it
爱coding的橙子18 分钟前
蓝桥杯备赛 Day16 单调数据结构
数据结构·c++·算法·蓝桥杯
建筑玩家23 分钟前
FPGA实现按键切换流水灯不同亮灭模式
单片机·fpga开发
wuqingshun31415933 分钟前
经典算法 约数之和
数据结构·c++·算法·蓝桥杯
yyywxk1 小时前
Linux / Windows 下 Mamba / Vim / Vmamba 安装教程及安装包索引
linux·windows·vim
十五年专注C++开发1 小时前
QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理
开发语言·数据结构·c++·qt·设计模式
嵌入式仿真实验教学平台2 小时前
嵌入式仿真实验教学平台的核心优势再解析:对比Proteus的技术与教学价值突破
人工智能·单片机·嵌入式硬件·学习·proteus·嵌入式实时数据库
柏木乃一3 小时前
双向链表增删改查的模拟实现
开发语言·数据结构·算法·链表
阿波c麻了5 小时前
第十五届单片机模拟考试III
单片机·嵌入式硬件
天天爱吃肉82188 小时前
【国产工具链发展,生态链分析,TSMaster VS Zcanpro的技术对比】
单片机·嵌入式硬件·汽车·学习方法