3 / 52 导论、环境与编译

第 3 课:安装编译与调试环境

# 第 3 课:安装编译与调试环境

免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。

本课定位:面向不熟悉 Visual Studio 工具链的新手,讲清楚安全实验环境、VS 组件、工程配置、编译前检查和调试入门。 本课不讲上线、连接真实目标、运行远控功能或绕过安全软件;所有编译和调试说明都只适用于授权、隔离、可回滚的安全实验环境。

# 1. 新手先理解:VS 工具链到底是什么

很多同学第一次打开这类 Windows C++ 项目,会被 .sln.vcxproj、Win32、x64、Debug、Release、SDK、MFC、ATL 这些词绕晕。先把它们翻译成人话。

名称 白话解释 在本项目里为什么重要
Visual Studio 写代码、看工程、点编译、调试程序的集成开发环境 用来打开 主控\Quick.sln主插件\all.sln
MSVC Visual Studio 自带的 C/C++ 编译器 .cpp 源码编译成 .obj.exe.dll
Windows SDK Windows API 的头文件、库和工具集合 如果缺它,可能找不到 windows.h 或系统库
MFC Microsoft Foundation Classes,老式 Windows 桌面界面框架 主控 Quick 是 MFC 项目,需要安装 MFC 组件
ATL Active Template Library,Windows C++ 辅助库 一些老项目或组件可能依赖 ATL
.sln 解决方案,像一个工程包入口 新手应该打开 .sln,不要直接双击 .cpp
.vcxproj C++ 项目文件,记录编译配置 里面能看到 SDK、平台工具集、MFC、构建后事件
Debug 调试配置,便于下断点、看变量 适合源码级分析,但行为可能和 Release 不同
Release 发布配置,优化更多,更接近实际产物 安全审计必须单独看 Release 行为
Win32 生成 32 位程序 依赖 32 位库,不能随便混用 x64 库
x64 生成 64 位程序 依赖 64 位库,结构体、指针、调试行为会有差异

第 3 课图 1:VS 工具链新手图

新手只要先记住一句话:Visual Studio 是工作台,MSVC 是编译器,Windows SDK、MFC、ATL 是项目需要的工具和材料,.sln 是打开项目的入口。

# 2. 本课学习目标与适用人群

学完本课后,读者应当能做到:

目标 说明
知道该安装什么 理解 VS、MSVC、Windows SDK、MFC、ATL 的作用
知道该打开什么 主控打开 主控\Quick.sln,主插件打开 主插件\all.sln
看懂配置下拉框 能区分 Debug/Release、Win32/x64
看懂常见错误 能把 SDK、MFC、库目录、工具集错误翻译成排查方向
做好安全隔离 编译和调试前知道快照、断网、日志和构建后事件检查

适用人群包括企业安全人员、安全工程学习者、授权红蓝测试人员和安全研发人员。红蓝测试人员只限授权演练、检测验证和复盘场景,不包含未授权目标测试。

# 3. 为什么不能在办公机直接编译调试

这套源码不是普通示例项目。它包含远程控制、插件加载、内存执行、音视频采集、远程终端、注入、驱动等高风险能力。即使你只是学习,直接在办公机或生产网里编译调试也不合适。

主要风险如下:

风险 说明
生成高风险二进制 编译后可能产生 .exe.dll 等可执行产物
构建后事件可能运行程序 某些项目编译后会自动执行生成的程序
安全软件可能拦截 EDR/杀软可能拦截、隔离、上报告警
网络行为不可控 如果误运行,可能出现不必要的连接尝试
污染办公环境 生成文件、注册表、日志、缓存可能留在宿主机
无法复盘 没有快照和日志时,很难确认发生过什么

正确做法是:宿主机只做阅读和文档编写;动态编译、调试、观察放到隔离虚拟机里。

第 3 课图 2:新手安全实验环境

# 4. 推荐实验环境

最低建议环境:

项目 建议
操作系统 Windows 10/11 虚拟机
虚拟化 VMware、VirtualBox、Hyper-V 任意一种均可
快照 每次编译或调试前创建快照
网络 默认使用隔离网络,不连接生产网,不连接真实目标
Visual Studio Visual Studio 2022,或能提供 v143 工具集的环境
Windows SDK 安装 Windows 10 SDK 或 Windows 11 SDK
VS 组件 C++ 桌面开发、MSVC、MFC、ATL
观察工具 VS 输出窗口、系统事件日志、Process Explorer、Process Monitor、TCPView、Wireshark 可按需使用

这里不要求新手一次掌握所有工具。前几节课只需要会打开解决方案、看项目结构、看输出窗口、看错误列表。

# 5. 安装 Visual Studio 时该勾什么

安装 Visual Studio 时,新手最重要的是选对工作负载。

建议勾选:

组件 为什么需要
使用 C++ 的桌面开发 Windows C++ 项目的基础工作负载
MSVC v143 编译工具 项目文件中使用 PlatformToolsetv143
Windows 10/11 SDK 项目文件中配置了 WindowsTargetPlatformVersion10.0
C++ MFC 主控工程是 MFC 项目
C++ ATL 老式 Windows C++ 项目常见依赖,建议一起安装
C++ CMake tools 可选,本项目主要是 .sln/.vcxproj,但安装后排查依赖更方便
Git 可选,用于版本管理和查看变更

如果你已经安装了 Visual Studio,但编译时报错,可以打开 Visual Studio Installer,选择“修改”,补装上述组件。

# 6. 从项目文件确认工具链

不要只凭感觉猜项目需要什么。.vcxproj 文件会直接告诉你。

主控工程配置节选:

<!-- 源码位置:主控\Quick\Quick.vcxproj:21-35 -->
<PropertyGroup Label="Globals">
  <ProjectGuid>{3813F57B-C90C-42F8-83EF-1D68E709A7C9}</ProjectGuid>
  <RootNamespace>Quick</RootNamespace>
  <Keyword>MFCProj</Keyword>
  <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
  <ConfigurationType>Application</ConfigurationType>
  <UseDebugLibraries>false</UseDebugLibraries>
  <WholeProgramOptimization>true</WholeProgramOptimization>
  <CharacterSet>Unicode</CharacterSet>
  <UseOfMfc>Static</UseOfMfc>
  <PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<!-- 防御分析注释:这里说明主控需要 Windows SDK 10.0、MFC、v143 工具集,并且 Release|Win32 输出应用程序。 -->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

这段对新手意味着:

  1. KeywordMFCProj,说明这是 MFC 项目。
  2. WindowsTargetPlatformVersion10.0,说明需要 Windows SDK。
  3. UseOfMfcStatic,说明要安装 MFC 组件。
  4. PlatformToolsetv143,说明需要 VS 2022 这代编译工具集。

上线模块配置节选:

<!-- 源码位置:主插件\上线模块\上线模块\上线模块.vcxproj:35-76 -->
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
  <ConfigurationType>Application</ConfigurationType>
  <UseDebugLibraries>true</UseDebugLibraries>
  <CharacterSet>Unicode</CharacterSet>
  <PlatformToolset>v143</PlatformToolset>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
  <ConfigurationType>DynamicLibrary</ConfigurationType>
  <UseDebugLibraries>false</UseDebugLibraries>
  <WholeProgramOptimization>true</WholeProgramOptimization>
  <CharacterSet>Unicode</CharacterSet>
  <PlatformToolset>v143</PlatformToolset>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-exe|Win32'" Label="Configuration">
  <ConfigurationType>Application</ConfigurationType>
  <UseDebugLibraries>false</UseDebugLibraries>
  <WholeProgramOptimization>true</WholeProgramOptimization>
  <CharacterSet>Unicode</CharacterSet>
  <PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<!-- 防御分析注释:同一个模块在 Debug、Release、Release-exe 下输出形态不同,新手不能只看一个配置。 -->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

这里最容易让新手困惑的是 ConfigurationType

白话解释
Application 编译成 .exe
DynamicLibrary 编译成 .dll

同一个工程在不同配置下可能一会儿生成 EXE,一会儿生成 DLL。排查输出目录时要先看当前配置。

# 7. 新手应该打开哪个文件

不要直接双击 .cpp 文件。.cpp 只是单个源码文件,Visual Studio 不知道整个工程的头文件、库目录、资源文件和编译配置。

