LoginSignup
0
4

DeSmuMEを導入しニンテンドーDS用ゲームの解析が行える環境を整備する

Last updated at Posted at 2024-01-31

この記事ではニンテンドーDS向けエミュレータの一つである「DeSmuME」をPCに導入し、ニンテンドーDS用ゲームの解析が行える環境を整える記事です。

DeSmuME以外にもエミュレータがありますがこの記事ではこのエミュレータを取り扱います。

違法な行為は取り扱いませんし、推奨する記事ではありません。

ニンテンドーDS(以下DS)は2006年12月に任天堂株式会社より発売された携帯型ハードである。累計販売台数は1億5000万台を突破し、ソフトは9億5000万弱本販売をしたゲームである。1 タッチ!ジェネレーションズ戦略により瞬く間に広がったDSは今も人気のタイトルをいくつも排出させたハード機である。 

昨今のゲームの遊び方の一つにSpeedrun(いわゆるRTA)がある。Speedrunはいかにゲームを早くするかという遊び方で、DSのみならずファミコンやN64など様々なハードのゲームにて行われる近年メジャーになりつつある遊び方である。その遊び方を極めるにはゲームの仕様を事細かに解析する必要がある。実機を使って解析をすることは困難であるため、エミュレータを使用する。

インストール

必要なPCスペック
Windows:Windows XP SP2 以降
MacOS:OS X v10.5.8 Leopard以降
Linux:2.6カーネルを備えた最近のLinuxディストリビューション
CPU:Intel Core 2 Duo 2.0 GHz 以上
RAM:1GB以上

推奨スペック
Windows:Windows Vista SP2 以降
MacOS:OS X v10.6.8 Snow Leopard以降
Linux:2.6カーネルを備えた最近のLinuxディストリビューション
CPU:Intel Core 2 Duo 3.0 GHz 以上
RAM:2GB以上

化石みたいなスペック表だな...

インストーラー

以下URLページの中から必要なバージョンのファイルをダウンロードする。
https://desmume.org/download/
なにか特別な理由がない限りは上記ページに表示される最新バージョン2をインストールすることを強く推奨する。最新バージョン以外のものが欲しい場合は一番下のリンク(If you need an older ~~と書かれている文の下のリンク)から欲しいバージョンを探す。

0.9.110.9.10の間にはTASmoviesyncに問題があるためTAS制作を考えている場合と更新をする際には要注意

上記ページのStable Releasesのリンクをクリック。執筆段階ではGithubにホストされているのでGithubに移行する。
自身のOSに合うものをダウンロードする。例えばWindowsならdesmume-0.9.13-win64.zipをダウンロードする。
ダウンロードしたら解凍をし、解凍したフォルダごと任意のディレクトリに配置する。今後の説明ではC:\Program Files\desmume-0.9.13に配置したと仮定して説明をする。
Desmume_ver_OSbit.exeをダブルクリックし起動を確認する。

インストール不要型のソフトなのでUSBに保存しても構いません。

パスに日本語を含めないでください。例として以下のディレクトリはアウトです。Windowsの場合は自身のユーザー名が原因のことがあります。
C:\Users\ゲストCもち\Documents\desmume-0.9.13

ROMの用意

ニンテンドーDS用ゲームソフトのデータ(ROM)を用意する。3
主な方法は2つで、
ニンテンドー3DSもしくはニンテンドーDSiを改造しROMを吸い出す方法
②USB経由の吸出し機を購入する方法
です。

令和3年施行された改正著作憲法では正規版が有償のコンピュータープログラムも保護対象に入ったため、違法ダウンロードは明確にアウトです。
著作権法第119条3項には、違法にアップロードされている著作物であることを知りながら、反復・継続してダウンロードした場合は、2年以下の懲役もしくは200万円以下の罰金、またはこれらを併科するとなっているため割れROMの入手は絶対にやめましょう。刑事的責任を伴います。親告罪も犯罪です。

ニンテンドー3DSもしくはニンテンドーDSiを改造しROMを吸い出す方法

3DS,DSiともにCFWを導入してください。DSiはFWのアップデートはさすがに終わってるでしょうが、執筆段階での最新版1.4.5では1.4以降で使えるニンテンドーDSiカメラのexploitから導入できます。3DSはFWのアップデートが極まれに実施されるため最新情報に最新の注意が必要です。執筆段階での最新版11.17.0-50JではブラウザのSkaterexploitから導入できます。
DSiの場合はGodMode9iを、3DSの場合GodMode9を導入することでカートリッジ経由でROMの吸出しが可能になります。
吸いだした場合のROMの拡張子は.ndsもしくは.trim.ndsです。後者の場合はリネームで.trimを消しておくとAviutl等で動画編集する際のエラーリスクが減らせます。

