Windows服务器上Golang可执行文件被删除问题
Windows服务器上Golang可执行文件被删除问题 我们构建的Go语言应用程序部署在Windows机器上。它会在两三天后被删除。我认为它在Windows机器上被检测为病毒。
3 回复
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编译的二进制文件缺少数字签名,且某些编译特征被安全软件误判。建议优先考虑商业代码签名证书,这是最彻底的解决方案。

