こんにちは、名探偵セキュリティアナリストの皆さん! 🔫
前回は、YARAルールの理論(Meta, Strings, Condition)を学びました。「文字列と条件を組み合わせて検出する」という原理は理解できましたか?
しかし、理論よりも重要なのは、「一体『どのような』文字列を使うべきなのか?」ということです。
適当に選んでしまうと、Windowsの電卓(calc.exe)をマルウェアと検出してしまう大惨事(誤検知)が起きたり、ハッカーが文字を一つ変えるだけで検出に失敗(未検知)したりします。
本日は、分析が完了したマルウェアサンプルから、他の正常なファイルとは重複しない「絶対的にユニークなシグネチャ」を選別する実習を行います。
これさえうまくできれば、皆さんのYARAルールは逸品になります! ✨

1. 💎 「ユニークさ」とは何か? (ゴールデンルール)
シグネチャを選ぶ際の第一原則は「特異性(Specificity)」です。
- ❌ 悪い例 (あまりにも一般的):
- kernel32.dll, CreateFile, OpenProcess, HTTP/1.1
- 👉 世界中のほとんどすべてのプログラムが持っている内容です。絶対に使わないでください!
- ✅ 良い例 (非常に特異):
- C:UsersHackerProjectRansomReleasemain.pdb (開発者パス)
- Global{A1B2-C3D4-Hack-Me} (特異なミューテックス)
- E8 ?? ?? ?? ?? 83 C4 04 85 C0 74 12 (特定の暗号化関数の機械語コード)
私たちはこれから、テキストとHex(機械語)の二つの観点から、この宝石のような指紋を見つけ出します。
2. 📝 [実習 1] テキスト文字列の選別
最も簡単で直感的な方法です。StringsツールやPestudioで抽出したリストをもう一度見てみましょう。
🎯 選別ポイント 3つ
① 誤字(Typos)と文法ミス 🤪
ハッカーは急いでコーディングするため、誤字を頻繁に犯します。正常なマイクロソフトの開発者なら決してしないような誤字は、最高のシグネチャです。
- 例: Successflly (Successfullyの誤字), Dissable (Disableの誤字)
- ヒント: 文法が間違っている文章も非常に良いです。(”Your computer are belong to us”)
② ハードコードされた固有パス (PDB Path) 📂
開発者がコードをコンパイルする際に残るデバッグ情報です。ユーザー名やプロジェクト名が露骨に現れます。
- 例: D:WorkMalware_v2Backdoorpayload.pdb
- 選別: Malware_v2やBackdoorのような単語はユニークです。
③ 特異なフォーマットの文字列 🔑
ランサムウェアの場合、ユーザーID生成や通信のために特定の形式を使用します。
- 例: uid=%d&os=%s&ver=2.1 (C2通信フォーマット)
- 例: —–BEGIN RANSOM KEY—– (暗号化キーヘッダー)
3. 🧩 [実習 2] Hex文字列の選別 (応用)
テキストはハッカーが簡単に変更できます。しかし、コードの構造(ロジック)は簡単には変更できません。
このときに使用するのが、機械語コードであるHex文字列です。
🛠️ ツール: Ghidra または IDA Pro
👣 ステップバイステップ抽出方法
- コア関数へ移動: 前回の実習で見つけた、主要な悪性挙動関数(例:暗号化関数、C2接続関数)へ移動します。
- バイト表示: アセンブリ命令の横にある16進数値(Opcode Bytes)を確認します。
⚠️ [非常に重要] ワイルドカードを使用せよ!
>
単にHexコードをコピーしてはいけません。「アドレス(Address)」の値は、ファイルが実行されるたび、あるいはバージョンごとに変わる可能性があるからです。
>
– 元のコード: E8 40 12 00 00 ( CALL 0x00001240 )
– ここで、40 12 00 00は呼び出す関数のアドレス(相対距離)です。これは変わる可能性があります。
– E8はCALL命令自体です。これは変わりません。
– YARAルール変換: { E8 ?? ?? ?? ?? }
– 変更される可能性のあるアドレス部分は、疑問符(??)で処理してワイルドカード(Wildcard)を適用する必要があります。
✅ 推奨するHexパターン:
- 関数プロローグ(Prolog): 55 8B EC (Push ebp; Mov ebp, esp) のようにあまりにも明白なものは避けてください。
- 特異な定数値: 暗号化アルゴリズムで使用される固有の定数(0x67452301など)周辺の演算コードが良いです。
- 連続したロジック: XOR演算後にCMP(比較)し、JNZ(ジャンプ)する一連の流れを10~20バイト程度抽出します。
4. ⚖️ [実習 3] 検証 (Sanity Check)
さて、「これだ!」と思う文字列を選びましたか?最後にGoogleで検索してみる必要があります。
🔍 Google検索テスト (Google Dorking)
- 選別した文字列を二重引用符(” “)で囲んでGoogleで検索してみてください。
- もしGitHubの有名なオープンソースプロジェクト(例:OpenSSL, Boost Library)が検索されたら?
- 🚨 失格です! それはマルウェアではなく、正常なライブラリを流用したものです。それをルールにすると、世界中のPCを誤検知することになります。
- 検索結果がないか、マルウェア分析レポートのみが出てくる場合は?
- 🎉 合格です! 非常に優れたシグネチャです。
5. 📦 結果の整理: 自分だけの「指紋」リスト
実習を通じて選別されたシグネチャを以下のように整理しておきます。これが次回のYARAルール作成の材料となります。
| 区分 | 値 (Value) | 特徴および選定理由 |
|---|---|---|
| String 1 | “C:ProjectDarkbot.pdb” | 開発者パス。「Dark」というプロジェクト名がユニーク。 |
| String 2 | “Don’t kill my process!” | マルウェア内部のデバッグメッセージ。文章が特異。 |
| Hex 1 | { 33 C0 83 C4 04 B9 04 00 00 00 } | XOR初期化およびループカウンタ設定ロジック。 |
| Hex 2 | { E8 ?? ?? ?? ?? 85 C0 74 0F } | 関数呼び出し後の結果が0か比較する分岐文(アドレスはワイルドカード処理)。 |
—
🎉 終わりに: ルール作成準備完了!
お疲れ様でした! 👏
皆さんは、今や膨大なデータの中から「真の証拠(Signal)」を選別する目を手に入れました。
- テキストでは誤字とPDBを見つけ、
- Hexではコアロジックを見つけてワイルドカードを適用し、
- Google検索を通じて検証まで完了しました。
これらの材料は、どんなアンチウイルスよりも強力な検出性能を発揮するでしょう。
次回は、これらの材料をYARA文法に合わせて組み立てる「[実習] 最終YARAルールファイル(.yar)作成およびマルウェア検出テスト」を行います。
自分だけのアンチウイルスを作るその瞬間まで、ファイト! 🛡️🔍
コメントを残す