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。

我之前看到过关于木马的讨论,这也是误报吗?

2 回复

别担心,安全软件发疯不是一两天的事,只要你知道自己在做什么,那就相信它。(虽然我已经放弃在Windows上开发东西了,目前只在macOS和Ubuntu上写代码。)

更多关于Golang中的Win32/Packed.GoLang_AGen.AO病毒分析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据ESET的检测报告,这很可能是误报。Go语言的工具链(尤其是asm.exe)经常被一些杀毒软件误判为病毒,主要原因如下:

  1. 打包特征:Go编译器生成的二进制文件采用静态链接,包含完整的运行时和依赖库,这种打包方式与某些病毒打包技术相似。

  2. 自修改行为:Go工具链在执行时可能会修改或生成临时文件,这种行为可能触发启发式检测。

  3. 代码混淆:编译器生成的机器代码模式可能被误判为恶意代码特征。

验证文件完整性的方法:

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("警告:文件哈希不匹配")
	}
}

临时解决方案:

  1. 添加杀毒软件排除项
# 将Go安装目录添加到排除列表
Add-MpPreference -ExclusionPath "C:\Program Files\Go"
  1. 验证Go安装的完整性
# 重新安装并验证
go version
go env
  1. 使用VirusTotal验证:将asm.exe上传到VirusTotal进行多引擎扫描,确认是否为广泛误报。

建议操作

  • 从官方golang.org重新下载安装包
  • 验证下载文件的SHA256哈希
  • 暂时禁用杀毒软件进行安装,然后将目录加入白名单

这种情况在安全社区已有多次报告,主要是杀毒软件的特征库误判。如果文件来自官方渠道且哈希值匹配,可以安全地将其添加到杀毒软件排除列表中。

回到顶部