Themida の静的バチャライズ化解除

2026/06/03 5:27

Themida の静的バチャライズ化解除

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

この記事は、CodeVirtualizer や Themida といった VM ベースのオビフスキエータで保護されたコードに対する堅牢な記号評価法について詳述し、その適用範囲を VMProtect、OREANS Themida、VXLang など他のツールのものまで拡大しています。脆弱なベンダー固有のトリックやパターンマッチングに依存した以前の手法とは異なり、このアプローチは VM 固有の知識を最小限に抑えることで、バージョンを超えた広範な互換性を確保します。核心的な技術は、ネイティブ命令をカスタム中間表現(IR)へと「リフト」することであり、この IR は AMD64 および ARM64 の両アーキテクチャをサポートしています。ほとんどのレジスターとフラグを記号的に扱いながらスタックポインタ(RSP)を早期に具体化することで、複雑な仮想マシンロジックをネイティブ操作へと最適化します。このプロセスは定数フォールディングを利用して VM の足場(デコード算術やディスパッチロジックなど)を圧縮し、分岐フォールディングを通じて未知の制御フロー経路を解決し、不要な複雑性を防ぐためにデッド依存関係を排除します。最終的にシステムはこの最適化された IR をネイティブコードへと「ローラー」し、レジスタスプレイを引き起こさずにバイナリにクリーンに再挿入します。結果として、この画期的な成果は業界標準の VM 保護を損ない、分析者がオビフスキエーションを効果的に回避することを可能にし、ソフトウェアセキュリティがリバースエンジニアリングへのアプローチ方を根本から変えます。

本文

Themida への脱仮想化(デバーチャル化)技術解説

はじめに

このガイドでは、CodeVirtualizer (Themida) によって保護されたコードの脱仮想化を実証する手法を説明します。紹介される技術はほぼすべての VM ベースのオブフスキエーションに対応しており、わずかな修正で他のプロテクター(VMP, VXLang など)にも応用可能です。

推奨予備知識

関連するバイナリ脱隠蔽(デオブフスキエーション)研究資料を事前に読み込んでください:

対象プロテクター

この技術で削減可能な主な保護器:

  • Themida (VMPSoft, Oleans など)
  • VXLang
  • EagleVM
  • COVIRT
  • BinProtect
    • (注:網羅ではありません)

Themida のアーキテクチャ分析

Themida の仮想マシン(VM)アーキテクチャは、VMProtect と異なり、主にネステッドバチュアリゼーション(重層的な仮想化)に対応しています。

  • 構造の違い: VMProtect はネイティブスタック上に VM を置くのに対し、Themida はバイナリ内部にVM 文脈仮想スタックを持ちます。
  • 重要コンポーネント: 脱仮想化において特に注意すべき点は以下の 2 点です。
    • 仮想分岐
    • VMEXIT の振る舞い (詳細なアーキテクチャ解説は他の研究成果を参照してください)

賢者への警告

パターンマッチングアプローチの限界

VM ハンドラを x86 インストラクションへパターンマッチングさせる手法は推奨しません。

  • 脆弱性: プロテクターベンダーがハンドラ配置やディスパッチロジックを微細に変えるだけでツールチェーン全体が無効化されます。
  • 本ガイドのアプローチ: 意図的にVM 固有の知識を最小限に抑え、広範なバージョンに対応する汎用性を確保しています。

必要な VM 知識の範囲

脱仮想化の大部分は一般的な最適化パスで行えますが、制御フロー(仮想分岐・仮想呼び出し)処理には VM 固有の理解が必要です。


ガイダンス付き記号的評価 (Guided Symbolic Evaluation)

基本コンセプト

  1. リフティング: ネイティブインストラクションを可塑性のある中間表現 (IR) に昇格します。
  2. 最適化による解明: 未知のブランチ先が最適化によって具体化(具象化)されるにつれ、制御フローを実体化します。
  3. リフティングツールの例:
    • BLARE2 (Back Engineering Labs): AMD64/ARM64 サポート、カスタム SSA IR、最適化器、リンカ付き。バイナリへの clean な再挿入が可能です。
    • Triton / Remill: クリーンで最適化された IR を生成する能力はありますが、バックエンド(ネイティブコード出力・再挿入)での調整が必要です。