②USB経由の吸出し機を購入する方法

Amazon等でDS 吸出し機などと検索するといっぱい出てきます。使ったことがないので使用感は分かりませんが、直接PCに保存できる点や改造によるニンテンドーアカウントBANのリスクが無くせるのがメリットです。価格は4000円程度が相場と思われます。

WiiUを改造し、WiiUで購入したVCを吸い出すという方法もありますが、復号のためのキーの吸出しも伴うため複雑かつ合法性を保つ難易度が高くなるのであまりオススメはしません。

セーブデータの準備(オプション)

基本的にエミュレータはエミュレータでセーブデータが作成されますので最初から遊ぶ必要があります。(=解析したい部分がゲーム中盤ならそこまで進める必要がある)
それが面倒/実機セーブデータが絡む解析をしたい場合はセーブデータを吸い出す必要があります。方法は上記ROM吸出しと同じ方法で行えます。おそらくオプションとしてセーブデータを同時に吸い出すタイプ(USB)と別メニューから吸い出すタイプ(Godmode9等)がありますので柔軟に対応して吸い出してください。
欲しいセーブデータの拡張子は.savです。

プロアクションリプレイMAX(DS用)でもセーブデータは吸い出せますが、拡張子が.ducのため以下サイトからセーブデータの変換が必要です。4
https://web.save-editor.com/tool/wse_ds_save_converter.html

エミュレータの設定

エミュレータを起動すると画面は以下のようになる。

もしあなたが英語が嫌い/英語に明るくないのであれば有志が作成した日本語化パッチで日本語化が可能である。googleで「Desmume バージョン名 日本語化パッチ」と検索すれば出てくるだろう。有志作成で同バージョンでもいくつか配布ページがあることからこの記事ではパッチを適用していない状態で書く。

基本設定

まずConfig -> Emulation Settingへ進み以下の画面を開く。

General
Enable Advanced Bus-Level Timing
オンのままで良いですが、エミュレータが重い場合はチェックを外してください。(ただしTAS5を作る予定がある場合や再生する場合はオン)
Enable Game Hacks
特に理由が無ければオン バグが多いゲーム向け機能

CPU emulation mode
Use dynamic recomplier
特に技術的な理由がなければオフ この機能はSpeedrunにとって何の役にも立ちません。 TASの場合は厳禁です。

Debug
Use 8MB degugger mode when startng execution
Emulate Ensata
基本オフです。どちらも大変ニッチなデバッグ機能ですが、ポケモンなどごく一部の作品で使用する可能性があります。

BIOS
もしあなたがBIOSのデータを持っているのであればここで設定します。

警告
BIOSとFirmwareの吸出しはROMの吸出しより違法性が高く危険です。6アメリカ合衆国への旅行などの際に吸い出しておくなど日本国領土内においては吸出しを行わないことを強くオススメします。ダウンロードはもっての外です。
BIOS&Firmwareは無くてもしっかり動作します。DSのエミュレータ事情において基本必要がないです。7

Use external BIOS images
実機BIOSを所持していて使うならチェック
ARM9 BIOS
吸いだしたbios9.binのパスを...から指定
ARM7 BIOS
吸いだしたbios7.binのパスを...から指定
Emulate SWIs with BIOS images (otherwise,HLE)
Patch DelayLoop SWI
基本オフ ポケモンなど一部ROMで使用する可能性あり。

Firmware
Use external firmware image
実機Firmwareを所持していて使うならチェック
Firmware image
吸いだしたfirmware.binのパスを...から指定
Boot from firmware (like the NDS)
起動時にいきなりROMを読み込むのではなく、実機DSのように読み込ませたい場合オン RTCを弄る必要があるTASを作る場合もオン
Load User Setting from file
吸いだしたfirmwareの設定を使いたい場合はオン エミュレータの設定を使いたい場合はオフ

操作設定

