難読化の話(超!?入門編)その2|セキュリティごった煮ブログ

ネットエージェント
セキュリティごった煮ブログ

 コース:こってり

難読化の話(超!?入門編)その2

bubobubo

どーも、bubobuboです。

かい○ゃから何か書けと言われたので、クライアントプログラムのセキュリティの一分野である(とされている)、「プログラムの難読化」をテーマに 片手間 締め切りまでピーピー言いながら作文を行いました。

前回の記事はこちら。

難読化の話(超!?入門編)
https://www.netagent.co.jp/study/blog/hard/20180726.html

雑な考察

前回はプログラムの難読化の基礎とその限界を概観しましたが、根本的な解決方法としては「本当に隠したい重要な処理はクライアントに持たせず、サーバーサイドで処理してしまう」ようにするしかないです。

難読化ソリューションを提供する側は「難読化なしに知的財産は守れない!」といったように主張しています。筆者が難読化技術を知った15年ぐらい前なら全面的に賛同していたと思います(今は違います)。当時の国内でも商業の難読化ソリューションがちらほらありました。しかし、時代が追い付いていなかったこともあり、事業としては継続できたものはごく少数で、しぶとく生き残ったソリューションが、時代の変化によって注目を集めるようになった...という印象があります。

逆の言い方をすると、時代が追い付いて常時オンラインが前提になったのだから、隠したい処理をサーバーに預けるのが真の難読化であり、それを実現しているゲーム画面をストリーミング配信するクラウドゲームに至っては難読化すら不要で、チート行為も原理上不可能です。より確実に知的財産を守る方法はもう別な所にあるわけです。しかしながら、サーバーを維持し続けるコストが看過できないという現実論が根強い手前、クライアント側だけで頑張らなければならない、そのためには難読化が必要だというのであればやむを得ないとも思うのです。

Unityについて

.NET Frameworkの互換フレームワークであるMonoを採用しているゲームエンジンである「Unity」をリリースしているユニティ・テクノロジーズは、難読化ツールについてどうコメントしているのでしょうか。2017年11月に更新された、Unityのドキュメントを見てみましょう。

Do you have advice on how to obfuscate C# code?
https://support.unity3d.com/hc/en-us/articles/205838999-Do-you-have-advice-on-how-to-obfuscate-C-code-
筆者意訳(参考程度でヨロシク):

C#のコードを難読化する方法についてアドバイスはありますか?

症状:
C#のコードを暗号化して、潜在的なハッカーから守りたいと考えています。

原因:
あなたはプライバシーやセキュリティ向上の目的でC#のコードを難読化したいと考えており、Unityでこれを行うツールを探している。

解答:
Unityはセキュリティソリューションとしての難読化を推奨しません。これはランタイムエラーが発生し、パフォーマンスに影響を与える可能性があるためです。また、ソフトウェアにアクセスするユーザーがデコンパイルを試みることを防ぐこともできません。マルチプレイヤーゲームに関する懸念がある場合は、接続しているクライアントから受信したデータを信頼しないで、常に有効なデータであるか確認してください。

ソースコードを難読化したい場合は、以下に挙げるものは変更しないでください。

  • クラス名
  • Unityコールバック名
  • Unityのpublicなフィールド名
  • SendMessage関数を経由する文字列/リフレクション、Invoke、StartCoroutine、RPC(リモートプロシージャコール)、および同等の関数を呼び出す全てのメソッド

アセットストアでサードパーティの難読化ツールを使用することができます。

確かにその通りだろうと思うところはあれど、解答の冒頭で「Unityはセキュリティソリューションとしての難読化を推奨しません」としている一方で、末尾に「アセットストアでサードパーティの難読化ツールを使用することができます」とある。これは「サードが勝手に難読化するぶんには関知しないが、動作保証もしない」という意味なのだろうか? あるいは「Unityとして難読化を推奨すると、クラックされた時に批判の矛先が向いてしまうから難読化を推奨しない」という姿勢なのか? などなど。

決して粗探しがしたい訳ではないのです。Unityで何も考えずに作られたゲームはデコンパイルが容易で、まるでソースコードを持っているかのようにプログラムの構造を把握することができるのは事実です。少し改造したいのであればIL(中間言語)のニーモニックの知識がすこーしだけ必要です。C#コード以外のアセット(画像や音楽などのデータ)を取り出すツールもたくさんあります。

