第 2 课:源码整体结构导览
# 第 2 课:源码整体结构导览
免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。
本课定位:建立源码全景图、模块角色和阅读路线。 本课不讲编译运行,不讲远控功能使用,不讲插件滥用步骤;只帮助读者分清目录、角色、依赖、风险类别和后续阅读顺序。
# 1. 为什么要先看整体结构
读这类远控源码,最常见的错误是一上来就钻进某个插件函数。这样很容易迷路,也容易把高风险实现误读成操作教程。
正确的顺序是先建立全景图:
- 哪个目录是主控端。
- 哪个目录是插件和上线模块。
- 哪些目录是第三方依赖。
- 哪些文件是编译和调试说明。
- 哪些模块属于高风险能力,需要只做防御分析。
源码整体结构看清楚后,后续阅读每个模块时才知道它在系统里扮演什么角色、数据从哪里来、结果到哪里去、企业应该在哪些位置做检测。
# 2. 本课学习目标与适用人群
学完本课后,读者应当能做到:
| 目标 | 说明 |
|---|---|
| 看懂根目录 | 能说明 README.md、主控、主插件、thirdparty、lib、libx64 的作用 |
| 区分角色 | 能区分主控端、上线模块、功能插件、第三方依赖和预编译库 |
| 建立阅读路线 | 知道应先读低风险结构,再读协议和加载链,最后读高风险插件 |
| 初步分类风险 | 能把插件目录按系统管理、隐私采集、网络代理、底层执行等类别归类 |
| 输出检测映射 | 能从目录结构推导主机、网络、内存、构建链的检测方向 |
适用人群:
| 人群 | 学习重点 |
|---|---|
| 企业安全人员 | 快速建立远控类源码能力清单和检测覆盖面 |
| 安全工程学习者 | 学会从目录结构进入大型 Windows C++ 项目 |
| 授权红蓝测试人员 | 在授权演练中理解能力链路,帮助验证检测和复盘 |
| 安全研发人员 | 对照高风险结构,设计合规远程运维工具的安全边界 |
# 3. 根目录总览
当前源码根目录可以先按六类对象理解。
# 目录位置:F:\githubrepo\winos4.0-gh0st
winos4.0-gh0st
├─ README.md # 源码声明、编译步骤、调试差异说明
├─ 主控 # 主控端工程,核心入口是 Quick
├─ 主插件 # 上线模块、网络基础、功能插件、加载支撑
├─ thirdparty # 第三方源码和依赖材料
├─ lib # 预编译库,主要覆盖 32 位和部分通用库
├─ libx64 # 64 位预编译库
└─ 清理.bat # 清理生成文件的辅助脚本
2
3
4
5
6
7
8
9

这张图可以按阅读顺序看:先读 README.md,再分清 主控 和 主插件,然后看 thirdparty、lib、libx64 这些依赖来源。不要一开始就直接跳到 shellcode、注入管理、驱动插件 这类高风险模块。
# 4. README 透露的结构信息
README.md 虽然很短,但对理解工程结构很关键。
源码节选:
<!-- 源码位置:README.md:11-15 -->
> 说明:
>
> 主控只有x86 debug和release,没有x64;
>
> 被控有x64和x86 debug和release
<!-- 防御分析注释:主控和被控在平台支持上不完全一致,后续审计要分别看 x86、x64、Debug、Release。 -->
2
3
4
5
6
7
这说明主控端和被控端不是同一类工程。主控端主要是管理界面和控制入口;被控端相关模块需要同时考虑 32 位和 64 位。
源码节选:
<!-- 源码位置:README.md:41 -->
> 生产和调试版本区别在于,主控将插件传输给被控时,生产版本会使用主控传过来的插件shellcode数据,并执行,调试版本会从本地磁盘加载相关插件dll方便调试。
<!-- 防御分析注释:这句话指出了插件传输、shellcode 数据、动态执行、本地 DLL 调试加载等关键审计线索。 -->
2
3
安全工程上,这句话至少提示了三件事:
- 插件不是普通静态链接能力,而是和传输、加载、执行链路有关。
- Debug 和 Release 的行为路径不同,检测和审计不能只看一个配置。
shellcode、插件 DLL、本地磁盘加载和动态执行都需要作为后续重点。
# 5. 工程整体架构
从高层看,这套源码可以理解成五层:
| 层级 | 代表目录或模块 | 作用 |
|---|---|---|
| 主控界面层 | 主控\Quick | 展示连接、菜单、功能窗口,发起管理操作 |
| 网络通信层 | 主控\Quick 中的网络类、主插件\HPSocket | 负责 TCP/UDP 通信、连接收发和回调 |
| 上线会话层 | 主插件\上线模块、主插件\登录模块 | 负责连接初始化、会话识别、后续插件请求 |
| 插件能力层 | 主插件 下各功能目录 | 实现系统管理、文件、注册表、屏幕、音频、终端等能力 |
| 依赖支撑层 | thirdparty、lib、libx64 | 提供网络、图像、音视频、压缩、加密等基础库 |

