文字列と16進数によるハンティング
マルウェアの痕跡を照合します。
「文字列と16進数によるハンティング」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
サンプルからルールへ
ハンティングはサンプルから始まります。特徴的なアーティファクトを抽出し、どれが変更されにくいかを判断して、無害なファイルを検知しないルールに落とし込みます。
ワークフローは、サンプルをトリアージし、文字列と構造的な特徴を抽出し、シグナルとノイズを分け、ルールの草案を作成し、デプロイ前にファミリーとクリーンなコーパスの両方でテストするという流れです。
候補文字列の抽出
まずstringsユーティリティで印字可能な文字列を一覧表示し、ASCIIとUTF-16(wide)の両方のテキストを取得します。Windowsマルウェアでは、文字列がwide形式で保存されていることがよくあります。
出力から、C2 URL、ミューテックス名、レジストリパス、独自のエラーメッセージ、PDBパス、極端に具体的なテキストを探します。一般的なランタイムやコンパイラーの文字列は無視してください。
strings -a sample.bin > ascii.txt
strings -e l sample.bin > wide.txt # UTF-16LE
grep -iE 'http|mutex|\\\\pipe\\\\|\.pdb' ascii.txt wide.txt変更されにくい文字列の選択
すべての文字列をルールに含める必要はありません。作成者が変更するには手間がかかるアーティファクトを優先してください。
- ファミリー固有のハードコードされたミューテックス名やパイプ名
- 独自のプロトコルマーカーや設定キー
- 珍しいデバッグメッセージやパニックメッセージ
- ビルド環境を明らかにする埋め込みPDBパス
正規のソフトウェアでも共有されているライブラリの定型文字列、一般的なAPI名、バージョン文字列は、誤検知を引き起こすため避けてください。
strings:
$mutex = "Global\\Zx7yQ_lock" wide
$cfgkey = "x0r_cfg_begin" ascii
$pdb = "C:\\build\\loader\\release\\loader.pdb"単純な難読化への対処
多くのファミリーは、文字列をXORなどで軽くエンコードします。平文の文字列が少ない場合は、エンコードされた形式やデコーダールーチンを探してください。
既知の平文をXORエンコードしたバイト列を計算してそれにマッチさせることも、YARAのxor修飾子を使って、任意の1バイトXORキーでエンコードされた文字列に自動的にマッチさせることもできます。
strings:
// matches "http://" under any single-byte XOR key
$u = "http://" xor
// or a fixed key range
$k = "config" xor(0x01-0xff)16進パターンによるハンティング
文字列が難読化されていてもコードが難読化されていない場合は、マルウェア自身のロジックに由来するバイトパターンを使います。例えば、復号スタブ、アンパックループ、特徴的な定数などです。
サンプルを逆アセンブルして特徴的な命令シーケンスを見つけ、オペコードを16進文字列に変換します。再コンパイル後もパターンが機能するように、変化するバイト(アドレスや即値)にはワイルドカードを使用してください。
strings:
// XOR decrypt loop with wildcarded counter/address
$decrypt = { 8A ?? 34 ?? 88 ?? 4? 4? 75 ?? }ワイルドカードとジャンプの実践
16進数によるハンティングでは、何をワイルドカードにするかが重要です。厳密すぎると再コンパイルでルールが機能しなくなり、緩すぎると何にでもマッチしてしまいます。
- コンパイラーが変更する相対オフセットと即値にはワイルドカードを使用します
- アルゴリズムは安定しているため、オペコードは固定します
- 命令の長さが変化する箇所ではジャンプ
[n-m]を使用します
一意性を保てるよう十分に長いパターン(多くの場合、意味のあるバイト8個以上)を目指しつつ、必要な箇所では柔軟性を持たせてください。
strings:
$stub = { 55 8B EC 83 EC [1-4] E8 ?? ?? ?? ?? 33 C0 }構造的な指標とPE指標
生バイト以外の静的な特徴は、強力でノイズの少ない条件になります。peモジュールを使うと、次のような条件を指定できます。
- imphash — インポートテーブルのハッシュで、ファミリーのビルド間でも安定していることがよくあります
- セクション名 — 独自のパッカーは特徴的なセクションを追加します
- 特定のインポート — VirtualAllocEx + WriteProcessMemory + CreateRemoteThreadは、インジェクションを示します
import "pe"
condition:
pe.imphash() == "4e3a9f..." or
for any s in pe.sections : ( s.name == ".x0rsec" )シグナルとしてのエントロピー
パックまたは暗号化された領域は高いエントロピーを持ちます。mathモジュールでこれを測定できるため、ペイロードセクションが暗号化されているように見えるサンプルを検出できます。これはパッカーの典型的な特徴です。
ただし、エントロピーだけではノイズが多くなります(圧縮されたインストーラーも高いエントロピーを持ちます)。そのため、単独でアラートを出すのではなく、他の指標と組み合わせてください。
import "math"
condition:
math.entropy(0, filesize) >= 7.2 and $loader_stub指標の組み合わせ
最も強力なルールでは、複数の独立した指標を必須にするため、単一の偶然の一致だけでマッチすることはありません。文字列、コードパターン、構造的な特徴を組み合わせてください。
この多層的な条件により、すべての要素が一致する必要があるため誤検知に強くなり、作成者が複数の特徴を同時に変更しなければならないため回避にも強くなります。
condition:
uint16(0) == 0x5A4D and
filesize < 800KB and
$mutex and
$decrypt and
pe.imports("kernel32.dll", "CreateRemoteThread")命名、メタデータ、バージョン管理
ハンティングルールは、他の人が信頼して保守できて初めて役に立ちます。各ルールに明確な名前空間付きの名前を付け、metaを完全に記述してください。
- ルールの作成元となったサンプルのハッシュを記録します
- ファミリー、作成者、日付、参照情報を記載します
- ロジックを改善したらバージョンフィールドを更新します
数か月後にルールが発火したとき、このメタデータによって対応者はその意味と信頼度を把握できます。これにより、一度きりのハンティングが、長期的に利用でき共有可能な検知へと変わります。
meta:
family = "X0rLoader"
author = "ir-team"
date = "2026-06-04"
hash = "9f1c...e2"
version = "2"信頼する前にテスト
新しいルールは、必ず2つのコーパスに対して検証してください。
- 真陽性 — ファミリーの既知のサンプルがすべてマッチする必要があります
- 良性ファイル — 大規模なクリーンセット(システムバイナリや一般的なアプリ)がマッチしてはいけません
Windows DLLで1件誤検知するだけでも、環境全体の重要なファイルが隔離される可能性があります。実行して件数を集計し、見逃しと検出結果を確認してから、広くデプロイする前に改善してください。
yara -r family.yar /malware_corpus/ # expect all to hit
yara -r family.yar /clean_corpus/ # expect zero hitsクイックチェック
最も回避されにくい指標を選びましょう。
まとめ
YARAによる実践的なハンティングを最初から最後まで確認します。
- ASCIIとwide文字列を抽出し、変更されにくいアーティファクト(ミューテックス、設定キー、PDBパス)を残します
- xor修飾子またはエンコードされたパターンで軽い難読化に対処します
- 文字列が隠されている場合はコードのバイトパターン(復号・アンパックスタブ)にマッチさせます
- 変化しやすいバイトにはワイルドカードを使い、オペコードは固定し、長さが変化する箇所にはジャンプを使用します
- PEのimphash、セクション、インポートとエントロピーを構造的なシグナルとして使用します
- 複数の指標を組み合わせて誤検知と回避に強くします
- デプロイ前に、必ずファミリーと良性ファイルのコーパスに対してテストします
次は、これらのルールを環境全体で実行します。
よくある質問
「文字列と16進数によるハンティング」レッスンは無料ですか?
はい。「文字列と16進数によるハンティング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「文字列と16進数によるハンティング」で何を学びますか?
マルウェアの痕跡を照合します。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「文字列と16進数によるハンティング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- YARAの用途
- YARAルールの構文
- 文字列と16進数によるハンティング
- スキャンのスケールと自動化