Fscan免杀实战:从源码混淆到签名劫持的全流程对抗

张开发
2026/4/8 16:35:02 15 分钟阅读

分享文章

Fscan免杀实战:从源码混淆到签名劫持的全流程对抗
1. 为什么Fscan容易被杀软识别每次用原版Fscan扫描内网刚跑起来就被杀软秒杀这种体验实在太糟心了。我刚开始用Fscan的时候也很纳闷为什么这个工具这么容易被识别后来经过多次测试和分析发现主要有三个关键特征暴露了它首先是明文字符串。用strings命令查看编译后的二进制文件你会发现大量包含fscan的路径信息比如github.com/shadow1ng/fscan/Plugins/这样的完整导入路径。杀软只需要简单匹配这些特征字符串就能准确识别。其次是代码结构特征。Fscan的代码组织结构很有特点特别是插件加载、扫描逻辑这些核心模块的调用关系形成了独特的特征码。像火绒这类杀软早就把这些特征录入了病毒库。最后是行为特征。当Fscan运行时它的端口扫描、爆破尝试等行为模式太典型了。即使你把程序改得亲妈都不认识运行时还是可能被行为检测拦截。2. 源码层改造从字符串替换到目录重构2.1 基础字符串替换第一步要处理的就是明文字符串。我习惯先用VSCode打开项目全局搜索fscan关键词grep -r fscan .你会发现主要分布在三个地方导入路径如github.com/shadow1ng/fscan/Plugins版本信息common/flag.go里的fscan version部分日志输出我的替换方案是把github.com/shadow1ng/fscan替换成local/pkg随便起个名把fscan version改成app version把所有包含fscan的日志文本都改掉2.2 深度目录重构光是替换字符串还不够我们需要重构整个项目结构在GOPATH的src目录下新建local/pkg文件夹把原项目的Plugins、WebScan、common三个核心目录移动到这里修改所有相关文件的import语句更新go.mod文件中的模块名这样改造后再用strings查看编译结果原先的特征字符串就完全消失了。不过要注意移动目录后可能会遇到包导入问题需要仔细检查每个文件的引用路径。3. 高级编译技巧garble深度混淆3.1 garble基础使用用普通go build编译还是不够安全我推荐使用garble进行深度混淆。安装garble前要注意go install mvdan.cc/garblelatest基础混淆命令garble -literals build main.go这个命令会混淆所有字符串字面量打乱函数和变量名删除调试信息3.2 进阶混淆参数我常用的强化版混淆参数garble -literals -tiny -seedrandom build -o output.exe main.go这里有几个关键点-tiny删除所有非必要信息包括文件名、行号等-seedrandom使用随机种子每次混淆结果都不同-literals对字符串进行加密处理特别注意garble对Go版本有要求建议使用1.22.x版本。如果编译报错可以尝试删除go.sum和go.mod后重新初始化模块。4. 二进制加固UPX加壳实战4.1 基础加壳操作编译后的程序还可以用UPX进一步压缩和加壳upx --best output.exe -o packed.exe加壳后文件体积会缩小30%-50%同时还能破坏部分静态特征。不过要注意不要用--ultra-brute参数可能损坏程序某些杀软会检测UPX壳建议配合其他手段使用4.2 进阶加壳技巧我常用的组合拳先用garble混淆编译用UPX加壳再用VMProtect等工具做二次保护测试发现经过这三步处理的程序静态查杀率能降到5%以下。不过VMProtect这类商业工具要谨慎使用可能会引入新的特征。5. 签名伪造Sign-Sacker实战5.1 签名劫持原理杀软对没有签名的程序格外敏感。Sign-Sacker这个工具可以借用其他合法软件的签名信息SignSacker.exe target.exe --steal-fromQQ.exe这个命令会让你的程序带上QQ的签名信息。原理是利用了Windows签名验证的漏洞并不是真正的代码签名。5.2 实战注意事项选择常见的可信签名如QQ、微信、Chrome不要用系统关键程序如explorer.exe的签名配合其他免杀手段使用效果更好某些高级杀软会检测签名伪造行为我测试发现签名劫持对Defender效果特别好但对火绒作用有限。最好是多管齐下组合使用各种技术。6. 综合测试与调优6.1 多杀软测试方案我建议搭建这样的测试环境虚拟机1Windows 10 Defender虚拟机2Windows 7 火绒虚拟机3Windows 11 360安全卫士每次修改后都在这些环境测试记录查杀结果。特别注意不同杀软的行为检测有时候静态免杀过了但运行时还是会被拦截。6.2 常见问题排查如果某一步骤失败可以这样排查检查garble版本和Go版本是否匹配确认目录重构后所有import路径都正确测试不加壳、不混淆的版本能否运行查看杀软日志了解具体检测原因记住免杀是个持续对抗的过程。今天有效的方法明天可能就被加入特征库了。关键是要理解原理灵活调整策略。

更多文章