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

server/2025/2/28 9:40:49/
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

第一章: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/server/171265.html

相关文章

VidSketch:具有扩散控制的手绘草图驱动视频生成

浙大提出的VidSketch是第一个能够仅通过任意数量的手绘草图和简单的文本提示来生成高质量视频动画的应用程序。该方法训练是在单个 RTX4090 GPU 上进行的&#xff0c;针对每个动作类别使用一个小型、高质量的数据集。VidSketch方法使所有用户都能使用简洁的文本提示和直观的手绘…

计算机毕设-基于springboot的融合多源高校画像数据与协同过滤算法的高考择校推荐系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

国内访问Github的四种方法(2025版)

声明&#xff1a;以下内容&#xff0c;仅供学习使用&#xff0c;不得他用。如有他用&#xff0c;与本文作者无关。 国内访问GitHub及下载文件的解决方案整理如下&#xff0c;结合最新技术方案和实测有效方法&#xff1a; 一、网络层解决方案 Hosts文件修改法 通过DNS查询工具…

关于Postman自动获取token

在使用postman测试联调接口时&#xff0c;可能每个接口都需要使用此接口生成的令牌做Authorization的Bearer Token验证&#xff0c;最直接的办法可能会是一步一步的点击&#xff0c;如下图&#xff1a; 在Authorization中去选择Bearer Token&#xff0c;然后将获取到的token粘贴…

2.27-1笔记1

一、新建表 二、建表语句 create table student( id int primary key , name char(20), sex char(10), age int(3), mobile char(20), class char(10), english int(10), chinese int(10), math int(10) )engineinnodb default charsetutf8; insert into student values (1,小…

嵌入式硬件篇---常用的汇编语言指令

文章目录 前言汇编语言简介1. 数据传送指令MOVPUSHPOPXCHG 2. 算术运算指令ADDSUBMULDIVINCDEC 3. 逻辑运算指令ANDORXORNOTSHL/SHR 4. 控制转移指令JMPCALLRETJE/JZJNE/JNZJG/JNLEJL/JNGE 5. 比较与测试指令CMPTEST 6. 标志寄存器操作指令STCCLCSTDCLD 7. 字符串操作指令MOVSL…

高效获取淘宝商品信息、数据、价格和销量API接口的实践指南

在电商领域&#xff0c;获取商品的详细信息&#xff08;如价格、销量、库存等&#xff09;对于市场分析、商品选品、库存管理和价格监控等场景至关重要。淘宝开放平台提供了丰富的API接口&#xff0c;帮助开发者和商家高效获取这些数据。本文将详细介绍如何使用淘宝API接口获取…

从“Switch-case“到“智能模式“:C#模式匹配的终极进化指南

当代码开始"思考" 你是否厌倦了层层嵌套的if-else地狱&#xff1f;是否想过让代码像侦探推理一样优雅地解构数据&#xff1f;C#的模式匹配正是这样一把瑞士军刀&#xff0c;从C# 7.0到C# 12&#xff0c;它已悄然进化成改变编程范式的利器。 一、模式匹配的三重境界…