这张图不是精确调用栈,而是用于建立方向感:主控界面是入口,网络通信负责传输,上线模块负责连接与会话,插件加载把不同能力组织起来,功能插件再调用系统 API 或第三方库完成具体工作。
# 6. 主控目录初识
主控 目录中最重要的是 Quick.sln 和 Quick 源码目录。
# 目录位置:主控
主控
├─ Quick.sln # 主控端 Visual Studio 解决方案
├─ Quick # 主控端主要源码目录
└─ 清理.bat # 主控构建清理脚本
2
3
4
5
主控\Quick 里文件很多,新手不用一次读完,可以先按功能分组。
| 类别 | 代表文件 | 先看什么 |
|---|---|---|
| 程序入口与框架 | Quick.cpp、Quick.h、MainFrm.cpp、MainFrm.h | 主窗口、菜单、消息响应的大致结构 |
| 资源与界面 | Quick.rc、res、各类 *Dlg.cpp | 界面控件、菜单、弹窗和功能入口 |
| 连接管理 | MachineDlg.cpp、LogView.cpp、PlugView.cpp | 客户端列表、日志视图、插件视图 |
| 网络通信 | HpTcpServer.cpp、HpUdpServer.cpp、ISocketBase.cpp | 收发数据、连接回调、网络事件 |
| 插件与构建相关 | BuildDlg.cpp、DllToShellCode.cpp、MemoryModule.cpp | 构建器、插件转换、内存加载相关风险点 |
| 功能窗口 | FileManagerDlg.cpp、KeyBoardDlg.cpp、H264ScreenSpyDlg.cpp 等 | 功能入口和主控侧展示逻辑 |
防御阅读建议:主控端先看“界面入口如何触发网络命令”,不要先追到底层实现。等第 7 课讲主控界面布局时,再从菜单、控件 ID、消息映射反查处理函数。
# 7. 主插件目录初识
主插件 是后续专栏的重点。它下面有网络基础、上线会话、系统管理、隐私采集、底层高危能力等多类插件。
# 目录位置:主插件
主插件
├─ all.sln # 主插件集合解决方案
├─ HPSocket # 网络基础能力
├─ shellcode # 动态代码加载和执行链路相关支撑
├─ 上线模块 # 被控端连接初始化和插件请求
├─ 登录模块 # 登录和会话初始化相关逻辑
├─ 系统管理 # 进程、服务、窗口、任务等系统管理能力
├─ 文件管理 # 文件浏览、传输和操作能力
├─ 查注册表 # 注册表读取和修改相关能力
├─ 启动管理 # 启动项、计划任务、服务等持久化相关位置
├─ 远程终端 # 命令执行和输出回传能力
├─ 键盘记录 # 高危输入采集能力,只做防御分析
├─ 高速屏幕/差异屏幕/后台屏幕/后台窗口/娱乐屏幕
├─ 视频查看/播放监听/语音监听
├─ 代理映射/压力测试
├─ 注入管理/驱动插件
└─ 解密数据
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
为了后续阅读更清楚,可以先把插件按风险和功能分类。
| 分类 | 目录 | 防御重点 |
|---|---|---|
| 网络基础类 | HPSocket | 连接生命周期、心跳、收发回调、异常断开 |
| 加载支撑类 | shellcode | 内存执行、可执行页、动态载荷、无文件执行线索 |
| 上线会话类 | 上线模块、登录模块 | 配置提取、认证缺陷、会话可信边界 |
| 系统管理类 | 系统管理、文件管理、查注册表、启动管理、远程终端 | 文件、注册表、服务、命令执行、持久化审计 |
| 隐私采集类 | 键盘记录、屏幕类、音频类、视频查看、解密数据 | 输入、屏幕、摄像头、麦克风、凭据和敏感数据保护 |
| 网络与底层高危类 | 代理映射、压力测试、注入管理、驱动插件 | 内网穿透、异常流量、进程注入、驱动加载 |
这里不把每个插件展开讲。后续专栏会逐个模块做防御分析,但第 2 课只负责让读者先知道“有哪些类别、哪些风险、后续从哪里读”。
# 8. 第三方库与预编译库
thirdparty、lib、libx64 是新手经常忽略的部分。实际上,依赖库决定了很多能力边界。
# 目录位置:thirdparty
thirdparty
├─ HP-Socket-dev # 网络通信库
├─ libjpeg-turbo # 图像压缩相关
├─ libyuv # 图像像素格式转换相关
├─ SDL-release-2.30.11 # 多媒体相关
├─ xvidcore-1.3.7 # 视频编码相关
├─ G729a # 音频编码相关
├─ Xtreme ToolkitPro v18.5.0 # 界面控件相关
├─ zlib131.zip # 压缩库归档
└─ README.md # 依赖库说明入口
2
3
4
5
6
7
8
9
10
11
lib 和 libx64 里放的是预编译库。审计时要重点看:
| 关注点 | 为什么重要 |
|---|---|
| 32 位和 64 位是否匹配 | 位数不匹配会导致链接或运行异常,也会影响检测规则 |
| Debug 和 Release 是否混用 | 混用可能引入不同运行时库和行为差异 |
| 第三方库来源是否可追溯 | 供应链风险、版本漏洞和后门风险都要评估 |
| 是否存在重复库或过期库 | 老版本依赖可能带来已知漏洞 |
| 是否有本地改动 | 第三方库被改动后,需要单独审计 |
第 4 课会专门讲第三方库下载、编译和依赖管理。
# 9. 新手推荐阅读顺序
建议按下面顺序读,不要直接跳高危插件。