应该打开:

你想看什么 打开哪个文件 说明
主控端 主控\Quick.sln 主控界面、连接列表、功能窗口、构建器
主插件集合 主插件\all.sln 上线模块、HPSocket、各功能插件
单个插件工程 对应目录里的 .sln.vcxproj 只适合已经知道目标模块时使用

打开 .sln 后,先看左侧“解决方案资源管理器”。它会展示:

  1. 解决方案里有哪些项目。
  2. 每个项目有哪些源文件。
  3. 哪些是头文件。
  4. 哪些是资源文件。
  5. 哪个项目是启动项目。

新手第一天只要会看这些内容,就已经能开始做源码阅读了。

# 8. VS 界面里新手要看哪几个位置

位置 在哪里 用来干什么
解决方案资源管理器 默认在右侧或左侧 看项目、源文件、头文件、资源文件
顶部配置下拉框 VS 顶部工具栏 选择 DebugReleaseRelease-exe
顶部平台下拉框 配置旁边 选择 Win32x64
输出窗口 底部窗口 看编译过程、链接器输出、构建后事件
错误列表 底部窗口 看错误编号、文件、行号
属性页 右键项目 -> 属性 看 SDK、工具集、MFC、库目录、构建事件
调用栈窗口 调试时打开 看程序是从哪个函数调用到当前断点
模块窗口 调试时打开 看进程加载了哪些 EXE/DLL

建议新手先学会两个动作:

  1. 右键项目 -> 属性。 看“配置属性”里的 C/C++、链接器、常规、生成事件。

  2. 生成 -> 生成解决方案。 只在隔离虚拟机中做,并且先检查构建后事件。

# 9. Win32、x64、Debug、Release 怎么选

README.md 已经给出关键差异。

<!-- 源码位置:README.md:11-15 -->
> 说明:
>
> 主控只有x86 debug和release,没有x64;
>
> 被控有x64和x86 debug和release
<!-- 防御分析注释:主控和被控的平台支持不同。新手不要看到 x64 下拉框就默认所有项目都能用 x64 编译。 -->
1
2
3
4
5
6
7

对新手来说,可以这样理解:

选项 说明 新手建议
Win32 生成 32 位程序 主控优先看 Win32
x64 生成 64 位程序 被控或插件需要单独看 x64
Debug 便于调试,变量和符号更友好 新手阅读和断点调试更适合
Release 优化更多,更接近实际产物 安全审计要看,但不建议新手直接运行
Release-exe 某些插件工程的 EXE 输出配置 要先看项目属性和 README,再决定是否编译

编译前先确认当前下拉框显示的是哪个组合。例如 Debug|Win32Release|Win32Release|x64。很多错误只是因为选错了平台。

# 10. 第三方库和链接环境预检查

本课不深入讲第三方库编译,第 4 课会专门讲。这里先让新手知道编译前要检查什么。

检查项 为什么重要
thirdparty 是否存在 里面有 HP-Socket、libjpeg、SDL、xvid 等源码和依赖
lib 是否存在 常见 32 位或通用预编译库在这里
libx64 是否存在 64 位预编译库在这里
头文件路径是否正确 找不到 .h 会导致编译阶段报错
.lib 路径是否正确 找不到库会导致链接阶段报错
位数是否匹配 x64 工程不能链接 32 位库,Win32 工程不能链接 64 位库
Debug/Release 是否匹配 Debug 库和 Release 库混用可能导致链接或运行异常

上线模块里就能看到对 HPSocket 头文件目录的引用。

<!-- 源码位置:主插件\上线模块\上线模块\上线模块.vcxproj:143 -->
<AdditionalIncludeDirectories>..\..\HPSocket\</AdditionalIncludeDirectories>
<!-- 防御分析注释:这表示上线模块编译时需要引用 HPSocket 的头文件。找不到头文件时,要先看包含目录是否正确。 -->
1
2
3

# 11. 编译前安全确认事项

在这类源码里,编译不是一个纯技术动作,也是一种安全事件。建议每次编译前都确认下面这些事项。

