静态链接 YARA 库,实现免依赖的独立可执行文件部署

如何静态链接 YARA 库,实现免依赖的独立可执行文件部署
适用于嵌入式设备、安全产品发布、或避免目标系统安装 YARA 共享库的场景。


✅ 目标

  • 编译 YARA 为 静态库(.a
  • 使用静态库编译你的 C 程序
  • 生成 完全静态链接的可执行文件(不依赖 libyara.so
  • 实现“拷贝即运行”的免依赖部署

🧰 一、环境准备(以 Linux 为例)

推荐在干净的构建环境中操作(如 Ubuntu 20.04/22.04):

sudo apt-get update
sudo apt-get install build-essential autoconf automake libtool pkg-config

🔧 二、从源码编译 YARA(静态库模式)

1. 下载 YARA 源码

git clone https://github.com/VirusTotal/yara.git
cd yara
git checkout v4.3.2  # 推荐稳定版本(或最新 v4.x)

✅ 注意:静态编译需关闭动态库生成,开启静态库。


2. 配置并编译(仅静态库)

./bootstrap.sh          # 第一次需要生成 configure 脚本
./configure \
    --enable-static \
    --disable-shared \
    --disable-magic \
    --without-crypto \
    --prefix=/usr/local

参数说明:

参数说明
--enable-static生成 .a 静态库
--disable-shared禁止生成 .so 动态库
--disable-magic禁用 libmagic(避免额外依赖)
--without-crypto禁用 OpenSSL(hash.md5 等模块)
--prefix安装路径

⚠️ 如果你需要 hash 模块(如 hash.md5),需安装 OpenSSL 并启用:

sudo apt-get install libssl-dev
./configure ... --with-crypto

3. 编译并安装

make -j$(nproc)
sudo make install

安装后你会看到:

  • 静态库:/usr/local/lib/libyara.a
  • 头文件:/usr/local/include/yara.h/usr/local/include/yara/*

📦 三、编写测试程序(复用之前的示例)

保存为 yara_static.c

#include <stdio.h>
#include <yara.h>

int callback(YR_SCAN_CONTEXT* context, int msg, void* data, void* user_data)
{
    if (msg == CALLBACK_MSG_RULE_MATCHING)
    {
        printf("✅ 匹配规则: %s\n", ((YR_RULE*)data)->identifier);
    }
    return CALLBACK_CONTINUE;
}

int main()
{
    YR_COMPILER* compiler;
    YR_RULES* rules;
    FILE* fh;

    yr_initialize();

    yr_compiler_create(&compiler);
    fh = fopen("test.yar", "r");
    if (!fh) { perror("规则文件"); return 1; }

    yr_compiler_add_file(compiler, fh, NULL, NULL);

    if (compiler->errors > 0) {
        printf("规则编译失败\n");
        return 1;
    }

    yr_compiler_get_rules(compiler, &rules);
    fclose(fh);

    // 扫描自身(文本匹配)
    yr_rules_scan_file(rules, "yara_static.c", 0, callback, NULL, 0);

    yr_rules_destroy(rules);
    yr_compiler_destroy(compiler);
    yr_finalize();

    return 0;
}

🔗 四、静态编译你的程序

gcc -o yara_static yara_static.c \
    -I/usr/local/include \
    /usr/local/lib/libyara.a \
    -lpthread -lm -lz

关键点说明:

为什么需要
libyara.aYARA 静态库(主逻辑)
-lpthreadYARA 使用线程
-lm数学函数(某些模块使用)
-lzzlib,用于处理压缩或内存操作

✅ 此时生成的 yara_static 是 完全静态链接 的可执行文件(不依赖任何外部 .so)。


🔍 五、验证是否静态链接成功

# 检查是否依赖动态库
ldd yara_static

✅ 正确输出应为:

not a dynamic executable

或:

statically linked

❌ 如果显示 libyara.so,说明仍动态链接了,需检查编译命令。


🧪 六、测试运行

创建规则文件 test.yar

rule FoundCFile
{
    strings:
        $main = "main()" ascii
    condition:
        $main
}

运行:

./yara_static

输出:

✅ 匹配规则: FoundCFile

🚀 七、跨平台静态编译(可选:生成 Windows 版)

你可以使用 交叉编译 生成 Windows 静态可执行文件(.exe):

安装交叉编译器(Ubuntu)

sudo apt-get install gcc-mingw-w64

重新编译 YARA(Windows 静态库)

# 在 yara 源码目录
make clean

CC=x86_64-w64-mingw32-gcc \
CFLAGS="-static" \
./configure \
    --host=x86_64-w64-mingw32 \
    --enable-static \
    --disable-shared \
    --disable-magic \
    --without-crypto \
    --prefix=/tmp/yara-win64

make && make install

编译 Windows 可执行文件

x86_64-w64-mingw32-gcc -o yara.exe yara_static.c \
    -I/tmp/yara-win64/include \
    /tmp/yara-win64/lib/libyara.a \
    -lpthread -lm -lz -static

生成的 yara.exe 可在 Windows 上直接运行,无需安装任何依赖!


📦 八、部署建议

场景建议
安全网关/EDR静态链接,嵌入扫描引擎
嵌入式设备使用 musl-gcc 编译更小体积
分析工具发布打包为单文件工具(如 yara-scan.exe
容器内运行无需安装 libyara,减少镜像体积

📏 九、生成文件大小优化(可选)

静态链接后体积较大(~2-5MB),可通过以下方式减小:

# 1. 编译时优化
gcc -Os -s -DNDEBUG ...  # 启用优化、去符号、关闭调试

# 2. 去除符号表
strip --strip-all yara_static

# 3. 使用 upx 压缩(可选)
upx --best --compress-exports=0 yara_static

可将 3MB → 1MB 左右。


✅ 总结:静态链接 YARA 的完整流程

# 1. 编译 YARA 静态库
./bootstrap.sh
./configure --enable-static --disable-shared --without-crypto
make && sudo make install

# 2. 编译你的程序(静态链接)
gcc -o myscanner myscan.c /usr/local/lib/libyara.a -lpthread -lm -lz -static

# 3. 验证
ldd myscanner  # 应显示 not a dynamic executable

# 4. 部署到任意 Linux 主机,无需安装 YARA

📎 附件:一键构建脚本(build_static_yara.sh)

#!/bin/bash
git clone https://github.com/VirusTotal/yara.git
cd yara
git checkout v4.3.2

./bootstrap.sh
./configure --enable-static --disable-shared --disable-magic --without-crypto --prefix=/usr/local
make -j$(nproc)
sudo make install

echo "✅ YARA 静态库已安装"
echo "现在你可以使用 /usr/local/lib/libyara.a 进行静态编译"
此条目发表在未分类分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注