具体步骤:
读 README。 先看免责声明、编译说明、主控和被控的位数差异、生产和调试版本差异。
看根目录。 分清
主控、主插件、thirdparty、lib、libx64。看主控界面。 从菜单、窗口、列表控件和功能按钮理解用户操作入口。
看网络协议。 理解主控和被控之间是如何传递命令和数据的。
看插件加载。 理解插件是如何被请求、传输、缓存、加载和调用的。
看插件分类。 先读系统管理、文件、注册表等较容易理解的模块,再读 shellcode、注入、驱动、键盘记录等高风险模块。
落到工程输出。 每读完一个模块,都要形成风险点、检测点、检查项和加固建议。
# 10. 从目录结构提取风险信号
目录名本身不能作为检测规则,但能帮助我们快速建立风险清单。
| 目录或能力 | 风险提示 | 企业应关注 |
|---|---|---|
远程终端 | 远程命令执行能力 | 父子进程、命令行、脚本日志、交互式 shell |
文件管理 | 文件浏览和传输能力 | 敏感目录访问、批量读取、异常上传下载 |
查注册表、启动管理 | 系统配置和持久化位置 | Run 键、服务、计划任务、策略项变更 |
键盘记录 | 输入采集高危能力 | 输入钩子、敏感 API、异常后台进程 |
| 屏幕类插件 | 屏幕采集和远程查看 | 图形 API、持续高频图像流、隐私合规 |
| 音视频类插件 | 摄像头、麦克风、播放音频采集 | 设备访问、权限提示、隐私审计 |
代理映射 | 内网流量转发或穿透 | 异常长连接、端口映射、东西向流量 |
注入管理 | 进程注入风险 | 跨进程句柄、远程线程、异常内存权限 |
驱动插件 | 内核级能力 | 驱动加载、签名策略、内核模块审计 |
shellcode | 动态执行链路 | RWX 内存、非模块执行、无文件执行 |
解密数据 | 敏感数据访问 | 凭据、浏览器数据、密钥材料、DLP |
读目录时就要开始做“能力到检测”的转换。不要只记功能名,要把它翻译成可观测行为。
# 11. 企业检测点
第 2 课只做结构层检测点,不写具体产品规则。
| 检测面 | 结构来源 | 检测思路 |
|---|---|---|
| 网络连接 | HPSocket、上线模块、代理映射 | 关注长连接、心跳、异常端口、内网转发 |
| 插件加载 | 主插件、shellcode、MemoryModule 类文件 | 关注动态加载、内存执行、未知模块、版本缓存 |
| 文件行为 | 文件管理、构建器、插件缓存 | 关注敏感目录访问、二进制写入、异常 DLL |
| 注册表和启动项 | 查注册表、启动管理、上线配置 | 关注自启动、策略项、服务项和配置落点 |
| 命令执行 | 远程终端、系统管理 | 关注 cmd、PowerShell、脚本解释器和父子进程 |
| 隐私访问 | 键盘、屏幕、音频、视频、解密数据 | 关注输入、屏幕、摄像头、麦克风、凭据访问 |
| 内存风险 | shellcode、注入管理、驱动插件 | 关注 RWX 内存、非模块执行、远程线程、驱动加载 |
| 构建链 | README、.sln、.vcxproj、lib、libx64 | 关注构建后事件、依赖来源、位数混用和产物写入 |
# 12. 常见误区
一上来就读高危插件。 这样容易看不懂调用链,也容易把防御学习变成危险操作笔记。应先看结构,再看数据流。
只看目录名,不看数据流。 目录名只能提示能力,真正的检测要看数据从哪里来、进入哪个模块、最终触发什么系统行为。
忽略
lib和libx64。 预编译库会影响链接、运行和供应链风险。32 位和 64 位库不能混看。把 Debug 行为当成 Release 行为。 README 已说明生产和调试版本加载路径不同,安全审计必须分别确认。
只看主插件,不看主控。 主控端决定功能入口、命令分发和管理逻辑。没有主控视角,就很难理解插件为什么被调用。
# 13. 本课小结
第 2 课的重点是建立全景图。当前源码可以先分成主控、主插件、第三方依赖、预编译库和构建说明五大块。主控负责界面和管理入口,主插件负责上线、网络、加载和具体功能,第三方库和预编译库提供底层支撑。后续专栏会从环境、编译、主控界面、网络协议、插件加载逐步进入每个模块。
从安全工程角度看,本课最重要的输出不是运行程序,而是目录资产表、架构角色图、插件风险矩阵和检测覆盖表。
# 14. 合法练习题
- 根据本课内容,画一张你自己的根目录结构图,标出
主控、主插件、thirdparty、lib、libx64的作用。 - 把
主插件下的所有目录按“网络基础、上线会话、系统管理、隐私采集、底层高危、其他”重新分类。 - 从目录名出发,列出你认为最需要优先审计的 5 个高风险模块,并说明原因。
- 写一张检测映射表:每类插件能力对应哪些主机、网络、内存或构建链数据源。
- 阅读
README.md,总结主控、被控、x86、x64、Debug、Release 之间的差异,不需要编译运行。
安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。
本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。
社区交流
讨论与留言