Golang编译器生成的exe文件触发Windows Defender警报的解决方法

Golang编译器生成的exe文件触发Windows Defender警报的解决方法 你好,早上好。昨天,在一次 Windows 更新之后,Windows Defender 开始将我的编译结果标记为恶意软件。这个包唯一的依赖是 cobra cli。有人遇到过同样的问题吗?

..\AppData\Local\Temp\go-build4265423361\b001\exe\a.out.exe: Operation did not complete successfully because the file contains a virus or potentially unwanted software.

更多关于Golang编译器生成的exe文件触发Windows Defender警报的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

从昨天开始,这“不是正常行为”。Go编译器总是在Temp文件夹中生成a.exe,而WD从未以这种方式触发。

更多关于Golang编译器生成的exe文件触发Windows Defender警报的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


遗憾的是,行为会因病毒扫描程序及其版本/数据库/或其他因素而改变。

请咨询您的杀毒软件开发商如何解决此问题。

这是Windows上任何病毒扫描程序的正常行为。它们时不时就会对任何自建程序这样做,特别是当这些程序从类似那样的临时文件夹运行时。

将你的临时文件夹设为例外可能会有所帮助,尽管这会带来一些风险。

这主要归结为两个原因:

  • 使用Go开发的恶意软件数量远多于桌面应用程序。
  • Go二进制文件独特且可识别的结构,加上一些防病毒供应商和基于异常的入侵防御系统(IPS)的检测算法不佳。

这种情况通常是由于 Windows Defender 的启发式扫描将新编译的 Go 可执行文件误判为恶意软件。以下是几种解决方法:

1. 添加 Windows Defender 排除项

将你的项目目录或 Go 编译输出目录添加到 Windows Defender 排除列表:

// 临时解决方案:编译时指定输出目录并排除
go build -o myapp.exe

然后在 Windows 安全设置中添加排除:

  • 打开 Windows 安全中心
  • 进入"病毒和威胁防护"
  • 点击"管理设置"
  • 在"排除项"中添加你的项目目录

2. 使用数字签名

为你的可执行文件添加数字签名可以避免误报:

// 编译时使用 -ldflags 添加版本信息
go build -ldflags "-s -w -X main.Version=1.0.0" -o myapp.exe

然后使用有效的代码签名证书签名:

signtool sign /f certificate.pfx /p password myapp.exe

3. 调整编译选项

某些编译选项可能减少误报:

// 禁用优化和内联
go build -gcflags="all=-N -l" -o myapp.exe

// 或者使用 UPX 压缩(有时反而会减少误报)
go build -o myapp.exe && upx myapp.exe

4. 提交误报文件

向 Microsoft 提交误报报告:

5. 检查依赖项

确保 cobra 依赖是最新版本:

// 更新所有依赖
go get -u ./...

// 或者指定版本
go get github.com/spf13/cobra@v1.6.1

6. 使用不同的输出名称

有时特定的文件名会被标记:

// 避免使用常见的可疑名称
go build -o mycli.exe  // 而不是 a.exe 或 test.exe

7. 完整示例

package main

import (
    "fmt"
    "github.com/spf13/cobra"
)

func main() {
    var rootCmd = &cobra.Command{
        Use:   "myapp",
        Short: "A simple CLI application",
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Println("Hello from Go application")
        },
    }
    
    if err := rootCmd.Execute(); err != nil {
        fmt.Println(err)
    }
}

编译命令:

# 使用特定输出名称和优化选项
go build -ldflags "-s -w" -o myapp-release.exe

这种情况通常是暂时的,Windows Defender 会在后续更新中修正误报。建议同时使用排除项和提交误报报告的组合方案。

回到顶部