Config -> Control Configへ進み以下の画面を開く。
image.png
各ボタン変更したいところをクリックし、キーを入力する。
なお赤はWindowsによって予め決められてるキー、ピンクはホットキー(後で設定)、青は既に他のボタンと被っており、緑が現在操作を受け付けているものになる。なお各設定は以下の通り
UP:十字キー上
LEFT:十字キー左
DOWN:十字キー下
RIGHT:十字キー右
B:Bボタン
A:Aボタン
Y:Yボタン
X:Xボタン
LID:蓋の開け閉め
START:STARTボタン
SELECT:SELECTボタン
L:Lボタン
R:Rボタン
UP LEFT:十字キー上と左同時押し キーボードの同時押し制限の関係で必要な場合
UP RIGHT:十字キー上と右同時押し
DN RIGHT:十字キー下と右同時押し
DN LEFT:十字キー下と左同時押し
DEBUG:用途不明

ホットキー設定

Config -> Hotkey Configへ進み以下の画面を開く
image.png
必要なホットキーを設定する。解析目的なら特にFrameAdvanceIncrease/DecreaseSpeedは必要だろう。
Main
Open ROM:ROMを開く
Reload ROM:ROMを再読み込みさせる
Reser:ソフトウェアリセット
Pause:一時停止
CPU mode:用途不明
Increase JIT block size:JITブロックサイズを上げる 
Decrease JIT block size:JITブロックサイズを下げる
FrameAdvance:1フレームずつ進ませる機能
Fast Forward:早送り
Fast Forward Toggle:早送りトグル
Increase Speed:ゲームスピードUP
Decrease Speed:ゲームスピードDOWN
Limit Framerate Toggle:フレームレート制限トグル
Microphone:マイク入力(別個マイクに関する設定が必要)
Mic Prev Sample:(連続入力の設定が有効)前のサンプル
Mic Prev Sample:(連続入力の設定が有効)次のサンプル
Increase Pressure:筆圧上昇(意味ある?)
Decrease Pressure:筆圧下降(意味ある?)
Auto-Hold:オートホールド(キーボードの関係で必要なら)
Auto-Hold Clear:上の機能を解除

Tools Movie Savestates Savestate Slots Turbo Otherは必要な時に設定すると良いだろう。

パス設定

デフォルトで困ることはない。指定したい人向け
Config -> Path Settingへ進み以下の画面を開く

Roms:ROMファイルの入力先
Auto save:ROMのセーブデータの入出力先 セーブタイミングは実機と同じ
Im/export:イン/エクスポートしたセーブデータの入出力先 セーブ付きTASmovie用途向け
States:ステートファイルの出力先
Slots:各ステートスロットに入っているステートファイルの出力先
Screenshotsスクリーンショットの出力先 フォーマットと拡張子変更可
AviFiles:動画エンコード時の出力先
Cheats:チートコードファイルの入出力先 フォーマット変更可
Lua:Luaスクリプトの入力先 ROM読み込みと読み込み連動設定可
Defaults:デフォルト設定に戻ります。困ったときにどぞ。

絶対パス,相対パスに日本語が含まれるとエラーが出ます。このソフトで扱うもの全てで2byte文字を含めてはなりません。

実際にROMを読み込ませる

実際にROMを読み込ませてみる。File->Open ROM...で用意したROMを選択する。以下のようにゲームが起動するかを確認する。
1.png
ここでゲームが起動しない場合ROMが正しく吸い出せれていない、もしくは絶対パスに日本語が含まれていると考えられるため修正する。
しばらくプレイしてみてフリーズやクラッシュしないか確認する。ゲームがカクカクしてしまう場合はPCスペック不足などが考えられるので設定を見直す。

1F毎に違う入力をしたい場合...
Pauseで一時停止

1F入力したいキーを入力+Frame Advanceキーを入力
入力されたかどうかを確認したい場合は次の項目のDisplay Inputを有効化

画面上の情報

View->HUDで様々な情報を表示することができる。たとえばDisplay Frame CounterDisplay Inputを有効化すると以下のような形で表示してくれる。(この2つは解析や検証する場合は便利だろう)

4.png
Display Frame Countは経過フレーム数(ROM読み込み時)からを表しており、実機Firmwareを適用してなおかつBoot from firmwareを有効化している場合はFirmware起動時からのフレーム数になる。
Frame数はリセットを行うと0からになる。ただしメニューから行うリセットが0になり、L + R + START + SELECTでのリセットは0にならない。また、TAS入力中はリセットをしても0にならない。(経過フレームなので)

Display Inputは現在入力しているキーを表示する機能である。色が白色の場合現在ゲームに入力されているキー、緑色はゲームには入力されていないキー(一時停止など)、赤色はゲームに入力されたキー(TAS movie再生時やFrame Advanceでの入力など)になる。

メモリ値を見てみる

