第 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 位库,结构体、指针、调试行为会有差异 |

新手只要先记住一句话: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/杀软可能拦截、隔离、上报告警 |
| 网络行为不可控 | 如果误运行,可能出现不必要的连接尝试 |
| 污染办公环境 | 生成文件、注册表、日志、缓存可能留在宿主机 |
| 无法复盘 | 没有快照和日志时,很难确认发生过什么 |
正确做法是:宿主机只做阅读和文档编写;动态编译、调试、观察放到隔离虚拟机里。

# 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 编译工具 | 项目文件中使用 PlatformToolset 为 v143 |
| Windows 10/11 SDK | 项目文件中配置了 WindowsTargetPlatformVersion 为 10.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 输出应用程序。 -->
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
这段对新手意味着:
Keyword是MFCProj,说明这是 MFC 项目。WindowsTargetPlatformVersion是10.0,说明需要 Windows SDK。UseOfMfc是Static,说明要安装 MFC 组件。PlatformToolset是v143,说明需要 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 下输出形态不同,新手不能只看一个配置。 -->
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 后,先看左侧“解决方案资源管理器”。它会展示:
- 解决方案里有哪些项目。
- 每个项目有哪些源文件。
- 哪些是头文件。
- 哪些是资源文件。
- 哪个项目是启动项目。
新手第一天只要会看这些内容,就已经能开始做源码阅读了。
# 8. VS 界面里新手要看哪几个位置
| 位置 | 在哪里 | 用来干什么 |
|---|---|---|
| 解决方案资源管理器 | 默认在右侧或左侧 | 看项目、源文件、头文件、资源文件 |
| 顶部配置下拉框 | VS 顶部工具栏 | 选择 Debug、Release、Release-exe |
| 顶部平台下拉框 | 配置旁边 | 选择 Win32 或 x64 |
| 输出窗口 | 底部窗口 | 看编译过程、链接器输出、构建后事件 |
| 错误列表 | 底部窗口 | 看错误编号、文件、行号 |
| 属性页 | 右键项目 -> 属性 | 看 SDK、工具集、MFC、库目录、构建事件 |
| 调用栈窗口 | 调试时打开 | 看程序是从哪个函数调用到当前断点 |
| 模块窗口 | 调试时打开 | 看进程加载了哪些 EXE/DLL |
建议新手先学会两个动作:
右键项目 -> 属性。 看“配置属性”里的 C/C++、链接器、常规、生成事件。
生成 -> 生成解决方案。 只在隔离虚拟机中做,并且先检查构建后事件。
# 9. Win32、x64、Debug、Release 怎么选
README.md 已经给出关键差异。
<!-- 源码位置:README.md:11-15 -->
> 说明:
>
> 主控只有x86 debug和release,没有x64;
>
> 被控有x64和x86 debug和release
<!-- 防御分析注释:主控和被控的平台支持不同。新手不要看到 x64 下拉框就默认所有项目都能用 x64 编译。 -->
2
3
4
5
6
7
对新手来说,可以这样理解:
| 选项 | 说明 | 新手建议 |
|---|---|---|
Win32 | 生成 32 位程序 | 主控优先看 Win32 |
x64 | 生成 64 位程序 | 被控或插件需要单独看 x64 |
Debug | 便于调试,变量和符号更友好 | 新手阅读和断点调试更适合 |
Release | 优化更多,更接近实际产物 | 安全审计要看,但不建议新手直接运行 |
Release-exe | 某些插件工程的 EXE 输出配置 | 要先看项目属性和 README,再决定是否编译 |
编译前先确认当前下拉框显示的是哪个组合。例如 Debug|Win32、Release|Win32、Release|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 的头文件。找不到头文件时,要先看包含目录是否正确。 -->
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。安全审计时,编译动作本身也要纳入日志和告警观察。 -->
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 也有类似构建后执行。新手不要以为“点生成”就一定只是编译。 -->
2
3
4
5
6
新手要记住:编译前先看项目属性里的“生成事件”,尤其是“后期生成事件”。
# 13. 调试前准备
调试不是一上来就按 F5。建议按顺序做:
- 打开
.sln。 - 看解决方案资源管理器。
- 选择正确配置和平台。
- 右键项目,打开属性页。
- 检查 SDK、MFC、库目录、生成事件。
- 创建虚拟机快照。
- 确认网络隔离。
- 设置断点。
- 编译。
- 先看输出窗口和错误列表。
- 确认没有不受控构建后行为后,再决定是否在隔离环境中调试。

