Windows逆向基础主要包括C、C++、MFC、PE、STL、win32、汇编26、数据结构、数据库、网络编程、硬编码等知识,在这里我将其分类串联起来,并对每个知识点做一些解释。对于C的基础知识,由于太基础,暂时不对其进行笔记撰写。目前的笔记内容暂时只有PE以及Win32。
Windows逆向基础学习情况
- C/C++
- 汇编
- PE
- Win32
- MFC(选)
- STL
- 数据结构与算法
- 数据库(选)
- 网络编程(选)
- 硬编码(选)
一:语言与编程基础
C / C++
作用
- Windows 应用、大量系统/驱动/工具都是用 C/C++ 写的。逆向时得把反汇编/反编译结果映射回源代码风格(变量、函数语义、控制流、内存分配等)。
- 理解指针、结构体、类、虚函数、异常、模板(尤其是 C++ 名称修饰/mangling)对识别函数边界、恢复类与虚表非常关键。
掌握深度 & 技巧
- 熟练掌握指针、内存分配/free、堆栈布局、函数调用(参数传递)和对象模型(构造/析构、虚函数)。
- 能读懂常见的 C++ 编译产物:vtable、RTTI(typeinfo)、名称修饰(mangled names)。
- 实战:看到
this指针、vptr、构造/析构模式便能还原类结构。
二:低级与平台基础
汇编(x86/x64)
作用
- 逆向的“母语”。反汇编/调试器看到的就是汇编代码,必须能从汇编推出高层语义(条件、循环、函数调用、内存操作、syscall/ABI)。
- 熟悉寄存器、指令集、调用约定与栈帧,才能正确识别参数、局部变量、返回值、异常处理、栈溢出点等。
掌握深度 & 技巧
- x86 和 x64 的差别(寄存器、参数传递、栈对齐、指令差异)。
- 常见编译器优化产生的结构(尾调用、内联、循环展开、寄存器分配)。
- 熟练使用调试器(x64dbg/WinDbg/IDA/Ghidra 的动态调试)逐步执行并观察寄存器/内存。
PE(Portable Executable)
作用
- Windows 可执行文件格式。理解 PE 能让你解析加载过程、导入/导出、节(.text/.data/.rdata/.rsrc)、重定位、TLS、资源、签名、节权限等——对静态分析、手工修补、patch、绕过保护非常重要。
掌握深度 & 技巧
- 能读懂 PE header、导入表(IAT)、导出表、节表、重定位表、资源表、TLS 回调。
- 会使用 PE 工具(PEiD、CFF Explorer、LordPE、packer 检测)和手工修改(patch bytes,修补 IAT)。
- 理解加载器如何处理 DEP/ASLR/SEH/ES/CFG 等安全特性。
Win32 / Windows API
作用
- Windows 逆向核心:绝大多数行为(文件/注册表/线程/进程/GUI/网络/IPC)都通过 WinAPI 实现。识别 API 调用就能理解程序做什么(例如 CreateFile/WriteFile/RegOpenKey/WSARecv 等)。
掌握深度 & 技巧
- 熟悉常用 API 分类:文件 I/O、进程/线程、内存管理(VirtualAlloc/VirtualProtect)、同步对象(Mutex/Event)、注册表、网络(WinSock)、服务、COM/Registry/Named Pipe。
- 能从 IAT/动态解析(LoadLibrary/GetProcAddress)辨识 API,追踪行为链(API 调用序列分析)。
- 了解 Windows 安全机制(ACL、UAC、签名)与调试/反调试相关 API(IsDebuggerPresent、CheckRemoteDebuggerPresent、NtQueryInformationProcess 等)。
三:框架、库与编译产物
MFC(Microsoft Foundation Classes)
作用
- 经典 Windows 桌面程序常用框架。MFC 的类结构、消息映射(MESSAGE_MAP)、资源(对话框 ID、字符串表)、序列化机制都会留在二进制里,逆向时识别这些能快速恢复 GUI 流程与事件处理逻辑。本质是将 Win32 的复杂性封装在 C++ 类中,我粗浅的理解为对于Win32图形界面部分的一个封装与简化。
掌握深度 & 技巧
- 辨认 MFC 的典型符号(如
Afx前缀、CWinApp、CDialog、消息映射表结构)。 - 熟悉资源文件 (.rc) 与对话框模板,能用 Resource Hacker/PE 工具查看嵌入资源。
- MFC 程序常用的类成员布局会显著帮助定位关键函数。
STL(Standard Template Library)
作用
- 常见容器(vector, map, string 等)在二进制中会留下特定的使用模式和函数调用序列。理解其内存/迭代器模型有助于识别数据结构和分析内存操作(例如迭代器失效、容器扩容)。
掌握深度 & 技巧
- 识别常见容器的内存布局(std::string、std::vector 内部指针和容量管理)。
- 理解模板会产生大量名称修饰,学会用反汇编工具的 demangle 功能(例如
undname)。
四:算法 & 数据概念
数据结构
作用
- 程序里的逻辑状态大多以数据结构表示(链表、树、哈希表、队列)。逆向时需要把内存块/指针链映射回这些结构,才能理解复杂逻辑(配置、索引、内存池、对象图)。
掌握深度 & 技巧
- 熟悉常见结构(链表、双向链表、平衡树、哈希表)与其内存表现。
- 会通过内存观察(调试器查看内存、heap dump)识别这些结构并重建关系图。
数据库
作用
- 程序可能嵌入/访问数据库(SQLite、SQL Server、MDB、LevelDB 等)来存储配置、日志、用户数据或许可信息。逆向时常需解析这些数据库文件或拦截 SQL 调用以理解数据和业务逻辑。
掌握深度 & 技巧
- 识别嵌入式 DB(如 SQLite 文件头)、能用工具(sqlite3、DB Browser)打开与查询。
- 了解 ORM/ODBC/ADO/C++ DB 接口的常见调用(如 ADO Connection/Recordset),以及如何在运行时捕获 SQL(hook API 或使用调试器抓字符串)。
五:网络与通信
网络编程
作用
- 很多恶意/正常程序通过网络通信(C2、更新、认证、后门)。理解 sockets/HTTP/TCP/UDP/TLS 的实现与 WinSock API,能分析协议、抓包与重放、识别加密/序列化格式。
掌握深度 & 技巧
- 熟悉 WinSock 基本 API(socket, connect, send, recv)和常见高层库(WinHTTP, WinINet, libcurl)的调用模式。
- 会使用抓包工具(Wireshark、Fiddler)并结合二进制分析找出协议实现、加密/压缩环节。
- 能 hook API 或用动态调试截获明文/密文并追踪加解密函数。
六:实用/攻击面知识
硬编码(硬编码值 / 密钥 /字符串)
作用
- 程序中经常存在硬编码常量(URL、密钥、魔数、许可证串)。在逆向时,这些是定位功能点(激活、连接、校验)的“捷径”。
- 同时也是常见的防护/混淆点:字符串加密、常量折叠、序列化后嵌入等。
掌握深度 & 技巧
- 学会在二进制中搜索可疑字符串/常量(静态与运行时生成的),识别字符串解密/解混淆函数并自动化提取。
- 留意 XOR/ROL/CRC/哈希/自定义加密的痕迹,追踪解密前后的内存以还原原文。