ゲームに限らず全てのプログラムはCPUのみで完結するわけではなく、RAMに一時的にデータを保管をし処理をする。特に変数はRAMに一時記憶させるためRAMをすべて監視すればゲームが扱っている変数を監視することができる。 が、DSのRAMは8MBあるためすべてを監視することは現実的ではない。
そこで、RAMsearch機能とRAMwatch機能を活用することで目的変数をすばやく特定し目的変数のみを監視する。

練習 操作法習得

まずは練習として画面にも出てくる変数としてスコアを監視してみるとする。
Tools->RAM Search...を選択し以下のようなウィンドウを表示させる。

好みで最大化したって構わない8 なおデュアルモニターではない場合は最大化はオススメできない(後述)

5.png

6.png

今回はまだスコアが0なので、条件はEqual To(と同じ)、比較先はSpecific Value(特定の値)を0、データサイズを4bytes(32bitCPUなのでいったんこれにしておくと良い)、データタイプはSinged(表示オプションなので好きなやつでいい)にし、Searchをクリックし現在0のメモリ値になっているメモリを表示させる。

ここからは何度も条件を増やしていき絞り込んでいく作業になる。
一度ゲームを進め、スコアを200にし、Specific Valueを200にしSearchした。
7.png
2つまで絞りこめた。さらにゲームを進めてスコアを1000にしてみる。
8.png
どうやらどちらもスコアに関連する変数であろうと思われる。(この場合おそらく内部スコア用と表示用)
RAM searchはメモリをサーチするツールで見るためのものではなく不便です。特にこのままほかのメモリをサーチしようとすると今出ているものを一旦リセットしなくてはなりません。
そこでRAM watch機能を併用します。Tools->RAM Watch ...から該当ウィンドウを表示できますが、RAM Search...機能から表示するのが便利なのでそちらの方法を使います。
監視したいメモリを選択したあとRAM searchウィンドウのwatchを選択、すると
9.png
が出るのでここに自分のメモを入力してOKをクリック(今回は例としてscore
10.png
すると自動でRAM Watchウインドウが表示され先ほどのメモリが追加される。
なおRAM watchは起動毎にリセットできるがFileタブから保存可能である。

練習 座標特定

先ほどは画面に表示される変数を使ってRAM Search/Watchを行った。実際の場面では画面に表示されていない変数を知りたい場面が多いだろう。そこでここではマリオのX座標を特定することを試みる。
11.png
RAM SearchウィンドウからResetをクリックして再び条件を入力する。
マリオのX座標はプレイヤーが操作しない限り1-1では変わらない。そこで条件を、
Equal toPrevious Value(前回の値)、4bytesSignedAutosearchを有効化(毎f自動search実行)で200fぐらい放置する。これで今現在変動していないメモリを絞る。
その後、Auto Searchを解除しマリオを左に進める。
12.png

左に進んだということはおそらくX値は少なくなっているはずである。そこで、Less Than(未満)、Previous Value4bytessignedを実行するとこのぐらいは絞れる。
13.png
感覚的に200個以下になれば実際の値と挙動を見れば怪しいものを絞り込める。
今回は怪しいものを13個ほど雑に帰属をしてみる。
いっぺんに複数のメモリをRAM watchに追加するには複数選択をしwatchをクリックするだけである。
14.png
実際にゲームを動かしながら適当に帰属を行ってこんな感じになった。(5分クオリティ)

15.png

このような形である程度絞り込む。あとはこの帰属を確定させる方法だが、チートにより適当な値を入れてみたあとのゲームの挙動を見て判断する。
今回はチートを使ってないので確実性はないが、マリオのX座標おそらく0x0208AD20の4bytesにfloat型で格納されていると思われる。(本当の座標とか仕様はマリオなので調べたら出てくると思います。特にTAS関連で調べれば)

関連するメモリを一括で特定する

一つメモリ座標が特定できると関連するメモリ座標が一括で特定できることがあります。
Tools -> View memoryからMemory Viewerウィンドウを開く
16.png

Memory ViewerウィンドウはRAM Watchウィンドウ等と異なり、ほかのウィンドウがアクティブになると手前表示にならないので他のウィンドウと重ならないように配置しないとめんどくさいです。
また毎F更新されるのでゲームが重たくなるので普段使いするものではないです。

View modeWords(4bytes)にし、先ほど特定した0208AD20をAddressに入れGoをクリックするとその場所まで自動で飛んでくれます。
今回はX座標を特定しましたが、多くの場合Y座標が周辺(たいてい+4bytesか+8bytes)にありますのでこの状態で少し遊んでみます。
Y座標はゲームにより正負の方向が異なることがありますが、まあ今回は動きに比例しているかどうかを確認します。どうやら0x0208AD24(4bytes float)で入っているっぽいです。
この例のように基本ステータス同士や座標同士などは周辺にあることがあるので一つを特定すれば関連のものも特定が可能です。

メモリ番地特定 裏ワザ

ニンテンドーDSはその時代背景からチートコードがインターネットに豊富にあります。チートコードというのは原理的には特定メモリ番地のメモリ値を書き換えるというようなもので働いています。
googleでニューマリDS チートコード PARと検索して出たものの一つを例にとります。

タイム停止
120c9298 00000040

プロアクションリプレイ(PAR)のコードはNXXXXXXX YYYYYYYYの形が基本でNが条件式等処理及びデータ長でXXXXXXXがメモリ番地、YYYYYYYYYYが書きこむ値(書き込みの場合)になる。9
この場合はN=1で1コードになるので、0x020c9298から2byte長で0x0040を毎フレーム書き込む。という意味になる。
これはすなわち、右上のタイムは0x020c9298から2byte長で格納されているということがわかる。
DS時代は基本的に検索すればチートコードが出てくる10と思うので、まずはチートコードを探すのが便利かもしれない。

まとめ

Desmumeを導入し、ニンテンドーDSの解析が行える環境と簡単な解析の手法を紹介した。しかしあくまでも表示されるのはメモリ値であり、自身でそこから計算処理等をしなければならなかったり、ID表とにらめっこする必要がある。
そこで次回はこの環境にLuaスクリプトを組み合わせてより便利により見やすくする手法を学ぶ。

「DeSmuMEにてLuaスクリプトを導入し、解析orTAS制作を手助けする」
https://qiita.com/gestoC_moti/items/9ffd77c067d975e15e38

  1. 任天堂株式会社 株主・投資家向け情報 ゲーム専用機販売実績 https://www.nintendo.co.jp/ir/finance/hard_soft/index.html (2024/01/12 アクセス)

  2. 執筆段階での最新バージョンは0.9.13

  3. 割れROMは明確な違法なものの、ROMの吸出しが完全な違法/合法であるかは微妙なラインである。
    まず第一にDSのROMは確かにコピーガードがかかっている。(いわゆる割れ対策)そしてコピーガードを回避できることを知りながらコピー(吸出しも)は著作権法の私的利用から除外することになっている。一見完全にアウトとなりがちなのだが、著作権法上での技術的制限とはコピーコントロールのみであり、DSのコピーガードはコピーコントロールではない(アクセスコントロールといえる)ので私的利用の範囲内になりセーフになる。
    第二に技術的制限の回避といえば不正競争防止法がある。第二条一項十号十一号を要約すると技術的制限手段の回避するための装置を
    販売、輸入等する行為が禁じられており、”使用”自体は微妙なところである。目的が不正の利益を得るためでもなければ、法律の目的からも考えても違法性を問いにくいと思われる。(第一条)
    第三に特許法が挙げられそうであるが、特許権の効力が及ばない範囲として「試験又は研究のためにする特許発明の実施」とある。(第六十九条一号)

  4. この記事に対応させるなら.sav (RAW FILE FORMAT)、自身で分かるなら.dsvに変換

  5. ニコニコ大百科 TAS
    https://dic.nicovideo.jp/a/tas (2024/01/18アクセス)

  6. 法律を注釈3の解釈で進めばほぼほぼROMと同じ扱いにはできそうな気もするが、一般的にROMの吸出しはギリOKでBIOSとFirmwareはダメという風には言われているので日本で吸い出さないのが一番安全。ただしDesmumeで動作させるにはおそらくDSliteかDSのBIOSとFirmwareを吸い出さないといけなくて、マジコンが必要になるので現状難易度が高いです。(販売が違法で手に入りにくい)

  7. 一部エミュレータはBIOSがないと割れ対策が発動してしまうことがあります。desmumeでは基本大丈夫です。

  8. けんた食堂 https://www.youtube.com/user/oi8oi (2024/01/31 アクセス)

  9. 後日記事書きます。(記事書いたらここはリンクになる)

  10. ではこのチートコードはどうやって作ったのかというと、当時のゲーマーがエミュレータ(それこそDesmumeを使うケースも)を使ってmemory searchをして作った。それらを各書籍へ投稿したりワ〇ップに投稿したりした。

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4