0204、Windows 逆向入门:环境、语言映射与数据表示
返回:Windows 逆向入门篇 · Windows 逆向总目录 · 网络安全学习主页
1.3 概念—机器语言 & 汇编语言
amd - intel - 指令集 - CPU机器语言
机器语言:CPU 唯一能够直接识别和执行的语言,由二进制(0/1)组成。
汇编语言:使用助记符(ADD、SUB 等)代替机器语言(0111…),提高程序可读性。
机器语言 ⇄ 汇编语言:一一对应(1:1),汇编语言需经过汇编器转换后才能被 CPU 执行。
关系:汇编语言(ADD) → 汇编器(Assembler) → 机器语言(011100…) → CPU 执行
1.4 概念—汇编语言 & 高级语言
高级语言(如 C 语言)更接近人的思维,易于编写和维护。
编译器(Compiler)负责将高级语言翻译成汇编语言或机器语言。
执行流程:高级语言 → 编译器(Compiler)→ 汇编语言 → 汇编器(Assembler)→ 机器语言 → CPU
12345678910#include <stdio.h>int main(){ ...
0123、安全开发篇(四):模板基础
返回:安全开发篇(四)汇总 · Ferry 学院安全开发总目录 · 网络安全学习主页
这一部分先整理 C++ 模板基础。
模板是 C++ 泛型编程的核心。它让我们写一份逻辑,适配多种类型;但模板不是运行时的“万能函数”,而是编译期根据实际类型生成对应代码。理解这一点,后面看 STL、容器、迭代器和模板错误信息会轻松很多。
1.0 泛型编程概念泛型编程关注的是“算法和类型分离”。同样的逻辑,不希望为 int、double、std::string 分别写一遍。
比如交换两个变量:
12345678910111213void swap_int(int &a, int &b){ int temp = a; a = b; b = temp;}void swap_double(double &a, double &b){ double temp = a; a = b; b = temp;}
这两个函数逻辑完全一样,只是类型不同。模板可以把类型抽象出来。
1234567template ...
0116、安全开发篇(三):C++ 入门与命名空间
返回:安全开发篇(三)汇总 · Ferry 学院安全开发总目录 · 网络安全学习主页
这一部分先从 C++ 的入口知识开始。
如果说 C 更接近“函数 + 数据 + 内存”,那么 C++ 在这个基础上加入了更强的组织能力:命名空间、引用、类、对象、构造析构、继承和多态。第一部分先不急着进入类,先把 C++ 程序的基本框架、输入输出、命名空间和自动类型推断整理清楚。
1.0 C++ 特性C++ 可以看成是在 C 的基础上增加了面向对象、泛型编程、异常处理、标准库和更强类型系统的语言。
方向
C++ 补充的能力
代码组织
namespace、类、访问权限、成员函数
面向对象
封装、继承、多态、构造函数、析构函数
内存管理
new/delete、RAII、智能指针
函数能力
默认参数、函数重载、内联函数、模板、回调
类型系统
引用、const、auto、类型推导
标准库
iostream、string、容器、算法、迭代器
和 C 的关系C++ 不是把 C 扔掉,而是保留了大量 C 的语法和底层能力。指针、数组、结构体、函数、内存布局这些内容仍然重要。
...
0111、安全开发篇(二):入口函数与参数传递
返回:安全开发篇(二)汇总 · Ferry 学院安全开发总目录 · 网络安全学习主页
这一部分从入口函数和函数参数开始。
第一篇已经会写 main、普通函数和指针了;第二篇要往下追一层:程序真正从哪里进来,main 的参数是谁传的,函数调用时栈里发生了什么,为什么在 IDA 和调试器里能回溯到入口和调用链。
1.0 汇编眼中的入口函数参数平时写 C 程序,常把 main 当成程序入口。
1234int main(void){ return 0;}
但从操作系统和运行库角度看,程序并不是一上来就直接执行这几行源码。通常会先经过运行库启动代码,完成一些初始化,然后再调用用户写的 main。
入口层次
层次
说明
系统入口
操作系统加载程序后进入的启动位置
运行库入口
完成 C/C++ 运行环境初始化
用户入口
调用用户写的 main 或 WinMain
函数返回
main 返回值最终会被传给运行库和系统
从汇编角度看,函数参数不是凭空出现的,它们会按照调用约定,通过寄存器或栈传给被调用函数。
现在先建立直觉:源码里的 ma ...
0110、安全开发篇(二):C/C++ 进阶提升
返回:Ferry 学院安全开发总目录 · 网络安全学习主页
这一篇开始进入 C/C++ 进阶提升。相比第一篇的语法入门,这一篇更靠近安全开发真正需要反复复盘的部分:入口函数、调用堆栈、调用约定、指针高级用法、堆内存、文件读写和项目组织。
1、学习定位第一篇解决的是“能写出 C 语言基础代码”,第二篇要解决的是“能理解程序怎么运行”。
这里的重点不是把语法再背一遍,而是把源码、汇编、栈、堆、指针、文件和项目流程串起来。后面做逆向、调试、内存分析和安全工具开发时,这一篇会经常回看。
2、章节目录
编号
章节
主要内容
笔记
0111
01 入口函数与参数传递
main 参数、调用堆栈、IDA/DBG 回溯、函数声明、分文件、值传递、地址传递、寄存器与线程栈
0111
0112
02 调用栈与函数高级
汇编指令、函数调用堆栈、调用约定、堆栈平衡、宏函数、数组/结构体参数、可变参数、printf 原理、变量内存布局
0112
0113
03 内存管理与指针限定
内存属性探测、void 指针、堆区管理、内存回收、设置内存、const 指针组合、 ...
0122、安全开发篇(四):C++ 泛型编程详解
返回:Ferry 学院安全开发总目录 · 网络安全学习主页
这一篇进入 C++ 泛型编程和 STL。
前面的面向对象解决“如何把数据和行为组织成对象”,泛型编程则解决“如何把一套逻辑适配多种类型”。模板、容器、迭代器和异常处理在 C++ 项目里非常常见;对安全开发来说,重点不是只会调用接口,而是理解模板展开、容器内存布局、迭代器失效、边界检查和异常传播。
1、学习定位泛型编程复盘时要同时看三层:
层次
重点
语法层
函数模板、类模板、模板特化、默认模板参数、STL 容器接口
编译层
模板实例化、类型推导、重载匹配、分文件编写问题
内存层
string/vector/deque/list/set/map 的存储方式、迭代器和对象生命周期
后面看 C++ 程序、逆向 STL 容器、定位越界或迭代器失效问题时,这一篇会很值得回看。
2、章节目录
编号
章节
主要内容
笔记
0123
01 模板基础
泛型编程概念、函数模板、模板底层原理、函数模板特化、默认模板参数、多个模板参数、模板调用规则、类模板定义与实 ...
0115、安全开发篇(三):C++ 面向对象基础
返回:Ferry 学院安全开发总目录 · 网络安全学习主页
这一篇进入 C++ 面向对象基础。和前两篇相比,这里不只是“语法更多”,而是开始接触 C++ 程序真正容易在逆向里出现的东西:对象布局、构造析构、访问权限、重载、继承、多态、虚表和项目中的对象关系。
1、学习定位C++ 面向对象这部分,复盘时要同时看三层:
层次
重点
语法层
namespace、引用、类、对象、构造析构、重载、继承、多态
内存层
对象占用空间、成员偏移、静态成员、虚函数表、构造析构顺序
工程层
如何用类组织项目,如何拆分对象关系、数据存储和菜单流程
后续分析 C++ 程序时,很多“看起来像语法”的东西都会变成内存和调用关系问题。
2、章节目录
编号
章节
主要内容
笔记
0116
01 C++ 入门与命名空间
C++ 特性、控制台框架、iostream、namespace、using、嵌套/匿名/别名/合并命名空间、auto 类型推断
0116
0117
02 引用与内存管理
指针与引用、引用参数/返回值、常量引用、数组引用、内 ...
0109、安全开发篇(一):指针与函数入门
返回:安全开发篇(一)汇总 · 上一节:数组、字符串与结构体 · 安全开发总目录
这一篇开始进入 C 语言里最容易卡住、但也最值得啃下来的部分:指针。
指针不是一个单独的语法点,它连接了变量、地址、数组、字符串、函数调用和内存布局。后面做安全开发、逆向调试、漏洞分析时,很多问题最终都会落到一句话上:这块内存在哪里,指针指向哪里,按什么类型解释,能不能读写。
8.0 内存存储单元程序运行时,变量会被放进内存。内存可以先粗略理解成一排连续编号的存储单元,每个单元都有自己的地址。
1234567891011121314#include <stdio.h>int main(void){ int age = 20; double score = 95.5; char level = 'A'; printf("age = %d, address = %p\n", age, (void *)&age); printf("score = %.1f, address = %p\n&quo ...
0108、安全开发篇(一):数组、字符串与结构体
返回:安全开发篇(一)汇总 · 上一节:循环跳转与数组基础 · 安全开发总目录
这一篇是安全开发篇(一)的收尾:数组继续往多维展开,字符串开始接入输入输出和缓冲区边界,结构体则用于组织更复杂的数据。
对 C 语言来说,这几块内容非常重要。数组和字符串贴着内存走,结构体决定数据如何排列。后面学指针、文件格式、网络协议、PE 结构、逆向和漏洞分析时,都会反复回到这些基础问题:地址怎么算,长度是多少,是否越界,结构体成员在内存里怎么排。
7.0 多维数组特性解析二维数组已经可以看成“行和列”,多维数组则是在这个基础上继续增加维度。
1234567891011121314#include <stdio.h>int main(void){ int cube[2][3][4] = {0}; cube[0][0][0] = 10; cube[1][2][3] = 99; printf("cube[0][0][0] = %d\n", cube[0][0][0]); printf("cube[1][ ...
0107、安全开发篇(一):循环跳转与数组基础
返回:安全开发篇(一)汇总 · 上一节:选择与循环 · 安全开发总目录
这一篇从循环控制过渡到数组。
循环解决“重复做一件事”,数组解决“批量组织一组同类型数据”。两者放在一起看很自然:大多数数组操作都离不开循环,很多越界、死循环、下标错误和内存覆盖问题,也正是从这里开始出现的。
6.0 嵌套循环嵌套循环就是循环里面再写循环。最常见的场景是处理二维数据,比如表格、矩阵、地图、棋盘、二维数组。
12345678910111213141516#include <stdio.h>int main(void){ for (int row = 0; row < 3; row++) { for (int col = 0; col < 4; col++) { printf("(%d,%d) ", row, col); } printf("\n"); } return 0;} ...





