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符号执行求解

相关推荐
ttk21919 分钟前
【算法练习】归并排序和归并分治
数据结构·c++·算法·排序算法
本道自然37 分钟前
stm32wb55rg (3) 点亮LED
stm32·单片机·嵌入式硬件
梁辰兴1 小时前
数据结构:实验7.3Huffman树与Huffman编码
数据结构·c++·算法·c
乌鸦9442 小时前
《数据结构之美--二叉树oj题练习》
数据结构·#二叉树练习
梦境虽美,却不长2 小时前
51单片机快速入门之 SPI通信 2025年4月29日09:26:32
单片机·嵌入式硬件·51单片机·spi通信
keep intensify3 小时前
数据结构---单链表的增删查改
c语言·数据结构·c++·经验分享·学习·算法·分享
s9123601013 小时前
Rust Ubuntu下编译生成环境win程序踩坑指南
windows·ubuntu·rust
opple663 小时前
力扣-数据结构-二叉树
数据结构·算法·leetcode
光子物联单片机3 小时前
GD32F407单片机开发入门(十七)内部RTC实时时钟及实战含源码
stm32·单片机·嵌入式硬件·mcu·gd32单片机
.似水4 小时前
2025.4.26_STM32_SPI
stm32·单片机·嵌入式硬件