检查项 是否必须 说明
已获得授权 必须 企业环境中要有明确研究范围和负责人
使用虚拟机 必须 不在办公机和生产机上编译
已创建快照 必须 出错后可以回滚
网络已隔离 必须 不连接生产网和真实目标
已打开日志 建议 保存 VS 输出、系统日志、网络日志
已确认配置 必须 看清 Debug/Release、Win32/x64
已检查构建后事件 必须 防止编译后自动执行高风险产物
已确认输出目录 建议 知道 .exe.dll.lib 会写到哪里
只编译必要项目 建议 不要一开始全量编译所有高风险模块

# 12. 构建后事件为什么要重点看

构建后事件是 Visual Studio 在编译完成后自动执行的命令。普通项目可能用它复制文件;高风险项目里,它可能运行刚生成的程序或生成二次产物。

shellcode 工程里就存在构建后事件。

<!-- 源码位置:主插件\shellcode\shellcode\shellcode.vcxproj:131-135 -->
<PostBuildEvent>
  <Command>$(SolutionDir)$(Configuration)\$(ProjectName).exe</Command>
  <Message>生成..\\..\\Release\\执行代码.dll</Message>
</PostBuildEvent>
<!-- 防御分析注释:这表示 Release|Win32 构建后会执行生成的 EXE。安全审计时,编译动作本身也要纳入日志和告警观察。 -->
1
2
3
4
5
6
<!-- 源码位置:主插件\shellcode\shellcode\shellcode.vcxproj:158-161 -->
<PostBuildEvent>
  <Command>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName).exe</Command>
  <Message>生成..\\..\\x64\\Release\\执行代码.dll</Message>
</PostBuildEvent>
<!-- 防御分析注释:x64 Release 也有类似构建后执行。新手不要以为“点生成”就一定只是编译。 -->
1
2
3
4
5
6

新手要记住:编译前先看项目属性里的“生成事件”,尤其是“后期生成事件”。

# 13. 调试前准备

调试不是一上来就按 F5。建议按顺序做:

  1. 打开 .sln
  2. 看解决方案资源管理器。
  3. 选择正确配置和平台。
  4. 右键项目,打开属性页。
  5. 检查 SDK、MFC、库目录、生成事件。
  6. 创建虚拟机快照。
  7. 确认网络隔离。
  8. 设置断点。
  9. 编译。
  10. 先看输出窗口和错误列表。
  11. 确认没有不受控构建后行为后,再决定是否在隔离环境中调试。

第 3 课图 3:VS 新手调试流程

# 14. 调试时看什么窗口

VS 窗口 新手怎么看
输出窗口 编译失败先看这里,能看到真实命令、错误和链接信息
错误列表 适合快速跳转到文件和行号,但有时信息不如输出窗口完整
调用栈 断点停住后,看函数是怎么一路调用过来的
局部变量 看当前函数里的变量值
监视窗口 手动输入变量或表达式观察变化
模块窗口 看当前进程加载了哪些 DLL
线程窗口 多线程程序调试时看线程数量和入口
异常设置 让程序在异常发生时停下来,便于定位问题

对新手来说,先掌握“输出窗口、错误列表、断点、调用栈”就够了。

# 15. 推荐调试策略

从低风险到高风险,建议按这个顺序:

阶段 做什么 不做什么
静态阅读 看 README、目录、.vcxproj、源码结构 不编译、不运行
工程加载 用 VS 打开 .sln,看项目树和属性页 不按 F5
配置检查 看 Debug/Release、Win32/x64、构建后事件 不全量编译
低风险编译 在虚拟机中只编译必要项目,保存输出日志 不连接真实目标
源码级调试 对 UI 初始化、普通数据结构、错误处理下断点 不调试高风险执行链路
高风险模块分析 对 shellcode、注入、驱动、键盘记录等模块以静态审计为主 不复现攻击路径

这样做的目标不是“把程序跑起来”,而是安全地获得源码理解、错误信息、配置差异和检测线索。

# 16. 常见编译错误翻译成人话