ゲーム会社のエンジニアと話をすると、たびたび出てくるのが「クライアントセキュリティについて詳しそうという理由で、チート対策の施策やクラック対策ツール(難読化ツール)の選定を任されたが、何が最適なのか確信を持てない」といった悩みや相談です。

正直、筆者も「これぞ正解」と言える答えを持っていません。

クラック対策ツールの話

難読化技術と隣接している技術要素に、DRM(デジタル諸制限管理)があります。今どきのパッケージソフトやダウンロードタイトルには、デジタルコンテンツの利用や複製を制限するDRMが入っており、正規のライセンスを持っていなかったり、持っていたとしても複数人・複数台で使い回していると動作しないようになっています。現在では常時接続環境であることが前提のDRMがほとんどです。

不正コピーをばら撒きたい輩は、DRMがかかったままのコピーをばら撒いても意味が無いので、まずはDRMを無効化するべくクライアントプログラムの改ざんを行います。商業ゲームを提供する側としては、それは何としてでも避けたいことなので、改ざんの難易度を上げる(防ぐことはできない)クラック対策ツールを導入することで、DRMが無効化されないように努めています。改ざんの難易度を上げることができるので、オンラインゲームのクライアントプログラムの改造によるチート行為を遅らせる目的で使われることもあります。

本稿では雑に「クラック対策ツール」とひとくくりにしていますが「DRMだけ」「クライアントの改ざん防止だけ」「両方の合わせ技」など様々な販売形態やプロテクトのかけ方がありますが、本稿では割愛します。正直なところ「クラック対策ツール」に対して、最も期待されているものは 「株主やステークホルダーからの弾除け」発売日から何日持つか」これに尽きると思います。初動率の高いタイトル、つまり発売初週(もっと言えば発売日)が売り上げのピークとなるタイトル(例えば固定ファン向けだったり、人気シリーズの続編)に限れば、超暴論ですが発売日から7日持てばクラック対策ツールが事実上の勝利となるわけです。しかし、実際にネット上で報じられる「クラック対策突破」は(ウン十年前から続いていることですが)非常に残酷なものばかりです(実際にはクラッカーに目を付けられずに持ったタイトルもあると思うのですが...)。

『RiME』に搭載のコピーガード「Denuvo」がわずか5日で突破される、販売元の宣言どおり解除へ
https://automaton-media.com/articles/newsjp/20170603-47920/

しかしながら「発売日から×日持つか」の予測を立てようにも、不確定要素が多すぎて(少なくとも筆者には)予測不可能なわけです。思いつく要素を書いてみます。

  • クラック対策ツール自体の出来の問題
  • クラック対策ツールに歴史がある場合(過去のクラックノウハウが流用できる可能性が高い)
  • ゲームの知名度の問題(大型タイトルほど注目度が高くなるので、いち早くクラックして名を上げようとする猛者も現れやすい)
  • インセンティブの問題(RMT市場があるなど、クラックの成果をマネタイズできるタイトルほど注目度が高くなる)
  • 良くも悪くも思い入れのあるクラッカーに粘着されている(ニッチ向けタイトルが継続してクラックされている場合)
  • 発売日前に流出させるフラゲ勢/内部犯行者の有無(最悪発売日前にクラック完了となる)
  • などなど...

こうやって並べてみると、クラック対策ツールの出来の問題とは無関係な要素が多すぎやしないでしょうか。やはり目立つタイトルが優先的に狙われやすい、と思う訳です。

CrackWatch.com

CrackWatch」という、DRMやクラック対策ツールが導入されているゲームの「クラック可否」を一覧できるウェブサイトがあります。

トップページには "Reminder: Crackwatch only tracks crack status and offers no download, torrent, or such." とあり、クラック可否の情報だけで、不正コピーのリンクは掲載していないことが強調されています。一見した限りでは、国産ながら海外販売されていないタイトルや、国産のクラック対策ツールはリストにないようです。 興味すら持たれないというのはある種最強のプロテクトだと思いますが...。

Crack Status of All Games | CrackWatch
ttps://crackwatch.com/

