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 前缀、CWinAppCDialog、消息映射表结构)。
  • 熟悉资源文件 (.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/哈希/自定义加密的痕迹,追踪解密前后的内存以还原原文。