报错或现象 人话解释 排查方向
找不到 windows.h Windows SDK 没装好或没被项目找到 安装 Windows SDK,检查项目 SDK 版本
找不到 afxwin.h MFC 没装 Visual Studio Installer 里补装 C++ MFC
MSB8020 项目要求的工具集没有安装 安装对应 MSVC 工具集,或谨慎 retarget
LNK2019 unresolved external symbol 声明了函数,但链接器找不到实现 检查 .lib、源文件、项目依赖
找不到 .lib 链接器库目录不对,或库文件不存在 检查 liblibx64 和附加库目录
机器类型冲突 x86/x64 库混用 Win32 链 32 位库,x64 链 64 位库
Debug/Release 运行库冲突 不同配置库混用 Debug 配 Debug 库,Release 配 Release 库
字符集相关报错 Unicode/MultiByte 配置不一致 看项目属性里的字符集
编译成功但产物异常 构建后事件、输出目录或依赖 DLL 有问题 看输出窗口、项目属性、生成目录

不要只看错误列表最后一行。很多时候,真正有用的信息在“输出窗口”更靠前的位置。

# 17. 企业检测点

编译和调试阶段也有检测价值,尤其是在企业安全研究环境中。

检测对象 关注点 数据源
构建进程 devenv.exeMSBuild.exe 生成高风险二进制 EDR、进程日志、CI 日志
构建后事件 编译完成后自动执行新产物 VS 输出窗口、项目文件、进程树
文件写入 输出 .exe.dll.lib、中间文件 文件监控、EDR、构建日志
网络行为 编译或误运行后出现外联 防火墙、NDR、TCPView、Wireshark
安全告警 EDR/杀软拦截构建产物 EDR 控制台、隔离区记录
依赖库 第三方库来源、位数、版本 依赖台账、软件组成分析
调试器行为 调试器启动高风险产物 进程树、命令行、用户操作日志

这些检测点不是为了阻止安全研究,而是为了让研究过程可控、可追溯、可复盘。

# 18. 常见误区

  1. 直接在办公机编译。 这会把高风险产物、日志和告警留在办公环境,不适合安全研究。

  2. 只会按 F5。 F5 是“启动调试”,可能直接运行程序。新手应先看项目、属性、构建事件和输出窗口。

  3. 看到编译成功就运行。 编译成功只说明语法和链接过了,不代表可以安全运行。

  4. 不知道当前是 Win32 还是 x64。 很多链接错误和运行异常都来自平台选错。

  5. 忽略 MFC。 主控是 MFC 项目,没装 MFC 就会出现大量头文件或项目加载问题。

  6. 忽略构建后事件。 某些项目编译后会自动执行新产物。对高风险源码来说,这一步必须审计。

# 19. 本课小结

第 3 课的重点不是让新手立刻把项目跑起来,而是先弄懂 Visual Studio 工具链和安全实验流程。你需要知道 .sln 是入口,.vcxproj 记录配置,MSVC 负责编译,Windows SDK 提供系统 API,MFC/ATL 支撑老式 Windows 桌面程序。编译前必须看清 Debug/Release、Win32/x64 和构建后事件。

后续第 4 课会继续讲第三方库下载、编译与依赖管理;第 5 课再讲工程编译顺序和更具体的调试方法。

# 20. 合法练习题

  1. 打开 主控\Quick\Quick.vcxproj,找出 WindowsTargetPlatformVersionUseOfMfcPlatformToolset 三个字段,并解释含义。
  2. 打开 主插件\上线模块\上线模块\上线模块.vcxproj,列出它有哪些配置组合,例如 Debug|Win32Release|x64Release-exe|x64
  3. 写一份你的实验虚拟机确认事项,至少包含快照、网络、日志、VS 组件和输出目录。
  4. 在不编译的前提下,检查 主插件\shellcode\shellcode\shellcode.vcxproj 中是否存在 PostBuildEvent,并说明为什么要记录它。
  5. windows.hafxwin.hLNK2019MSB8020、机器类型冲突这 5 类错误翻译成新手能看懂的排查方向。

安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。

上次更新: 2026/07/14, 19:37:40

社区交流

讨论与留言

前往 GitHub Issues →

本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。

最近更新
第 1 课:专栏导论与安全边界
07-01
第 4 课:第三方库下载、编译与依赖管理
07-01
第 5 课:工程编译顺序与调试方法
07-01
更多文章>