CrackWatchから、同じ名前の「クラック対策ツール」を導入しているタイトルの一覧を見ると、速攻でクラックされている多数のゲームと、いつまでたってもクラックされないごく少数のゲームが見受けられます。「実はクラック済みだがステータスが更新されていないだけ」かもしれませんが、考え出すとキリがないので一旦横に置きます。「クラック対策ツール」は常にアップデートを重ねているはずですが、技術的には一から作り直すような非常にコストのかかることは行わないはずです。そう考えると、(バージョンには差異があるかもしれないが)同じ名前の「クラック対策ツール」を導入しているはずなのに、「クラックされないゲーム」は他とはいったい何が違うのかという疑問が浮かぶはずです。ここからは、統計を取ったわけでなく、各タイトルごとにクラックシーンを精査したわけでもなく、単にクラック可否の一覧を見ながら想像で言うレベルですが「クラッカーの食指が動かなそうなタイトルはクラックされにくそう」「2017年度版、2018年度版のように改訂版が毎年出るスポーツゲームはクラックされていなさそう」「AAA級の超有名タイトルは概ねクラックされているが、そうでないタイトルも少量ある」という印象を持ちました。全く参考にならないですね。すみません。

クラック対策ツールを導入するリスク

コピーガードの例を挙げるまでもなくクラック対策の歴史は非常に長いですが、クライアントプログラムのデバッグを難しくする方法として「処理を断片的に暗号化して、呼び出される都度復号してから実行して、終了後に再度暗号化する」方法や、「プログラムを独自設計の仮想マシンで動く疑似命令に変換して、実行したい時はその仮想マシン上で実行する」方法があります。前者は処理が復号される瞬間を狙わないとデバッグできないので面倒になります。後者は独自設計の仮想マシンのアーキテクチャの解明から必要なので、少なくともデバッガによる一義的なトレースはできなくなります。今は2つの例を挙げましたが、どちらも大きな代償としてゲームの動作に影響を与えるほどの負荷になることがあります。

クラック対策ツールの問題点は、クラック対策ツールの不便さとコストを正規ユーザーにも押し付けてしまうことです。これもまたウン十年前から続いている問題で、挙げると本当にキリがないのですが、2008年に発売されたPC向けゲーム『Spore』は、シムシリーズで著名なウィル・ライトが手掛けるゲームデザインは評価された一方で、煩雑なアクティベーションが正規ユーザーからの怒りを買い、その一点突破でAmazon.comの評価欄は★1つが2574件(全体の76%)にまで達しました。

EAのPC向け新作ゲーム、厳しいコピーガードが問題に
https://srad.jp/story/08/09/10/0612220/

Spore - PC/Mac by Electronic Arts
https://www.amazon.com/Spore-PC-Mac/dp/B000FKBCX4

近年では、前述した「独自設計の仮想マシン上での動作」がクラック対策として有用と判断されているようで、確かに解析が面倒くさくなるものの明らかに高負荷になることから、ただでさえハイスペックを要求するPC向けゲームに対して、そのスペックを削るような特定のクラック対策ツールが入っていると、それだけでユーザーから厳しい評価を下されるという流れが繰り返されています。

『RiME』に搭載のコピーガード「Denuvo」がわずか5日で突破される、販売元の宣言どおり解除へ
https://automaton-media.com/articles/newsjp/20170603-47920/

特筆すべきは、実際にクラックを担当したと思われる"BALDMAN"という人物が、「Denuvo」がパフォーマンスに及ぼす影響について言及している点だ。海賊版のリリース情報にて、次のようにコメントしている。「ゲーム自体は最高に良作だから、できれば実際に購入して開発者をサポートして欲しい。しかし、Denuvoなんて"そびえ立つクソ"を入れたのがいただけない。醜い怪物がRiMEををめちゃくちゃに荒らしている。ゲームを起動したりセーブデータをロードしたりする度に、内部で30万回もトリガー(プログラム内で特定の動作を起こさせる入力のこと)が呼び出されているんだから」。

『ソニックマニア』Steam版配信開始。高い前評判から一転、コピーガード「Denuvo」の導入により批判を浴びる
https://automaton-media.com/articles/newsjp/20170830-53502/

(引用者註:PlayStation 4やXbox One、ニンテンドースイッチ版の後にリリースされた)Steam版も同様に高評価レビューばかりが並ぶと思いきや、ストアでは約1100件の高評価に対し約400件の不評がつけられている。主な原因はコピーガード「Denuvo」の存在にあるようだ。

(引用者註:SteamストアにDRMの表記がなかったことについて説明する)この公式声明については、700以上サムズアップと、800件以上の「Denuvo」をめぐる意見が寄せられている。

※現在のストア評価を確認したところ、全てのレビュー(6907件)中88%が高評価をつけている

まとめになっていないまとめ

すでに冒頭の「難読化」の話からかなり脱線してしまいましたが、一応地続きの技術ということでお許しください。

今回のエントリはここまで。

メルマガ読者募集 採用情報 2020年卒向けインターンシップ

月別