セキュリティやIT技術に関する情報を発信していくアカウントです。【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。デジタルペンテスト部提供サービス:ペネトレーションテスト2023-08-23コピープロテクトの作り方(基礎編)bubobuboどーも、デジタルペンテスト部のbubobuboです。はじめにスケジュールの都合上、夏季休暇を挟んでこのエントリを書かざるを得なかったため、(筆者にとっては)手頃なネタを書き記そうと思います。ゲーム会社におけるセキュリティ上の敵といえば「昔コピー(今も続いていますが)、今チート」だと思います。筆者は趣味でコピープロテクトに足を踏み外したことを切っ掛けに、関連があるとも言えなくもない情報セキュリティの道に合流しましたが、プロテクトを外すほうと掛けるほうの両方を商業で実施していました。いえ、集中して行っていた期間からはだいぶ年月が経ってしまったので(お前一体年いくつなんだよと言われそうですが)、この場を借りて記憶を整理したいと思います。昔のコピープロテクトコピープロテクトというと、ソフトウェアのコピーがされやすいプラットフォーム、つまりパソコンが主戦場であって、今も昔も様々なコピープロテクトが考案されましたが、その全てが敗北を喫しているわけであります。パソコンのコピープロテクトは非常に多種に及ぶので、ここで言及することはできません。身も蓋もありませんが、Wikipediaのコピーガードの項目を眺めながら知識を深めるのが良いと思います。家庭用ゲーム機のゲームソフトについては、ニンテンドーDS時代のマジコンに対するコピープロテクトで一気に有名になりましたが、それ以前においてもコピープロテクトは存在しています。「マジコン」の語源となったスーパーファミコン用のマジコン「スーパーマジコン」(p305)※画像は拙著『オンラインゲームセキュリティ』(データハウス)からの引用です(以下同じ、カッコ内は掲載ページ)。印象深かった家庭用ゲーム機のコピープロテクトブログの1エントリに収まるように、言及する範囲を狭めてみることにします。ここでは家庭用ゲーム機におけるコピープロテクトでしょうか。この手の情報は、ゲーム会社から情報提供を受けているゲーム雑誌には一切載らないので、本来ならば知る人ぞ知る代物でした。いえ、インターネットが普及しているどころか、不正利用を教唆するムック本が堂々とコンビニで売られていたニンテンドーDS時代には(当時違法ではなかった)カートリッジの形状をしたマジコンが猛威を奮ったため、それに対抗すべく作られた「船が港に着かない」などといった印象深いプロテクトは、ネットニュースでも大きな騒ぎになりました。(p309)印象深さとして次点を挙げると、初代プレイステーションにおける、コピーCDの起動を阻止するレッドハンドプロテクトだと思います。これもまたゲーム会社から情報提供を受けていないマニア向けのゲーム雑誌がこぞって取り上げたトピックであり、単純な回避プログラムが書き込まれた(当時違法ではなかった)MODチップをゲーム機にはんだ付けすることでコピーCDが動作するという代物でした。実際のところはごくありふれたPICマイコンにプログラムを書き込んだものなので、原価は100円程度。これがMODチップという名前になると2000~4000円ほど(MODチップ単品の価格。取り付けは別料金!)で売れたのだから笑いが止まらなかったと思います。MODチップの元となるPICマイコン「12C509」。コピープロテクトの技術構成要素は大きく分解すると2つあります。※今回はアクティベーションを含むオンライン対応のソフトウェアの話は除外します1.と2.のどちらかが欠けているとダメです。この2つが合わさって、はじめてコピープロテクトは意味を持ち、動作します。1.オリジナルにはあるが、コピーを取る過程で失われる、ある特徴まず1.について説明します。ある言い回しに「デジタルはアナログと違ってコピーしても劣化しない」と言いますが、それは「何から何まで完全にコピーできれば」の話です。0と1で表現されるデータは完全コピーできそうですが、データを保存しているストレージの特徴も合わせてコピーできなければ完全コピーとは言えません。その方法は時代にあわせていろいろと考案されていますが、一例を挙げます。・ストレージのサイズを特殊なものにしてしまう(大昔の話だが)保存媒体がカセットテープならば、テープを切って中途半端な長さにする→店で買える空のカセットテープは30分とか60分とかなので、判別に使える→この考え方自体はマジコンに対しても使うことができる・記録面に意図的な(読み取り不可の)エラーを設けるフロッピーディスクやCD-ROMで見られるもの→通常の(?)コピーツールは読めないエラーは飛ばしてコピーしてしまう(優秀なコピーツールはエラーもまるごとコピーできる、この場合コピープロテクトは無意味になる)→同一アドレスなのに読み取る度に異なるデータが返る箇所があるこのような挙動はフロッピー時代のコロコロフォーマットが有名だが、CD-ROMやフラッシュメモリにも同様の挙動がある・家庭用の通常の機器ではコピーできない箇所にデータを配置する→一般消費者向けの機器では不完全なコピーとなる→CD-ROMの最内周や最外周に小さなデータがある・データとは違う物理的な付属品をつけるデータはコピー可能だが付属品のコピーは手間も費用もかかることに着目している→乱数表(マニュアルプロテクト)ゲーム中で必要になる。当時のコピー機の性能ではコピーできないような特殊なインクが使われている→プログラムの動作に必要な特殊チップを内蔵するゲームソフトのROMカートリッジは純粋なストレージではなく、ストレージを含むハードウェアであるRTC(時計回路)や専用のコプロセッサなどをカートリッジ側に搭載できるこの回路は当然コピー不可。コピー先にも同じ回路を実装しなければならない→パソコンの外部ポートに差し込むドングルCADソフトや測量ソフトなどで見られるハードウェアキーソフトはコピーできてもドングルは1つしかないドングル自体を複製するには、同じ回路を組まなければならない・ストレージにアクセスできないように物理的に対策する→樹脂で固めてしまう→無理に分解しようとすると自壊する仕組み(耐タンパー化)を設けるチップが埋め込まれた身分証明書(マイナンバーカードなど)で見られる→(解析のために)プローブを当てると黒ひげ危機一発のように自爆するような、触ってはいけない「外れ」回路を設けるネタのように聞こえるが実際にあるらしい・オリジナルの特徴ではなく、コピーデータの保存先の特徴に着目するマジコンは正規カートリッジとはいろいろ異なるストレージのサイズ、メモリマッピング、外部スロットの有無など→正規カートリッジはデータ容量ギリギリのROMやRAMを使うが、マジコンは「大は小を兼ねる」ため、ROMやRAMの容量はかなり大きくなる。メモリマップも異なる→正規カートリッジはROM(書き換え不可)にデータがあるが、コピーはRAM(書き換え可)にデータがある→正規カートリッジには存在しない外部デバイス(フロッピーやmicroSDカードなど)にアクセスできるなどなど...上記の一例を見るとわかると思いますが、オリジナル・コピー問わずデータの保存先に対する深い研究が必要になりますし、発想の勝負だと思います。ゲーム開発者がゲーム開発の傍らに作るものではないように思います。当然のように当時から専門業者がありました。現在、これらの技術要素を具体的に知るには、もう当事者に聞くしかないと思っています。今はまだその当事者たちは健在ですが、10年、20年後になるとわからないと思います...。続いて2.について解説します。オリジナルとコピーとで異なる特徴をつけただけではダメで、特徴が異なっていればプログラムの動作を阻止する仕組みを実装する必要があります。こちらの方はシンプルに説明できます。以下のような分岐処理をプログラムで実装して、起動直後から始めてどこかのタイミングで呼び出せばいいだけです。「何らかの方法でソフトウェアの利用を阻止する」そのプログラムはゲーム機本体側にもあることもありますが、コピープロテクトはゲーム開発者が自発的に実装するものなので、大抵はゲームソフト側で実装されます。コピー利用者に対しては「何らかの方法でソフトウェアの利用を阻止する」必要がありますが、一例を挙げます。・プログラムを即座に停止してしまう→コピーを咎めるメッセージが表示される・ゲームが進行できなくなる→ハングアップしてしまう→核ミサイルが飛んでくる→人に話しかけると斬り殺してしまう(イベントが進まなくなる)→ヒロインから嫌われる→船が港につかない→「体験版である」として終了してしまう→ダンジョンの出口がなくなってしまう→王様から説教を受けてしまう→難易度が大幅に上がってしまう→ゲームの終盤で終了してしまうこれらは(コピー)ゲーマーが直接目にするものなので、コピープロテクトの新旧を問わず今でも話題になることがあります。これらのプログラムの実装自体は簡単です。実装には注意が必要です。実装で気をつけるべきこと(どのタイミングで実行するか)まず、ゲームの序盤・中盤・終盤のどのタイミングでゲームを停止させるかという判断が必要になります。終盤であれば、コピーゲーマーを散々泳がせた挙げ句にゲームを停止できるので、嫌がらせとしてはかなり優秀です。ゲームの大部分をタダで遊ばせるのは判断として迷いますし、何より終盤にプロテクトを配置すると開発時のデバッグが大変です。バグのせいで正規版でもコピー品扱いの判定になってしまうと最悪製品の回収になってしまいます。序盤であれば、全く(もしくは少しだけしか)遊ばせないという目的は達成できますが、なにぶんすぐにコピープロテクトの存在が発覚してしまうため「泳がせる」ことができません。開発時のデバッグは比較的容易になるので、バグのせいで正規版でもコピー品扱いの判定になってしまうケースを避けるためには、どうしても序盤にプロテクトを組み込まざるを得ない、という判断になります。実装で気をつけるべきこと(どうやって処理を隠蔽するか)次に、プログラムの動作を阻止する処理をどう隠すかという問題があります。これは非常に難しいです。コピープロテクトを迂回する側としては、プログラムをリバースエンジニアリングして処理を見つけ出し、条件分岐を書き換えれば、プログラムの動作を阻止する処理は無効化できます。プロテクトが破られるというのはこのパターンが多いです。前述したニンテンドーDSのコピープロテクトはこちらのパターンでした。プレイステーションのレッドハンドプロテクトはMODチップによる方法がすでに確立していたので、プログラム書き換えによるプロテクト迂回はあまり目立っていませんでした。対策としては、処理を暗号化・難読化したり、アンチデバッグ処理を実装したり、処理の改ざんを検知したりといったものがありますが、最終的にCPUが解釈できる処理として存在しなければならない以上、どれもいたちごっこで、じゃあ何重にもかければいいのかというと、ここにも答えはありません。コピープロテクトを作る方に対しては、頑張ってくださいという言葉しか見つかりません。家庭用ゲーム機のゲームソフトの場合、ゲーム機発売直後のタイトル側にはコピープロテクトがありません(コピー方法が発見されていないのだから当然、本体側では想定されるコピーについて対策がされている)。コピー方法が発見されマジコンが流通する頃、つまり家庭用ゲーム機発売から数年が経って円熟期に入ると、どのタイトルにも各々の方法でコピープロテクトが実装されるようになります。これはゲーム機の新旧に関わらず共通して見られる傾向です。現行のプロテクト技術を書き記すのは、いろいろと問題があると思うので今回は自粛します。法律も厳しくなっていますし。あと20年ぐらい経てば書けるかもしれません。最後に弊社ではゲームの不正行為(チート)対策や、DRMの強度測定、配信プラットフォームのセキュリティ診断などを行っています。業務の性質上、採用事例はなかなか公開できないのですが、ゲーム会社からの相談をお待ちしております。読者になる関連記事2024-08-19セキュリティキャンプで話した『ゲームセキュリティの歴史』の話どーも、bubobuboです。初めまして、DP部の今井です。バイナリエクスプロイトのROP(Re...2024-04-08グループ内CTFで出題した、WebAssemblyを使ったゲームでチートをする問題の話こんにちは、デジタルペンテスト部(DP部)のst98です。以前の記...2022-12-06QualcommのEDLモードの話どうも(人によってはお久しぶりです)、ν(ニュー)です。個...2022-11-16ECUのコードを読んでみようデジタルペンテスト部の宮崎です。writeupシステム環境変数のPathに設定するフォルダの権限にご注意を。読者になるこのブログについてはてなブログをはじめよう!lac_devblogさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。