Golang中的Win32/Packed.GoLang_AGen.AO病毒分析
Golang中的Win32/Packed.GoLang_AGen.AO病毒分析
ESET 杀毒软件刚刚移除了 C:\Program Files\Go\pkg\tool\windows_amd64\asm.exe,原因是检测到变种 Win32/Packed.GoLang_AGen.AO。
ESET 还指出,当 C:\Program Files\Go\bin\go.exe 尝试运行该可执行文件时,发生了此事件。
我最近安装了来自官方 amd64/msi 的 Go 1.23.1。
我之前看到过关于木马的讨论,这也是误报吗?
别担心,安全软件发疯不是一两天的事,只要你知道自己在做什么,那就相信它。(虽然我已经放弃在Windows上开发东西了,目前只在macOS和Ubuntu上写代码。)
更多关于Golang中的Win32/Packed.GoLang_AGen.AO病毒分析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
根据ESET的检测报告,这很可能是误报。Go语言的工具链(尤其是asm.exe)经常被一些杀毒软件误判为病毒,主要原因如下:
-
打包特征:Go编译器生成的二进制文件采用静态链接,包含完整的运行时和依赖库,这种打包方式与某些病毒打包技术相似。
-
自修改行为:Go工具链在执行时可能会修改或生成临时文件,这种行为可能触发启发式检测。
-
代码混淆:编译器生成的机器代码模式可能被误判为恶意代码特征。
验证文件完整性的方法:
package main
import (
"crypto/sha256"
"fmt"
"io"
"os"
)
func main() {
// 计算asm.exe的SHA256哈希值
filePath := `C:\Program Files\Go\pkg\tool\windows_amd64\asm.exe`
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("无法打开文件: %v\n", err)
return
}
defer file.Close()
hash := sha256.New()
if _, err := io.Copy(hash, file); err != nil {
fmt.Printf("计算哈希失败: %v\n", err)
return
}
hashValue := fmt.Sprintf("%x", hash.Sum(nil))
fmt.Printf("asm.exe SHA256: %s\n", hashValue)
// 官方Go 1.23.1 windows/amd64 asm.exe的预期哈希值
expectedHash := "替换为官方发布的哈希值" // 需要从官方渠道获取
if hashValue == expectedHash {
fmt.Println("文件完整性验证通过")
} else {
fmt.Println("警告:文件哈希不匹配")
}
}
临时解决方案:
- 添加杀毒软件排除项:
# 将Go安装目录添加到排除列表
Add-MpPreference -ExclusionPath "C:\Program Files\Go"
- 验证Go安装的完整性:
# 重新安装并验证
go version
go env
- 使用VirusTotal验证:将
asm.exe上传到VirusTotal进行多引擎扫描,确认是否为广泛误报。
建议操作:
- 从官方golang.org重新下载安装包
- 验证下载文件的SHA256哈希
- 暂时禁用杀毒软件进行安装,然后将目录加入白名单
这种情况在安全社区已有多次报告,主要是杀毒软件的特征库误判。如果文件来自官方渠道且哈希值匹配,可以安全地将其添加到杀毒软件排除列表中。

