LoginSignup
4
3

More than 5 years have passed since last update.

RustのFFI経由でlibyaraを使う。

Last updated at Posted at 2017-08-25

はじめに

RustでもYara rule使いたかった。それだけなんだよ。
Pythonだけゆうぐうされやがって!

※この記事の内容を使って書いたツール(2018年5月5日)
関連記事(Qiita) RustとC(FFI)でテキスト及びバイナリgrepツールを作ってみた

Rustで叩けると何が良いか。
http://yara.readthedocs.io/en/v3.6.3/index.html
パターン書いて、バイナリの中に存在する何か特定の文字列やバイト列を引っこ抜いてくるとか、パターンに一致したらランサムウェアとかスパイウェアとかそういう分類分けするとか・・・に使える。

で、一応C言語のAPIもあるらしいので、Windows上でライブラリをビルドできれば大勝利。
http://yara.readthedocs.io/en/v3.6.3/capi.html

Windows上でビルドする。

VCは使わない。
(諸事情により、VS Communityは使わない方針で。使う方が圧倒的に楽ではある)

Windows 10上のBashを起動して下記のコマンド淡々と打ち込む。
(Windows 10 ver 1703(build 15063.540)のWSL)

apt-get update
apt-get install build-essential git
apt-get install gcc-multilib gcc-mingw-w64 autoconf automake libtool libjansson-dev libmagic-dev libssl-dev
git clone --depth=50 https://github.com/VirusTotal/yara.git VirusTotal/yara
export CONFIGFLAGS=--host=x86_64-w64-mingw32
export CC=gcc
cd VirusTotal/yara
./bootstrap.sh
unset CC
./configure $CONFIGFLAGS
make

ライブラリがビルドできたかどうか確認する

cd libyara/.libs
file libyara.a

ビルドできたのが確認できたら、Rustから叩いてみる。

cargo new yara --bin
cd yara
mkdir lib
# 以下の移動元パスは、libyara.aが有るパスを指定する。(コピペNG)
mv /path/to/libyara.a ./lib/

すると、ディレクトリの構成はこうなるはず。
yara
┣lib
┃┗libyara.a
┣src
┃┗main.rs ← これを開く
┣Cargo.toml
┗.gitignore

main.rsを編集する


extern crate libc;

#[link(name = "yara",kind = "static")]
extern{
    pub fn yr_initialize()->libc::c_int;
    pub fn yr_finalize()->libc::c_int;
}

fn main() {
    unsafe{
        yr_initialize();
        yr_finalize();
    }
}

次に、ビルドスクリプトをトップディレクトリに追加して編集する。

yara
┣lib
┃┗libyara.a
┣src
┃┗main.rs
┣Cargo.toml
┣build.rs ←これ
┗.gitignore

やってることは、ライブラリの検索パスをコンパイラに標準出力経由で伝えてるだけ。

fn main() {
    println!("cargo:rustc-link-search=native=.\\lib");
}

からの、cargo build でビルドが通るはずなので、後は定義情報とかゴリゴリ書いたり
Rustでラッピングして、使いやすいクラスにしたり自由に料理する感じで。

おわり。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3