0205、Windows 逆向入门:寄存器、标志位与内存基础
返回:Windows 逆向入门篇 · Windows 逆向总目录
这一部分开始真正进入 CPU 状态:寄存器保存当前执行环境,标志位保存运算结果特征,内存保存代码和数据。逆向时看懂这三类信息,就能知道程序“现在执行到哪里、刚才算出了什么、接下来会跳到哪里”。
1、内容范围
小节
内容
复盘点
02.5
寄存器
通用寄存器、段寄存器、指令指针寄存器
02.6
通用寄存器对应关系
EAX/AX/AH/AL、RAX/EAX/AX/AL 的包含关系
02.7
寄存器包含关系测试
修改低位寄存器对高位的影响
02.8
段寄存器特性
CS/DS/SS/ES/FS/GS 的基本用途
02.9
指令指针寄存器
EIP/RIP 保存下一条指令地址
03.0 - 03.8
标志寄存器
CF、PF、AF、ZF、SF、DF、OF 与 EFLAGS
03.9 - 04.4
内存基础
内存特性、内存管理、端序、读写和寻址
2、通用寄存器寄存器是 CPU 内部速度最快的小容量存储区域。入门阶段先掌握常见用途,不必一开始背完整架构手册。
x86
常见用途
x64 对应
...
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 - ...
0206、Windows 逆向入门:汇编框架与基础指令
返回:Windows 逆向入门篇 · Windows 逆向总目录
这一部分把汇编从“单条指令”放回“程序框架”里看。逆向时不只要知道 add 是加法,还要知道代码段、数据段、入口点、调用 API 和程序退出之间的关系。
1、内容范围
小节
内容
复盘点
04.5
C 语言控制台程序
高级语言程序的入口、调用和退出
04.6
汇编程序框架
数据段、代码段、入口点、调用 API
04.7
程序指令集
指令、操作数、寄存器和内存
04.8
工作模式
实模式、保护模式、用户态理解
04.9
动态调用与函数声明
API 声明、导入与调用
05.0 - 05.3
段定义与入口周期
数据段、代码段、入口点
05.4 - 06.5
算术与位运算
ADD、SUB、MUL、DIV、AND、OR、XOR、NOT
06.6 - 06.8
操作数与调试
操作数类型、课程路线和 VS 调试
2、C 控制台程序与汇编框架C 程序通常从 main 开始,但真正的进程入口还包括运行库初始化。入门阶段可以先把它简化成:
1程序入口 -> 初始化运行环境 -> 调用 ...
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 ...
0118、安全开发篇(三):函数增强与封装入门
返回:C++ 面向对象基础目录 · 安全开发总目录
这一章一半是函数增强,一半是封装入门。函数增强让 C++ 接口更灵活;封装则把数据和行为放到一起,为后面的对象模型、构造析构和多态打基础。
3.2 默认参数默认参数让调用者可以省略常用值。
12345#include <iostream>void connect(const std::string &host, int port = 80) { std::cout << host << ":" << port << std::endl;}
复盘重点:默认参数通常写在声明处,不要在声明和定义里重复写不同默认值。
3.3 函数重载函数重载允许同名函数根据参数列表区分。
12int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; }
能否重载
原因
参数个 ...