リフティングの開始点

  • すべてのレジスタとフラグは記号的な状態から始められます。
  • IR が進化する停止条件: 次のインストラクションポインタが決まるまで(制御フローによって次の動作が確定するまで)リフティングは続行します。
    • ret
      命令: RSP への最後のストアが次の IP となる。
    • 具象化できない場合:最適化未完了、または仮想 JCC(複数の実行経路)が存在する場合。

具体的な実装パス

1. スタックポインタの具体化 (Concretizing Stack Pointer)

リフティング開始時、スタックポインタ (RSP) は具体的な初期値を与えます。

  • 理由: RSP を具体的に保持することで、既存のロード/ストア伝播機械がスタックアクセスを自動処理し、算術に対して定数畳み込みを特殊なケース分けなしに実行できます。
  • 代償: 動的スタック割り当て (
    alloca
    など) はサポートされません(スタックディスプロールメントが静的でなくなるため)。ただし、仮想化関数では稀であるため問題にはなりません。

2. 最適化パス一覧

これらのパスは相互依存して固定点に収束します。各パスの出力は次へフィードバックされ、VM の足場を崩壊させます。

[定数昇格とメモリモデリング] (Constant Promotion & Memory Modeling)

  • プロセス: メモリからロードされたデータ(例:バイナリティバイトコード)を定数へと昇格します。
    • 荷上げ後、周辺の暗号算術への定数畳み込みが可能になります。
    • ハンドラアドレスやテーブルインデックスも具象化され、具象的なハンドラアドレスのみが残ります。
  • ストア伝播:
    0x5000
    へのストアが発生すれば、以降のロードはその SSA 値をフォワードします。
  • ポリシー: ロードが「VM の足場」ではなく「元のプログラム」として解釈されるリスク(過剰な昇格)を防ぐ範囲制限が必要です。

[定数の畳み込み] (Constant Folding)

  • 式のすべてのオペランドが既知の定数であれば、結果で置き換えます(例:
    10 + 10
    20
    )。
  • 重要性: このパスは収束まで実行される必要があります。
    • バイトコードデコード算術が消滅
    • ハンドラテーブルインデックスが具象化
    • ディスパッチロジックが消失
    • これらが互いに連鎖し、VM 構造が崩壊します。

[デッドストアの除去] (Dead Store Elimination)

  • 安全性: VM プライベートメモリ(文脈・仮想スタック)に限定されたストアのみ対象にします。これらは元のプログラムからは観測されないため、証明可能に「デッド」です。
  • 効果:
    • スキップすると、VM インタープリタの状態シャッフルが IR 内のダングリング表現として残り、ノイズになります。
    • 除去により、実際に関数のように見える IR が生成されます。

[命令の結合] (Instruction Combination)

  • 目的: 代数的同値性を認識し、IR を最小限に減らします。
  • 効果: VM ハンドラに見られるノイズ(自己相殺算術、冗長なマスキング)を剥ぎ取ります。複雑な式は単なる定数へ減少します。

[ブランチの畳み込み] (Branch Folding)

  • 最適化によりフラグ計算が定数化された場合、不透明なブランチターゲットは完全に除去できます(静的に知られた目的地へ分岐)。

3. VMEXIT の振る舞い (VMEXIT Behavior)

リフティング開始時の RSP が具体化されているため、以下のパターンを識別します。

  • VMEXIT-CALL の検出:
    • リフターが
      initRSP - 0x10
      の RSP で
      ret
      を遭遇 → VMEXIT-CALL と判定。
    • 呼び出し先目標は RSP に、戻りアドレスは
      RSP + 0x8
      に配置されます。
  • 呼出先の扱い:
    • コール型出口の場合:呼び出し先は記号的である可能性あり → 明示的に扱う必要があります。
    • CET 準拠ではない点に留意(スタック上の戻りアドレスが
      vmenter
      スタブで置かれていないため)。
  • 出口分類:
    • 元の関数へのリターン、サポート外指令退出、コール型出口は異なる RSP ディスプロールメント値を持つため、制御フローマッチロジックで分類します。

4. 仮想化された制御フロー (Virtualized Control Flow)

