Golang Go语言编译的Windows文件报毒,是哪儿出问题了?

编译一个 windows 可执行文件

docker run --rm -v $(pwd):/go/src -it golang /bin/bash
go version
mkdir -p hasvir
cd hasvir
echo "package main" > main.go
echo "func main(){}" >> main.go
go mod init
GOOS=windows go build
md5sum hasvir.exe

go 的版本是 1.20.5 。
把 hasvir.exe 提交到 https://www.virustotal.com 扫描,扫描出一大堆病毒。

我看不出操作和代码有什么问题,是从什么地方感染病毒的呢?是哪儿出问题了?


Golang Go语言编译的Windows文件报毒,是哪儿出问题了?

更多关于Golang Go语言编译的Windows文件报毒,是哪儿出问题了?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

56 回复

不一定是你代码的问题. 只是最近不少恶意程序都是 go 写的, 干脆直接把 go 写的全报毒了…

更多关于Golang Go语言编译的Windows文件报毒,是哪儿出问题了?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


可能是系统被污染了吧……

go 本来就是容易报毒

为了规避系统感染病毒的风险,特意在 docker 容器里编译的,编译完原地算的 md5 ,确保文件没有被外部系统篡改

误伤面太大了,用 go 编译的应用都提心吊胆的,不知道是真有病毒还是误报

没签名的软件被误报毒很正常的-。-

不是楼主的问题,它就是很容易报毒的,要么添加数字签名,要么一家家提交消除误报。

签名仅是一个报毒豁免,没毒的软件被大规模误报有毒,这不正常

看来还得为了杀毒软件学习一下数字签名

这很正常,因为现在有不少病毒或者恶意程序用 go 编写的,而主流的杀毒软件厂商基本都进入了 AI 自动分析时代,学习的样本多了就广泛误报,只能人工干预。

很正常,杀毒软件对比特征库,宁可错杀一千。
比如易语言编译出来的二进制几乎会被所有杀毒软件杀。

代码中是不是用到了加密功能啥的?

我怀疑你看到标题就回复了,根本没看帖子的具体内容

另一方面说明现在用 go 编写的 windows 还是太少了,正向反馈太少,误报得不到修正

就是垃圾 WindwosDenfence ,我最近写 Go 程序也报毒,而且没有任何敏感操作,连读文件的操作都没有,写着写着就报毒。

易语言的处境太难了

自己写的,自己清楚有没有病毒;若是打包发布出去供其他人用也报毒就难办,敏感的人直接就删除了

加壳,upx

加壳之后杀的更厉害。 自己用验个 md5 就无所谓了,放出去用的话要么搞白签名,要么一步步二分代码去找到误报的接口,换个方式实现。

你这个太简单了,复杂的 go 程序不容易报毒

淡定,Go 语言写个 helloworld 都报毒

我用 Wails 开发的一个 GUI 客户端没有报毒,按#22 说的,可能复杂的项目不报毒,特征码占得总比例低于阈值。

upx 加壳报毒更多

大佬,你看俺这个代码怎么个二分法……

我信了,你信不?

就一行 func main(){} ,淡定不了

病毒特征码比例低就不报毒?俺不懂杀毒软件的报毒逻辑,你别骗俺

rust 也报,写个二维码小工具都报,杀软用的 360

360 出没

越容易上手的语言越容易报

正常,我在公司的也报毒给我自动删了,我在 mod 文件中将 go 版本指定到更老的就正常了。 估计用的过新的编译出来的特征对杀毒软件来说还过于新鲜吧

VMP 了解下

最恼火是,前面我不知道,每次 goland 编译完了去找二进制文件就发现不再了,让我一度怀疑没编译成功,公司杀软误伤了也不提示,后来看杀软记录才发现,然后降低版本就没有被杀了

买个证书签名一下,真要做项目赚钱就只能这样

我曾经写过的一个 Go 小工具,一直没有报毒,直到有一天心血来潮把 Go 1.15 升级到了 1.16 (两年前的事了),然后就有人反馈报毒了,最后我只能挨个申诉,好在 Microsoft Defender 处理最快,除此之外就卡巴斯基回复通过了,其他的杀毒软件(如 McAfee 、360 )完全没反应。。。

不过我后来升级到 1.18 也没有再有人反馈报毒了,不过我一般都不追求最新,即使是现在也还是 1.18 。。。

正式发布还是得买个证书来数字签名;
只签应用层的大概一年 5000 左右

我在 windows 上编辑的 exe 也经常报毒,解决方案是关掉安全软件 hhh

难搞,看来真得搞一个签名了

我没测 360 ,楼上说 rust 的简单应用会被 360 误报

大佬指定到什么版本了?

还好我都是在 docker 里编译再复制出来的,没有遇到过编译出来直接被删的情况

5000/年,对公司就是小意思,对于个人还是太贵了

没法让用你软件的人关掉安全软件啊,仅自己用,怎么操作都无所谓

编译的 GO 程序莫名消失

我靠 你这个几行代码这也报读,有点离谱了吧

把编译路径添加到杀毒软件的例外列表里吧,或者用 docker 编译

不够离谱都不敢自称杀毒软件,手动狗头

自己写代码的目录连着编译环境全都加到白名单,不然影响 IO 性能

好像是 1.18 升级 1.19 后编译被误杀,go mod 里面改成 1.18 就好了,说不定现在改成 1.19 也能正常了,我司是订阅的卡巴斯基杀的

太好了,这么详细

针对您提出的“Golang Go语言编译的Windows文件报毒”问题,可能的原因及解决方案如下:

原因分析

  1. 特定编译选项:使用-ldflags -H windowsgui编译选项时,由于隐藏了CMD窗口,可能导致某些杀毒软件误判为病毒行为。
  2. 临时文件问题:在编译过程中,生成的临时文件可能被杀毒软件误认为是病毒或潜在的不受欢迎软件。
  3. 旧版Go语言漏洞:若您使用的是存在安全漏洞的旧版Go语言编译器,编译出的程序可能会因漏洞而被杀毒软件标记。

解决方案

  1. 调整编译选项:避免使用-ldflags -H windowsgui,改用代码隐藏CMD窗口的方式。
  2. 添加病毒排除项:将编译过程中涉及的临时文件目录(如C:\Users\...\AppData\Local\Temp\)添加到杀毒软件的病毒排除项中。
  3. 更新Go语言编译器:确保使用最新版本的Go语言编译器,以避免因旧版漏洞导致的误报。

综上所述,建议从编译选项、杀毒软件设置及Go语言编译器版本等方面入手,逐一排查并解决问题。希望以上建议能对您有所帮助。

回到顶部