概要
- 本記事は Denuvo の最新技術に関する 教育目的 の解説
- 個人メモ やリバースエンジニアとのやり取りを含む
- Denuvoの 仕組み と保護メカニズムを詳細に説明
- 一部 機密情報 は伏せ字処理
- Irdeto社 への悪意は一切なし
Denuvoとは
- Denuvo はデジタル著作権管理( DRM)および アンチタンパー 技術
- 主に ゲーム などのデジタルメディアの 不正コピー防止 や リバースエンジニアリング対策 に利用
- 従来型DRMと異なり、多様な 検証手法 や チェック機構 を搭載
- ゲームコードやユーザーの正当性を 多重確認 する設計
Denuvoの基本的な仕組み
- Denuvoは セミオンライン型DRM として機能
- 初回起動時、 ハードウェアID を収集しサーバーへ送信
- サーバー側で「 盗難定数」とハードウェア情報を 可逆的演算 で混合
- サーバーから返される「 ライセンスファイル」をローカル保存
- 以降はオフラインでも ライセンスファイル を参照し起動可能
- 毎回起動時にハードウェア情報を再収集し、 定数の復号 や整合性チェックを実施
- ハードウェア情報が一致しない場合、 ゲームがクラッシュ する等の不具合発生
技術的詳細
- Denuvo導入時、特定の関数が「 保護対象」として選定
- 保護対象関数は 仮想マシン(VM) 上で実行され、一部命令バイトがバイナリから削除
- 削除された命令バイト群+ハードウェアIDを 可逆演算 で混合し、サーバー保管
- ライセンスファイルは、 削除命令バイト とハードウェアIDの混合体
- 各命令は「 License DWORD」としてVMセクション内に分散保存
- 実行時、VMはハードウェア情報を再収集し、License DWORDを 復号
- 復号値が正しければ元の命令を実行、不一致なら 異常動作
命令削除例
- 例:
mov DWORD PTR [rbp-4], ediの「-4」をバイナリから削除、サーバーで管理 - ライセンスファイルがなければ、 関数が正しく動作しない
- 関数全体を 独自バイトコード 化し、VMでのみ解釈可能
- VM内で、削除命令の 復号ラッパー が動作し、正当性確認
ユーザー正当性チェック
- Denuvoは複数の 整合性検証 ベクトルを実装
- ライセンスファイル要求時、各種チェック結果をサーバー送信
Pre-OEPチェック
- ハードウェア構成変更時(例:Windows Update、CPU交換)にも対応
- OEP(Original Entry Point)直前に 定数復号テスト を実施
- 期待値と異なればローカルライセンスを削除し、再取得を要求
主要なハードウェア情報収集手法
- KUSER_SHARED_DATA :Windowsバージョン、ビルド番号、物理メモリ数など
- CPUID命令 :プロセッサ情報やブランド文字列取得
- SYSCALL命令 :NtQuerySystemInformation呼び出し
- ntdll.dll検査 :特定関数のバイト列やImage Data Directoryを参照
- PEB(Process Environment Block) :OSバージョンやサブシステム情報
- XGETBV命令 :CPUの拡張制御レジスタ情報取得
- GetWindowsDirectoryW :Windowsディレクトリパス取得
- GetVolumeInformationW :ボリューム情報取得
- GetComputerNameW :コンピュータ名取得
- GetUsernameW :実行ユーザー名取得
コード整合性チェック
- CRC(Cyclic Redundancy Check) によるVMハンドラや重要コードの改変検出
- .VMセクション からランダムにバイト列を抽出し、定数生成・検証
- 例:VMハンドラ内で「ランダム」なワードを読み込み、暗号化・復号処理で整合性維持
Denuvoの設計思想と特徴
- 多層的保護 :ハードウェア・ソフトウェア双方からユーザー正当性を検証
- 仮想化 :重要処理をVM化し、逆解析を困難化
- 可逆暗号 :サーバーとクライアント間で定数を安全にやり取り
- 動的検証 :実行時ごとにハードウェア情報を再確認し、不正利用を即座に検知
まとめ
- Denuvoは 最先端のDRM技術 を駆使し、 不正利用防止 を徹底
- 多様な ハードウェア情報収集 と コード整合性検証 を組み合わせた高度な保護構造
- 一部情報は 公開されていない独自技術 を含むため、詳細は割愛
- 本記事は 教育・研究目的 の情報共有