すべての仮想インストラクションポインタ (VIP) を記録・追跡する必要があります。

  • 理由: バックエッジ(ループ検出)発見時、無限にアンロールさせるのではなくループとして認識するため。
  • VMP vs Themida の違い:
    • VMP: ビイトコードアドレスから直ちに次のハンドラアドレスをエンコード。
    • Themida: 単純なヒューリスティクスは使えません。
      • 条件分岐ハンドラ (
        VJCC
        ) では、結果が
        branch_taken_flag
        に書き込まれます。
      • VIP はハンドラ終了後の条件付 VPC 更新ロジックを通じて追跡する必要があります。

5. デッド依存関係解析パス (Dead Dependency Analysis Pass)

  • 目的: 仮想化領域から「実際に出る」レジスタとフラグを特定します。
  • 手法: VM EXIT 直後のネイティブコードで変更(クラッブ)されるレジスタ集合を収集し、それ以外をデッドとして除外します。
  • 効果: 記号的表現が IR 内でダングリングすることなくアンカーを持ちます(例:ZF フラグの式木が不要になる)。

6. スタックポインタ書き換えパス (Stack Pointer Rewrite Pass)

  • 目的: シンプル化された IR の定数スタックアドレスアクセスを、RSP 相対形式へ書き直します。
  • 注意点: スタック参照は負でなければならない(Red Zone への到達を示す場合を除く)。

IR の低次元化 (Lowering IR)

クリーンな IR を得られた段階で、元の ISA(機械語)へ低次元化します。

  • 処理内容: 指令選択、レジスタ割り当て、アセンブリ、バイナリへの連結。
  • 制約: レジスタプレッシャー
    • スパイルが発生すると、復元されたコードに独自のスタックフレームができ、IDA や Binary Ninja で誤読されるリスクがあります。
    • 目標: 元のコードに近い実行可能出力で、スパイルなし・余計なアティファクトなし。
  • LLVM 製への懸念: LLVM IR は読みやすいですが、バイナリへの clean な再挿入(振る舞いの整合性)までは容易ではなく、各段階で戦わなければなりません。

結果

デモ比較

(画像の代わりに解説)

  • : 仮想化前の元の関数 (IDA)
  • : 脱仮想化後の同じ関数

特性確認

  1. 機能的同等性: 元のものともう 1:1 です。
  2. コード品質: バックエンドによる指令選択の違いはあるものの、スパイルは発生せず、元のコードに近い緊密でクリーンな出力です。
  3. 実行可能性: 回復された関数はネイティブコードとして実行でき、逆アセンブラで cleanly な読み込みが可能です。

リソース

検証や比較のために以下のリポジトリがあります:


記号的評価の防止 (Preventing Symbolic Evaluation)

オブフスキエーターが脱仮想化を阻む主な手法:

  1. 間接ジャンプ先の本質具象化阻止:
    • ブランチ先が定数畳み込みで還元されないように、不透明な値を持つ MBA(マルチバイトアレー?文脈に依存)表現としてエンコードします。
  2. 強力な防御:
    • これらの手法は単なる「隠蔽」を超えており、記号的評価を一般的に不可能にするレベルです。
    • CodeDefender
      などの製品が重い保護ティアで実装しています(詳細はこのガイドの範囲外)。

同じ日のほかのニュース

一覧に戻る →

2026/06/07 4:17

Ntsc-rs ~アナログテレビおよびVHS のアーティファクトを模倣するオープンソースのビデオエミュレーター~

## 日本語翻訳: ntsc-rs は、単純なカラーフィルターではなく、実際の送信符号化の原理に基づいた高度なアルゴリズムを使用して、ヴィンテージ NTSC テレビと VHS テープのアートファクトを本物らしく再現する無料のオープンソースツールです。マルチスレッドおよび SIMD 加速を実現した Rust で構築されており、超標準解像度でもリアルタイムで動画を処理し、ntscQT といった旧来のツールよりも優れたパフォーマンスを発揮します。そのアルゴリズムは composite-video-simulator、zhuker/ntsc、および ntscQT で開発されたものを採用しています。独立したアプリケーション、ウェブプラットフォーム、または Adobe After Effects、Premiere Pro、DaVinci Resolve、Hitfilm、Vegas(すべての OpenFX ソフトウェアと互換性あり)用のプラグインとして利用可能であり、歴史的正确性と現代の効率性を兼ね備えており、クリエイターがリアルなアナログの美学を現代的なワークフローに直接統合できるよう支援します。