# 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 | 链接器库目录不对,或库文件不存在 | 检查 lib、libx64 和附加库目录 |
| 机器类型冲突 | x86/x64 库混用 | Win32 链 32 位库,x64 链 64 位库 |
| Debug/Release 运行库冲突 | 不同配置库混用 | Debug 配 Debug 库,Release 配 Release 库 |
| 字符集相关报错 | Unicode/MultiByte 配置不一致 | 看项目属性里的字符集 |
| 编译成功但产物异常 | 构建后事件、输出目录或依赖 DLL 有问题 | 看输出窗口、项目属性、生成目录 |
不要只看错误列表最后一行。很多时候,真正有用的信息在“输出窗口”更靠前的位置。
# 17. 企业检测点
编译和调试阶段也有检测价值,尤其是在企业安全研究环境中。
| 检测对象 | 关注点 | 数据源 |
|---|---|---|
| 构建进程 | devenv.exe、MSBuild.exe 生成高风险二进制 | EDR、进程日志、CI 日志 |
| 构建后事件 | 编译完成后自动执行新产物 | VS 输出窗口、项目文件、进程树 |
| 文件写入 | 输出 .exe、.dll、.lib、中间文件 | 文件监控、EDR、构建日志 |
| 网络行为 | 编译或误运行后出现外联 | 防火墙、NDR、TCPView、Wireshark |
| 安全告警 | EDR/杀软拦截构建产物 | EDR 控制台、隔离区记录 |
| 依赖库 | 第三方库来源、位数、版本 | 依赖台账、软件组成分析 |
| 调试器行为 | 调试器启动高风险产物 | 进程树、命令行、用户操作日志 |
这些检测点不是为了阻止安全研究,而是为了让研究过程可控、可追溯、可复盘。
# 18. 常见误区
直接在办公机编译。 这会把高风险产物、日志和告警留在办公环境,不适合安全研究。
只会按 F5。 F5 是“启动调试”,可能直接运行程序。新手应先看项目、属性、构建事件和输出窗口。
看到编译成功就运行。 编译成功只说明语法和链接过了,不代表可以安全运行。
不知道当前是 Win32 还是 x64。 很多链接错误和运行异常都来自平台选错。
忽略 MFC。 主控是 MFC 项目,没装 MFC 就会出现大量头文件或项目加载问题。
忽略构建后事件。 某些项目编译后会自动执行新产物。对高风险源码来说,这一步必须审计。
# 19. 本课小结
第 3 课的重点不是让新手立刻把项目跑起来,而是先弄懂 Visual Studio 工具链和安全实验流程。你需要知道 .sln 是入口,.vcxproj 记录配置,MSVC 负责编译,Windows SDK 提供系统 API,MFC/ATL 支撑老式 Windows 桌面程序。编译前必须看清 Debug/Release、Win32/x64 和构建后事件。
后续第 4 课会继续讲第三方库下载、编译与依赖管理;第 5 课再讲工程编译顺序和更具体的调试方法。
# 20. 合法练习题
- 打开
主控\Quick\Quick.vcxproj,找出WindowsTargetPlatformVersion、UseOfMfc、PlatformToolset三个字段,并解释含义。 - 打开
主插件\上线模块\上线模块\上线模块.vcxproj,列出它有哪些配置组合,例如Debug|Win32、Release|x64、Release-exe|x64。 - 写一份你的实验虚拟机确认事项,至少包含快照、网络、日志、VS 组件和输出目录。
- 在不编译的前提下,检查
主插件\shellcode\shellcode\shellcode.vcxproj中是否存在PostBuildEvent,并说明为什么要记录它。 - 把
windows.h、afxwin.h、LNK2019、MSB8020、机器类型冲突这 5 类错误翻译成新手能看懂的排查方向。
安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。
本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。
社区交流
讨论与留言