Windows服务器上Golang可执行文件被删除问题

Windows服务器上Golang可执行文件被删除问题 我们构建的Go语言应用程序部署在Windows机器上。它会在两三天后被删除。我认为它在Windows机器上被检测为病毒。

3 回复

Go 编程语言常见问题解答

Go 是一种开源编程语言,可以轻松构建简单、可靠且高效的软件。

更多关于Windows服务器上Golang可执行文件被删除问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你是否尝试过在提交文件进行恶意软件分析 - Microsoft Security Intelligence进行测试?你可以以开发者身份提交,但请注意人工响应需要一些时间。

在Windows服务器上,Go编译的可执行文件被安全软件误删是常见问题。这通常是由于Go编译器生成的PE文件特征被误判为恶意软件。以下是解决方案:

1. 添加数字签名(最有效)

// 虽然代码本身不涉及签名,但构建后需要签名
// 使用signtool进行代码签名
signtool sign /f certificate.pfx /p password your_app.exe

2. 修改编译参数减少误报

# 使用以下编译参数
go build -ldflags="-s -w -H=windowsgui" main.go

# 或尝试UPX压缩(有时反而能绕过检测)
upx --best your_app.exe

3. 添加安全软件白名单

在Windows Defender或其他安全软件中添加排除项:

# PowerShell添加排除目录
Add-MpPreference -ExclusionPath "C:\YourAppDirectory"

4. 修改文件特征

// 在代码中添加版本信息减少可疑性
// 创建 versioninfo.rc 文件
1 VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEOS 0x40004
FILETYPE 0x1
{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904B0"
        {
            VALUE "CompanyName", "Your Company"
            VALUE "FileDescription", "Legitimate Application"
            VALUE "FileVersion", "1.0.0.0"
            VALUE "ProductName", "Your Product"
            VALUE "ProductVersion", "1.0.0.0"
        }
    }
}

编译时包含版本信息:

go build -ldflags="-H windowsgui" main.go
windres versioninfo.rc versioninfo.syso
go build -o your_app.exe

5. 使用CGO编译(改变二进制特征)

// 添加一个空的C文件 dummy.c
// 然后使用CGO编译
// go build -o your_app.exe

6. 实时监控示例

package main

import (
    "log"
    "os"
    "path/filepath"
    "time"
)

func selfProtect() {
    exePath, _ := os.Executable()
    ticker := time.NewTicker(30 * time.Second)
    
    go func() {
        for range ticker.C {
            if _, err := os.Stat(exePath); os.IsNotExist(err) {
                log.Fatal("可执行文件已被删除,程序退出")
            }
        }
    }()
}

func main() {
    selfProtect()
    // 你的应用逻辑
}

7. 部署脚本示例

# deploy.ps1 - 部署时自动添加排除项
$appPath = "C:\YourApp"
$exeName = "yourapp.exe"

# 停止服务(如果以服务运行)
Stop-Service -Name "YourAppService" -ErrorAction SilentlyContinue

# 添加Windows Defender排除
Add-MpPreference -ExclusionPath $appPath
Add-MpPreference -ExclusionProcess "$appPath\$exeName"

# 复制新版本文件
Copy-Item -Path ".\$exeName" -Destination $appPath -Force

# 重启服务
Start-Service -Name "YourAppService"

主要原因是Go编译的二进制文件缺少数字签名,且某些编译特征被安全软件误判。建议优先考虑商业代码签名证书,这是最彻底的解决方案。

回到顶部