0207、Windows 逆向入门:堆栈、CALL/RET 与函数逆向
返回:Windows 逆向入门篇 · Windows 逆向总目录
这一部分围绕“函数怎么被调用、参数怎么传、返回地址怎么保存”。理解堆栈之后,调试器里的调用栈、返回地址、局部变量、参数、异常回溯就都能串起来。
1、内容范围
小节
内容
复盘点
06.9
线程栈结构
栈顶、栈底、增长方向和线程私有栈
07.0 - 07.3
PUSH/POP/PUSHAD/POPAD/PUSHFD/POPFD
保存数据、寄存器和标志位
07.4
CALL 与 RET
返回地址、函数入口、返回流程
07.5
MOV
数据移动和参数/局部变量访问
07.6
REP 与 STOS
字符串/批量内存操作
07.7 - 07.9
函数调用堆栈图
栈帧、嵌套调用、回溯
08.5 - 08.9
参数、返回值和调用约定
参数位置、返回寄存器、还原代码
2、线程栈结构每个线程都有自己的栈。栈常用于保存函数参数、返回地址、局部变量和保存现场。
1234567高地址 ... 参数 返回地址 保存的 EBP/R ...
0209、Windows 逆向入门:数据、全局变量与编码逆向
返回:Windows 逆向入门篇 · Windows 逆向总目录
这一部分专门复盘“数据如何在二进制里表现”。同一串字节,可能是整数、小数、字符、指针、结构体字段或机器指令。逆向时要结合上下文解释字节,而不是看到十六进制就直接下结论。
1、内容范围
小节
内容
复盘点
09.4
整数类型数据传输 MOV
数据宽度、寄存器和内存
09.5
有符号整数存储与端序
补码、小端序、符号解释
09.6
整数数据溢出
截断、回绕、标志位
09.7
MOVZX / MOVSX
零扩展和符号扩展
09.8
全局变量与局部变量特征
地址区域、访问方式、生命周期
09.9
PE 节区转文件数据并修改
文件偏移和内存地址关系
10.0 - 10.3
小数编码与指令
IEEE、FPU、SSE、AVX 入门
10.4 - 10.8
字符编码与字符串指令
区域设置、截断、MOVS/STOS/LODS
10.9 - 11.1
数字与字符安全
编码、校验和安全边界
2、MOV 与数据宽度mov 只是搬运数据,不关心语义。真正决定语义的是宽 ...
0208、Windows 逆向入门:DBG/IDA 与函数结构分析
返回:Windows 逆向入门篇 · Windows 逆向总目录
这一部分从“看指令”进入“用工具复盘函数结构”。IDA 偏静态分析,DBG/x64dbg/WinDbg 偏动态调试。两者结合,才能把函数边界、交叉引用、参数、返回值和调用栈看清楚。
1、内容范围
小节
内容
复盘点
08.0
代码堆栈回溯栈帧
从栈帧定位调用链
08.1
模块符号信息解析
PDB、符号名和模块信息
08.2
DBG 工具下载与配置
调试器环境、符号路径、插件
08.3 / 09.0
DBG 逆向调试技巧
断点、单步、内存、寄存器
08.4
IDA 交叉引用回溯
Xref、函数调用关系
08.5 - 08.9
函数参数与返回分析
栈参数、寄存器返回、调用约定
09.1 - 09.3
还原思路与堆栈逃逸
控制流、栈异常、线程栈信息
2、IDA 静态分析IDA 更适合先看整体结构。
功能
用途
Functions
查看函数列表
Strings
查找字符串入口
Imports
查看导入 API
Xrefs
追踪谁引用了 ...
0210、Windows 逆向入门:条件、分支与循环逆向
返回:Windows 逆向入门篇 · Windows 逆向总目录
这一部分把高级语言里的 if、switch、循环还原成汇编中的比较、测试、条件跳转和无条件跳转。控制流能看懂,逆向时就能画出程序逻辑图。
1、内容范围
小节
内容
复盘点
11.2 - 11.9
基础指令补充
ADD/SUB/MUL/DIV/AND/OR/NOT/XOR/CMP
12.0
TEST
位测试和空值判断
12.1
JCC
条件跳转和标志位
12.2 - 12.6
IF/三目/多条件
条件分支结构
12.7 - 13.1
SWITCH
跳转表、中转索引和折半查找
13.2 - 13.3
LOOP/REP
循环计数和重复前缀
13.4 - 13.8
FOR/WHILE/DOWHILE
循环结构、continue/break
13.9
缓冲区溢出案例
只做原理和边界复盘
2、CMP 与 TESTcmp a, b 本质是计算 a - ...
0124、安全开发篇(四):类模板与 string
返回:C++ 泛型编程目录 · 安全开发总目录
这一章从类模板进入 STL 和 string。模板解决“同一套类逻辑适配多种类型”,string 则是 C++ 中最常用的字符串工具。安全复盘时,重点看模板实例化、分文件编写、字符串边界、输入读取和编码问题。
2.0 类模板成员函数定义类模板的成员函数通常也要写在头文件里,因为编译器需要看到完整模板定义才能实例化。
123456789template <typename T>class Box {public: explicit Box(T value) : value(value) {} T get() const { return value; }private: T value;};
2.1 类模板继承中的规则类模板可以继承普通类,也可以被普通类或模板类继承。关键是派生类必须知道基类模板参数。
123456789template <typename T>class Base {public: T value;& ...
0127、安全开发篇(四):异常处理
返回:C++ 泛型编程目录 · 安全开发总目录
这一章整理异常处理。C 语言通常靠返回值、错误码和宏定位问题;C++ 增加了异常机制,可以把错误沿调用链向上传播。安全开发里异常不是“偷懒不判断错误”,而是要让错误路径可控、资源能释放、日志能复盘。
6.1 C 预定义宏C/C++ 提供一些预定义宏,适合写日志和调试信息。
宏
含义
__FILE__
当前文件名
__LINE__
当前行号
__DATE__
编译日期
__TIME__
编译时间
__FUNCTION__
当前函数名,常见编译器支持
1234#include <iostream>#define LOG(msg) \ std::cout << __FILE__ << ":" << __LINE__ << " " << msg << std::endl
6.3 C 错误规避C 风格错误处理常用返回值。
123456int read_config(cons ...
0125、安全开发篇(四):vector、deque 与 list
返回:C++ 泛型编程目录 · 安全开发总目录
这一章整理三类顺序容器:vector、deque、list。它们接口看起来相似,但内存布局完全不同。安全复盘重点是容量、迭代器失效、边界访问和插入删除成本。
3.4 vector 特性解析vector 是连续动态数组,支持随机访问,尾部追加效率高。
特性
说明
连续内存
适合和 C API、二进制缓冲区交互
动态扩容
容量不够时重新分配
随机访问
v[i] 快
中间插入删除
需要移动元素
3.5 vector 对象初始化123std::vector<int> a;std::vector<int> b(5, 1);std::vector<int> c = {1, 2, 3};
3.6 vector 内存布局vector 通常维护三个关键信息:起始位置、当前结束位置、容量结束位置。扩容后旧指针和迭代器可能全部失效。
3.7 vector 大小函数
函数
作用
size()
当前元素个数
capacity()
当前已分配容量
empty( ...
0126、安全开发篇(四):set、pair 与 map
返回:C++ 泛型编程目录 · 安全开发总目录
这一章整理关联容器:set、pair、map。它们的核心是“按键组织数据”,适合做去重、索引、配置表、统计表和对象映射。
5.3 set 存储规则set 保存唯一元素,并按比较规则排序。
1std::set<int> ids = {3, 1, 2, 2};
最终只有 1,2,3。
5.4 set 大小替换set 不能像数组一样通过下标修改元素,因为修改可能破坏排序规则。通常要先删除再插入。
12ids.erase(2);ids.insert(20);
5.5 set 重复元素set 会自动去重;如果需要允许重复,用 multiset。
容器
是否允许重复
set
不允许
multiset
允许
5.6 set 查找计数12345if (ids.find(3) != ids.end()) { std::cout << "exists\n";}std::cout << ids.count(3) << s ...
0117、安全开发篇(三):引用与内存管理
返回:C++ 面向对象基础目录 · 安全开发总目录
这一章从 C 的指针过渡到 C++ 的引用和资源管理。引用让参数传递更自然,new/delete 让对象生命周期更灵活,智能指针则是后面写安全 C++ 代码时应该优先考虑的工具。
2.0 指针与引用引用可以理解成对象的别名。它不像指针那样保存一个可以随时改的地址,而是初始化后绑定到某个对象。
对比
指针
引用
是否可为空
可以为空
正常引用不应为空
是否可改指向
可以
初始化后不能改绑
使用语法
*p / p->
像普通变量一样
适合场景
可选对象、动态对象、数组遍历
参数传递、别名、返回对象
2.1 引用基本特性引用必须初始化,之后它就是原对象的另一个名字。
12345678910#include <iostream>int main() { int value = 10; int &ref = value; ref = 20; std::cout << value << std::endl; retu ...
0120、安全开发篇(三):运算符重载、继承与多态
返回:C++ 面向对象基础目录 · 安全开发总目录
这一章是 C++ 面向对象最接近逆向分析的一部分:对象布局、继承层次、虚函数表和动态绑定都会在二进制里留下痕迹。学习时既要能写语法,也要能想象对象在内存中的样子。
6.6 - 7.6 运算符重载运算符重载让自定义类型也能使用 +、==、[]、<< 等语法。它应该让代码更自然,而不是制造难懂的副作用。
1234567891011121314151617181920212223#include <iostream>class Point {public: Point(int x, int y) : x(x), y(y) {} Point operator+(const Point &other) const { return Point(x + other.x, y + other.y); } bool operator==(const Point &other) const { re ...





