はじめに
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でラッピングして、使いやすいクラスにしたり自由に料理する感じで。
おわり。