商用杀毒软件是工程系统,C++仅用于驱动通信、内存扫描等高性能模块,UI和云查杀等由Python/C#/Go实现;初学者应从用户态文件扫描起步,避开内核驱动开发。

杀毒软件不是用 C++ 写出来的,而是用 C++ 实现底层关键模块
直接用 C++ 从零写一个能商用的杀毒软件不现实——它本质是工程系统,不是单个程序。C++ 在这里的作用很明确:处理驱动层通信、内存扫描、PE 文件解析、反调试/反沙箱逻辑等对性能和系统权限要求极高的部分。UI、云查杀协议、策略配置、日志上报这些,通常由 Python、C# 或 Go 承担。
如果你刚接触安全开发,先别碰 Minifilter 驱动或 ETW 事件订阅。从用户态文件扫描器开始更实际:
- 用
CreateFile+ReadFile读取文件原始字节(注意绕过重定向,加FILE_FLAG_BACKUP_SEMANTICS) - 用
ImageNtHeader和ImageSectionHeader解析 PE 结构,检查入口点是否在合法节内 - 对可疑区域做简单字节特征匹配(比如
"MZ"后紧跟0x90 0x90的 NOP 滑板) - 避免直接调用
VirtualAllocEx注入或WriteProcessMemory修改进程——这会触发大多数现有杀软报警
Windows 驱动签名和测试模式是绕不开的坎
想让自己的扫描驱动(如 minifilter)加载进内核,必须通过微软 WHQL 签名,而个人开发者几乎拿不到。临时方案只有两个:
- 开启测试签名模式:
bcdedit /set testsigning on,重启后右下角会出现“测试模式”水印 - 使用
signtool sign /v /a /s PrivateCertStore /n "Your Cert Name" driver.sys签一个自签名证书,并导入到“受信任的根证书颁发机构” - 即使如此,Win11 22H2+ 默认禁用未认证的 minifilter,需额外执行
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CI\Policy" -Name "UpgradedSystem" -Value 0(注册表项可能随版本变化)
没走通这一步,FltRegisterFilter 会直接返回 STATUS_INVALID_PARAMETER,而不是更具体的错误码。
立即学习“C++免费学习笔记(深入)”;
特征码扫描快 ≠ 安全有效,混淆和加壳会让它失效
硬编码字符串或字节序列(如 "This program cannot be run in DOS mode")只能捕获裸马或老旧样本。真实恶意软件普遍使用:UPX、VMProtect、Themida 加壳,或运行时解密 shellcode。
这时候 C++ 能做的不是“加更多特征”,而是转向行为分析基础能力:
- 用
PsSetCreateProcessNotifyRoutineEx监控进程创建(注意 Win10 1809+ 已弃用,改用EtwEventRegister订阅Microsoft-Windows-Kernel-Process) - 通过
NtQueryInformationProcess获取ProcessBasicInformation,再读取PebBaseAddress判断是否被注入(检查Ldr链表完整性) - 对目标进程调用
VirtualQueryEx扫描MEM_COMMIT | PAGE_EXECUTE_READWRITE内存页——这种页在正常程序中极少出现
这些操作本身不报毒,但频繁调用会显著拖慢系统;每秒监控超过 3 个进程,就可能被 Windows Defender 标记为“潜在恶意行为”。
不要自己实现 HTTPS 或 JSON 解析
杀毒软件需要上报样本哈希、进程树、注册表变更到云端。这时候别手撸 TLS 握手或写 json_parser.cpp——既容易出漏洞,又会被引擎误报为“可疑网络行为”。
正确做法是复用系统组件:
- 用
WinHttpAPI(非WinInet)发 POST 请求,它默认走系统代理且支持 SNI,不容易被拦截 - 用
Windows.Data.Json(C++/WinRT)解析响应,避免引入第三方库的符号特征 - 所有网络请求必须带明确
User-Agent,例如"MyAV/1.0 (Windows 10.0.22621; x64)",否则某些云查杀接口会直接 403
真正难的部分从来不是“怎么扫”,而是“怎么在不卡死系统、不被系统反制、不被其他杀软拉黑的前提下持续运行”。很多细节藏在 fltmc filters 输出顺序、ETW session 缓冲区大小、甚至 ObRegisterCallbacks 的回调优先级里——这些没法靠堆代码解决。


















