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

相关推荐
hello_lain22 分钟前
9.1 简单排序(冒泡、插入)(排序(上))
c语言·数据结构·算法·排序算法
啊我不会诶34 分钟前
【数据结构】字典树
数据结构·算法
是大强43 分钟前
嵌入式开发中用于调试的技术Semihosting
单片机·嵌入式硬件
信奥卷王44 分钟前
[GESP202403 五级] 成绩排序
数据结构·算法
非凡ghost1 小时前
Hard Disk Sentinel(固态硬盘监控) 多语便携版
windows·sentinel·软件需求
btyzadt1 小时前
计算机域与工作组详解
运维·windows·计算机
RaLi和夕2 小时前
嵌入式学习笔记4.STM32中断系统及外部中断EXTI
笔记·stm32·单片机·学习
瓢儿菜20182 小时前
【Proteus8.17仿真】 STM32仿真 0.96OLED 屏幕显示ds1302实时时间
stm32·单片机·嵌入式硬件
充哥单片机设计2 小时前
【STM32项目开源】基于STM32的工地环境监测系统
stm32·单片机·嵌入式硬件
速易达网络3 小时前
树莓派点亮LED灯
单片机·嵌入式硬件