找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

241

积分

1

好友

23

主题
发表于 前天 04:12 | 查看: 8| 回复: 0

在安全事件响应和威胁狩猎工作中,自动化工具结合第三方规则库能快速识别已知恶意软件。Go语言因其编译后生成静态二进制文件的特性,成为跨平台部署的理想选择。与Python环境依赖复杂、兼容性差相比,Go程序只需选用合适版本(如1.20)即可兼容Windows 7至Windows 11全系列系统。

通过开源库hillu/go-yara可实现Go调用YARA进行文件及进程扫描,但在实际配置过程中常遇到编译错误和环境依赖问题。本文将详细介绍完整的Windows环境配置流程,帮助开发者快速搭建稳定的威胁狩猎开发环境。

环境准备

  1. Go安装 访问官网下载最新版本,Windows平台建议直接安装最新稳定版

  2. MSYS2环境 下载地址:https://www.msys2.org/ 提供C API调用支持,便于配置第三方依赖库

  3. YARA源码 从GitHub仓库https://github.com/VirusTotal/yara 下载后解压至任意目录(推荐放置于C盘根目录)

MSYS2安装与配置

  1. 运行安装程序并按默认选项完成安装,过程中若卡在50%请耐心等待 安装界面 安装进度

  2. 安装完成后取消勾选"Run MSYS2 Now",直接点击完成 完成界面

  3. 找到MSYS2 MINGW64图标,右键选择管理员身份运行 软件图标

  4. 执行包数据库更新(需重复三次):

    pacman -Syu        # 第一次执行后会自动关闭窗口
    pacman -Syu        # 重新打开后执行第二次
    pacman -Su         # 第三次更新

    首次执行时输入Y确认更新 更新确认 更新完成

  5. 安装依赖包:

    pacman -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-gcc mingw-w64-x86_64-file mingw-w64-x86_64-make mingw-w64-x86_64-pkg-config base-devel openssl-devel autoconf-wrapper automake libtool

    遇到选项时首次回车确认,第二次输入Y回车 依赖安装

  6. 配置系统环境变量PATH,添加以下路径(默认安装位置):

    C:\msys64\mingw64\bin
    C:\msys64\usr\bin

    环境变量配置 路径添加

YARA编译

通过MSYS2 MINGW64进入YARA源码目录(如cd /c/yara),依次执行:

./bootstrap.sh
./configure --enable-magic --with-crypto --disable-shared
make
make install

编译过程中出现的函数未定义警告可忽略,只要最终生成yara.exe即表示成功 编译过程 安装完成

Go环境变量配置

  1. 基础环境变量设置(CMD中执行):

    go env -w CGO_ENABLED=1
    go env -w GOARCH=amd64
  2. 配置CGO编译标志:

    go env -w CGO_CFLAGS="-IC:\yara\libyara\include"
  3. 配置链接标志(路径根据实际安装位置调整):

    go env -w CGO_LDFLAGS="-LC:/yara/.libs -lyara -lcrypto -lmagic -lssl -lcrypt32 -lws2_32 -lwsock32 -lz -lshlwapi -lgnurx -ltre -lintl -liconv"

    环境变量设置

环境验证

执行以下命令验证环境配置:

gcc -v
pkg-config --modversion yara

验证结果

完成验证后重启系统使配置生效。

创建测试项目,使用以下示例代码:

package main

import (
    "fmt"
    "github.com/hillu/go-yara/v4"
)

func main() {
    c, err := yara.NewCompiler()
    if c == nil || err != nil {
        fmt.Println("Error to create compiler:", err)
        return
    }

    rule := `rule test {
        meta:
            author = "Aviad Levy"
        strings:
            $str = "abc"
        condition:
            $str
    }`

    if err = c.AddString(rule, ""); err != nil {
        fmt.Println("Error adding YARA rule:", err)
        return
    }

    r, err := c.GetRules()
    if err != nil {
        fmt.Println("Error getting YARA rule:", err)
        return
    }

    var m yara.MatchRules
    err = r.ScanMem([]byte(" abc "), 0, 0, &m)
    if err != nil {
        fmt.Println("Error matching YARA rule:", err)
        return
    }
    fmt.Printf("Matches: %+v", m)
}

运行测试:

go run -ldflags "-extldflags=-static" -tags yara_static main.go

编译生成可执行文件:

go build -ldflags "-extldflags=-static" -tags yara_static main.go

测试结果

参考文档

您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-1 14:12 , Processed in 0.055352 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表