Golang编译生成的exe文件被误报为病毒怎么办

Golang编译生成的exe文件被误报为病毒怎么办 我编写了一个Go程序,用于通过LaTeX和操作系统内置工具创建PDF和ZIP文件(它需要在Linux和Windows上运行)。几天前,Windows Defender将我的exe文件归类为木马病毒。由于我会与朋友分享这个文件:我该如何确保我的程序不被标记为病毒?或者我的代码应该怎么写才能避免这种情况?

PDF和ZIP文件在一个导出文件夹中创建。程序执行以下步骤:

  • 清空导出文件夹。
  • 测试图像是否符合特定尺寸。
  • 临时复制.tex文件。
  • 启动LaTeX/Docker,使用.tex文件生成多个PDF。
  • 创建一个ZIP文件。
  • 删除临时副本。
  • 删除一些由LaTeX创建的文件。
  • 控制台中的文本以绿色或红色显示。

因此,我使用了诸如os.RemoveAllos.Mkdirexec.Command等命令。

我使用以下命令编译程序:

GOOS=windows GOARCH=amd64 go build -o start_myprogramm.exe -ldflags="-s -w" src/,y-programm.go;

我的导入部分如下所示:

import (
    "archive/zip"
    "bufio"
    "fmt"
    "image"
    _ "image/jpeg"
    "io"
    "log"
    "os"
    "os/exec"
    "path/filepath"
    "regexp"
    "strings"
    "sync"
    "time"

    "github.com/fatih/color"
)

我阅读过类似的案例。其中提到可以对文件进行签名。这会是解决问题的办法吗?我该如何找出问题的确切所在?


更多关于Golang编译生成的exe文件被误报为病毒怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我认为你最好的做法是联系 Windows Defender 支持团队。根据官方常见问题解答

为什么我的病毒扫描软件认为我的 Go 发行版或编译的二进制文件被感染了?

这是一个常见的情况,尤其是在 Windows 机器上,并且几乎总是误报。商业病毒扫描程序常常被 Go 二进制文件的结构所迷惑,因为它们不像其他语言编译的文件那样常见。

如果你刚刚安装了 Go 发行版,而系统报告它被感染了,那肯定是个错误。为了彻底确认,你可以通过比较下载页面上的校验和来验证下载的文件。

无论如何,如果你认为报告有误,请向你的病毒扫描软件供应商报告一个错误。也许随着时间的推移,病毒扫描程序能够学会理解 Go 程序。

这里是Ian Lance Taylor 的一条评论

Go 常见问题解答没有提供关于这个问题的更多信息,因为我们对此一无所知。我们不知道为什么 Windows 病毒扫描程序倾向于对 Go 二进制文件产生误报。我们没有就此与微软进行过多沟通,因为我们看到的错误报告通常是关于第三方病毒扫描产品的,而不是关于微软本身的。话虽如此,这篇文章确实提到了 Windows Defender,所以情况可能已经发生了变化。

还有另一条

在这里发帖是可以的,但 Go 项目不会对此采取任何行动。

再次强调——这只是重申了这是病毒扫描程序的问题,而不是 Go 的问题。我希望我能提供更多帮助,但在我作为 Gopher 的这些年里,实际上还没有遇到过这个问题。也许其他人可以提供更有用的信息。

更多关于Golang编译生成的exe文件被误报为病毒怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个常见的Go程序在Windows上被误报的问题。以下是几种解决方案:

1. 代码签名(最有效的方法)

对可执行文件进行数字签名是最可靠的解决方案:

// 虽然代码本身无法解决签名问题,但你可以使用以下构建脚本配合签名工具
// build_and_sign.bat
@echo off
set GOOS=windows
set GOARCH=amd64
go build -o myprogram.exe -ldflags="-s -w" src/my-programm.go
signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com myprogram.exe

你需要从证书颁发机构(如DigiCert、Sectigo)购买代码签名证书。

2. 调整构建参数

某些防病毒软件对特定的构建标志更敏感:

// 尝试移除-s -w标志或使用不同组合
go build -o myprogram.exe src/my-programm.go

// 或者只使用-w
go build -o myprogram.exe -ldflags="-w" src/my-programm.go

// 尝试禁用内联优化
go build -o myprogram.exe -gcflags="-l" src/my-programm.go

3. 添加防病毒软件白名单

引导用户将你的程序添加到Windows Defender白名单:

// 可以在程序中添加说明
func showSecurityNotice() {
    fmt.Println("如果Windows Defender误报本程序为病毒:")
    fmt.Println("1. 打开Windows安全中心")
    fmt.Println("2. 选择'病毒和威胁防护'")
    fmt.Println("3. 点击'保护历史记录'")
    fmt.Println("4. 找到本程序并选择'允许'")
}

4. 使用UPX加壳(可能有用,也可能加重问题)

# 先编译,再用UPX压缩
go build -o myprogram.exe src/my-programm.go
upx --best myprogram.exe

5. 分析具体触发原因

创建最小复现示例来定位问题:

// test_minimal.go - 逐步添加功能测试哪个操作触发误报
package main

import (
    "os"
    "os/exec"
)

func main() {
    // 测试1: 仅空操作
    // 测试2: 添加文件操作
    os.Remove("test.txt")
    // 测试3: 添加命令执行
    cmd := exec.Command("cmd", "/c", "echo test")
    cmd.Run()
    // 逐步添加你的实际功能...
}

6. 向防病毒厂商提交误报

大多数防病毒厂商都有误报提交页面。提交你的程序供他们分析。

7. 使用不同编译器版本

# 尝试不同Go版本
go1.20.0 build -o myprogram.exe src/my-programm.go

8. 避免敏感操作模式

某些操作模式更容易被误报:

// 避免使用可疑的文件名
// 不要使用类似病毒行为的模式
func safeFileOperations() {
    // 明确操作目的,避免批量删除系统文件
    // 使用合理的延迟
    time.Sleep(100 * time.Millisecond)
    
    // 避免同时操作过多文件
    // 使用明确的路径,避免通配符删除
}

最可靠的解决方案是代码签名,虽然需要成本,但能从根本上解决问题。对于开源项目,可以考虑申请免费的开源代码签名证书。

回到顶部