2026/06/07 3:35

Meta、AI チャットボットの悪用によるInstagramアカウントの乗っ取りが数千件あったと確認

## Japanese Translation: Metaは、ハッカーがAIチャットボットのバグを悪用し、Instagramのアカウント20,000個以上を乗っ取ったという重大なセキュリティ不備を公表しました。このシステムは、パスワードリセット用として設計されたものの、誤って認証コードを受け取るメールアドレスを登録済みのアカウント所有者に限定せず、任意のメールアドレスに入力した者に送信してしまっていました。これにより、無許可ユーザーが数日以内にして完全なアクセス権を引き渡すことができました。脆弱性は二段階認証を行っていないアカウントを狙い、4月中旬から最近まで活性していました。 この侵害事件は、人工知能(AI)に対する大幅な投資が行われている時期に発生しており、人員削減を踏まえ、イノベーションとセキュリティのバランスに関する懸念が浮上しています。Metaはこの乗っ取られたボットを停止し、コードを修正済みですが、同社は直接メッセージやプロフィール情報など機密データの暴露があったことを認めています。メイン州在住の30人が直接通知を受けたものの、同社は犯罪者がアクセスした個人データ総量について現在把握していないと確認しています。専門家は、この事件がAIの急速な展開に伴う重大なリスクを浮き彫りにしているとし、ユーザーに対して即時にパスワードのリセットと、認証済みチャネル経由での再認証を行ってアカウントのセキュリティを回復するよう求めており、またMetaは同様の再発を防ぐため、現在自社プラットフォーム上の他のチャットボットの調査を進めています。

2026/06/06 23:59

Zeroserve:eBPF を用いてスクリプト可能なゼロ設定 Web サーバー

## 日本語訳: ゼロサーブ(Zeroserve)は、最小限のセットアップで静的ファイルを配信できる軽量かつ高性能な HTTPS サーバーです。各サイトごとに単一のタールアーカイブのみを用いて動作を開始できます。改行・認証・レート制限・リバースプロキシなどの機能を実装するサンドボックス化されたミドルウェアとしてユーザー空間で動作する eBPF プログラムをサポートしています。パフォーマンスの主な特徴は、io_uring I/O インターフェースと即時コンパイル(Just-In-Time コンパイル)された eBPF スクリプトによる卓越したシングルスレッド速度です。Ryzen 7 3700X ベンチマークでは、小規模ファイルにおいて nginx を約 17% 上回り、Caddy よりも大幅に高性能であることが示されました。そのアーキテクチャはバイナリコードを共有する複数プロセスの並列実行によりスケールし、各インスタンスはシングルスレッドモデルの monoio ランタイムを使用します。BoringSSL を用いた高度な TLS 機能もサポートしており、TLS 1.3、暗号化された ClientHello(ECH)、SNI サーティフィケート選択、JA4 フィンガープリント、および ECH リレーモードを含みます。運用上の利点として、原子スワップ(SIGHUP)によるホットリロードやダウンタイムなしの瞬時の構成更新が可能です。eBPF プログラミングモデルは、ヘッダー操作やテンプレート置換を行うために共有されるパーリクエストメタデータマップを持つ、ファイル名順ソートされたスクリプトチェーンを使用します。ヘルパー関数はリクエスト検査・変異、暗号処理(SHA-256、HMAC、base64)、JSON 処理、トークンバケット方式のレート制限、AWS SigV4、および XChaCha20-Poly1305 クッキーを用いた OIDC ログインをカバーします。デフォルト設定では eBPF インスタンスあたりのメモリ使用量の上限が 256 KB で、他の接続を止めることを防ぐためにプリエンプト間隔は 2 ms に設定されています。この間隔を増やすことで動的レスポンスのスループットをさらに向上させることが可能です。リバースプロキシとしての性能では、プーリングされた io_uring コネクションを用いて小規模応答において最先端の速度を発揮し、大規模ボディにおいては nginx と競合するレベルのパフォーマンスを示します。全体として、このサーバーは Lua や Perl などの遅いインタプリターに依存せず、ユーザー空間内で直接低レイテンシーとより細かいセキュリティ制御を提供します。

Themida の静的バチャライズ化解除 | そっか~ニュース