Android用NEOGEOソフト解析

~Android用NEOGEO移植ソフトからROMイメージを抽出~
※>>Steam版NEOGEO移植ソフトからの抽出は別記事です。

Last update 2014/08/23
– convpack.zipがKOF98に対応しました。


gplay

~はじめに~

Google playで販売されているNEOGEO作品のダウンロード容量と
NEOGEOのROMイメージ容量が極めてソックリだったため、構造を解析してみました。
参考 [Google play] METAL SLUG X (¥350)

~注意~
Androidの仕様上「支払い→ファイルだけ抜く→すぐに返金処理」で
手元にROMを残せるはずですが、その場合は現行法で
違法コピーと解釈されるはずです。
この実験を行う方は絶対に返金処理しないでください。

むしろ、Android版NEOGEO移植シリーズはなかなか良好な出来映えなので、
メタスラ1,2,X,3やブレイジングスター…などなど全部買っちゃいましょう。
当時ウン十万円した高価なソフト一式がたった数千円で揃うのですよ。
そんな感じで皆が買いまくれば、いつか
Bluetoothでワイヤレス対戦可能なティンクルスタースプライツ
とかもリリースされるかもしれません(・ω・)


~ダウンロード→展開→ゲーム開始の流れ~
ダウンロードサイズがかなり大きいため、ダウンロードと同時に
「Wi-Fi通信」を推奨されますが、
ダウンロードと実行の流れは以下のようになっています。
(METAL SLUG Xの場合)。

1.ダウンロード時に /sdcard/Android/obb/com.dotemu.neogeo.mslugx/ に
main.2.com.dotemu.neogeo.mslugx.obb と
patch.2.com.dotemu.neogeo.mslugx.obb を保存。

2.実行後にこれらを /sdcard/Android/data/com.dotemu.neogeo.mslugx/files/ に展開。

3.最後にAPKをシステムに配置してプログラムを実行できるように設定。

なおobbファイルはゲームごとに格納フォルダ名が異なるので注意。
( /sdcard/Android/obb/ までは共通で、その下にゲームごとに異なるフォルダが出来る)


~obbファイルについて~
filesフォルダから拾い出しても良いのですが main.2.com.dotemu.neogeo.mslugx.obb を
PCにコピーし拡張子をzipに変更して展開すると、下記の意味深なファイルが抽出されます。

ファイル名 ファイルサイズ 内容
mslugx_adpcm 10240KB ADPCM(V-ROM)
mslugx_bios_m68k 128KB BIOS(neo-geo.rom)
mslugx_bios_sfix 128KB SFIX(sfix.sfx)
mslugx_game_m68k 5120KB Program(P-ROM)
mslugx_game_sfix 128KB SFIX(S-ROM)
mslugx_game_z80 128KB Z80(M-ROM)
mslugx_gfix_usage 4KB SFIXから生成した中間データ(不要)
mslugx_spr_usage 96KB TILESから生成した中間データ(不要)
mslugx_tiles 49152KB Tiles(C-ROM)

NEOGEO版METAL SLUG XのROMと比較すると、V-ROMは4096KB+4096KB+2048KB(10240KB)、
C-ROMは8192KB×6(49152KB)でサイズが完全一致。
さらにNEOGEO BIOSらしきものも含まれてウヒョーーー!!!…と思えますが…。

~NEOGEO BIOSのようなものについて~
mslugx_bios_m68kとmslugx_bios_sfixを見たところ、実機BIOSに限りなく似ています。
ただし、完全に同じではなくエミュレータでロードすると起動直後にクラッシュしました。
恐らく、Androidアプリと連携を取るよう細かい部分がカスタマイズされているものと
推測されます。

また、LO-ROM(000-lo.lo)やSM1(sm1.sm1)など他のBIOSイメージが含まれていないため、
「Android版NEOGEOシリーズからBIOSダンプは現実的に出来ない」と思われます。
とはいえ、NEOGEOエミュレータとして動いていることに違いは無いので、
apkなどからLO・SM1を抽出することは可能かもしれません。

~追記~
BLAZING STARに含まれるファイル blazstar_zoom_table が”000-lo.lo”と完全一致しました。
さらに、NEOGEOエミュレータ『Nebula』はSM1を使わずに音源エミュレーションが可能なため、
『METAL SLUG』または『BLAZING STAR』があればneogeo.zip(BIOSセット)を生成可能です。
詳しい手順は当記事最後の『環境構築』項をご覧下さい。


~METAL SLUG XのROMイメージのようなものについて~
試しにmslugx~ファイルを展開できないか検証用に
romcutter.zip(変換バッチファイル同梱)を作ってみました。
main.2.com.dotemu.neogeo.mslugx.obbを展開したフォルダに
romcutter.exeとandroid_METAL_SLUG_X.batをコピーし、
android_METAL_SLUG_X.batを実行すると、NEOGEO ROMと
同じファイル構成で切り出します。

ファイル名 元サイズ 出力ファイル 出力サイズ
mslugx_adpcm 10240KB 250-v1.bin
250-v2.bin
250-v3.bin
4096KB
4096KB
2048KB
mslugx_game_m68k 5120KB 250-p1.bin
250-p2.bin
1024KB
4096KB
mslugx_game_sfix 128KB 250-s1.bin 128KB
mslugx_game_z80 128KB 250-m1.bin 128KB
mslugx_gfix_usage 4KB 未使用
mslugx_spr_usage 96KB 未使用
mslugx_tiles 49152KB 250-c1.bin
250-c2.bin
250-c3.bin
250-c4.bin
250-c5.bin
250-c6.bin
8192KB
8192KB
8192KB
8192KB
8192KB
8192KB

これらのファイルをmslugx.zipに圧縮したものをエミュレータで実行すると…
mslugx
こんな感じ。


~何が問題なのか?~
上の画像を見て「ああ、ステージ1っぽいなぁ」と思った方はいい勘してます。
つまり画面がバグっていてもゲームは進行できるのです。
また、V-ROMやM-ROMも正常に認識しており、BGM/SEもバッチリ鳴ります。

また、画像はバグっていてもカラー情報は完全に一致しているため、
C1~C6・S1をスマートフォンにあわせてピクセル数を調整しているのかもしれません。
(実際、ROMを比較するとS1は似ているもののC1-C6は大きく内容が異なります)。
とりあえず今のところはNebula(JUKEBOX)で音楽を聴くくらいしか出来ません。

これを解決する方法として考えられるアプローチは
1.C1~C6、S1から元データの仕様に準拠したデータを生成するコンバータを作る。
2.Android版のエミュレータの仕様を再現するプログラムを作る。
くらいでしょうか。

※2013/04/28追記:実際にはTilesは
「C-ROMを元に生成したエミュレータ用パターンデータ」です。
スマートフォン用に調整などは一切していませんでした。


~2013/04/25追記 S1コンバータできました~
game_sfixの法則性が特定できたのでコンバータを作りました
Download : answap.zip
単純なバイトスワップだけで生成が可能で、その法則性はコチラをご参照下さい。

恐らくこのバイトスワップは、SFIX-ROMの並びをNEOGEOのメモリマップ上に
適した形に再配置し、より高速な処理を行うための仕様と考えられます。

~2013/04/25追記 C-ROMの法則性特定できました~
というよりも mslugx_tiles の法則性ですが。
エミュレータなどで用いられるFBAフォーマット(fbacacheで生成)や、
NEOGEOエミュレータNeoDSで用いられるNEOフォーマット(NeoDsConvertで生成)
に格納されているVRAM展開用パターンとほぼ同じでした。
(厳密には処理をより高速化するため4バイトブロックを4ビットごとに反転した内容)

つまり以下のような感じです。

ファイル名 開始オフセット データ並びの例(+0x0010600)
mslugx_tiles 0x00000000 9A A8 B8 08
mslugx.fba 0x00630500 80 8B 8A A9
mslugx.neo 0x00F60200 80 8B 8A A9

Download : tileswap.zip
とりあえず4ビットごとに反転するツールも作りました。
ただし、このツールを使っても「FBAやNEOに含まれるスプライト情報ブロックと
同等のデータ列が生成される」だけで、Android版NEOGEO移植シリーズから
PC用エミュレータでプレイ可能なROMイメージを生成することはできません。

このスプライトパターンから元のC-ROMを復元するプログラムは現段階では未完成です。


~2013/04/28追記 スワップ後のタイルからC-ROM生成できました~
Download : tiles2crom.zip
このツールを使うと前述のtileswapで生成したスワップ済みTilesデータから
C-ROMの生成が可能です。
引数にswapped_tilesを与えるとC-ROMを偶数&奇数バイトにメモリ上へ展開します。
メタルスラッグXの場合はtiles2cromに下記パラメータを与えればROMを生成できました。

開始アドレス サイズ Odd or Even ファイル名
00000000 00800000 0 250-c1.bin
00000000 00800000 1 250-c2.bin
00800000 00800000 0 250-c3.bin
00800000 00800000 1 250-c4.bin
01000000 00800000 0 250-c5.bin
01000000 00800000 1 250-c6.bin

なお、タイルデータから元のC-ROMへの再レイアウトの計算式はコチラ
NeoDS同梱のNeoDsConverterのソースコードを参考にしました。


~環境構築~
NEOGEOエミュレータ『Nebula』で実際にプレイ可能にするまでの手順です。

Download : convpack.zip
BLAZING STAR
METAL SLUG
METAL SLUG 2
METAL SLUG X
真サムライスピリッツ
THE KING OF FIGHTERS ’97
THE KING OF FIGHTERS ’98
の変換バッチファイルと、
tileswap.exe、romcutter.exe、answap.exe、tiles2crom.exeのプログラムセットです。
oddファイルを展開したフォルダに中身をコピーして各種バッチファイルを実行し、
C-ROMを正しい手順で変換すればゲームのROMイメージを生成できます。

***-p1.bin、***-c1.bin など拡張子binのファイルが複数生成されるので、
ゲームごとに以下のzipファイルにまとめて圧縮してください。

タイトル ZIPファイル名
メタルスラッグ mslug.zip
メタルスラッグ2 mslug2.zip
メタルスラッグX mslugx.zip
ブレイジングスター blazstar.zip
真サムライスピリッツ samsho2.zip
THE KING OF FIGHTERS ’97 kof97.zip
THE KING OF FIGHTERS ’98 kof98.zip

BIOSイメージ作成にはMETAL SLUGもしくはBLAZING STARを購入し、
oddファイルを以下の通りリネーム。

METAL SLUGの場合 BLAZING STARの場合 リネーム後のファイル名
mslug_bios_m68k blazstar_bios_m68k neo-geo.rom
mslug_zoom_table blazstar_zoom_table 000-lo.lo
mslug_bios_sfix blazstar_bios_sfix sfix.sfx

※実際にはneo-geo.romは使えませんが念のためパックします。

さらにTHE UNIVERSE BIOSの最新版(2013/04/29現在v3.0)をダウンロードし、
uni-bios.romを先ほどの3つのリネームしたファイルと一緒に”neogeo.zip”に圧縮すればOKです。

NebulaのromsフォルダにゲームのROMイメージおよびneogeo.zipを入れて実行し、
Game – Neogeo OptionsメニューのUse Universe-Biosをチェックすれば準備完了。
これで購入した作品をPCでプレイ可能になります。


~さいごに~
これで、Android版NEOGEO作品からNebulaなどで実行可能な
ROMイメージを生成できました。
しかし、せっかく自分で支払って購入したソフトからROMイメージを生成するのですから、
決して誰にも渡さず、あくまで自分用のバックアップとして利用しましょう。
(”mslugx”とサーチするだけで海外のROMサイトがばんばんヒットしますし、
恐らく違法コピー目的の人がこんな面倒なことをするわけありませんが…)。


メールアドレス(アットマークを半角に) : hs_mana@hotmail.com

Android用NEOGEOソフト解析」への19件のフィードバック

  1. metal slug xをここの手順通りやっているのですが、android_METAL_SLUG_X.batを
    起動すると250-m1.binと250-s1.binだけ作られあとのファイルはアクセスが拒否されましたと出てファイルが作られません。アクセス許可はフルコントロールにしていますがどうもうまくいきません。何かやりかたが間違っているのでしょうか

  2. 可能性として考えられるのは
    ・フォルダ名に日本語または半角スペースが含まれている。
     (バッチファイルの引数指定が狂う可能性アリ)
    ・OS仕様上、管理者ユーザ以外では通常アクセスが出来ない
     特殊フォルダにファイルを展開し、通常ユーザでコマンドを実行している。
    のどちらかと思われます。

  3. 返信ありがとうございます。問題はご指摘の通りアクセス権限に関することでした。問題を解決したところ無事7本全てのromを吸い出すことが出来、nebulaで起動を確認しています。ありがとうございました。

  4. Steamで販売されているやつも同じようなファイル構成だったので、この記事を参考に抽出できました ありがとうございます

  5. いつも有意義な情報ありがとうございます。
    不躾な質問で申し訳ありませんが、こちらのツールで
    android 餓狼 MARK OF THE WOLVESに対応の
    予定はございませんか?

    よろしくお願いいたします。

  6. 理論上はコンバート出来るとは思いますが、
    元となっているROMが特殊チップになっているため
    法則性がつかめていません。
    HumbleBundleあたりで素ROMが出てくれればそれを元に
    解析できますが、今のところは無理ですねぇ。

  7. 分かりました。ネオジオ後期のロムデーター特殊チップなんですね。

    お返事ありがとうございます。

  8. 貴重な情報のおかげで、貴重なneogenゲームが遊べて助かってます。
    恩返しというほどではないですが、
    psvitaの月華2は、vita3.60、かつhenkaku導入済み、
    そしてvitaminを使ってバックアップをとれば、
    romデータを構築できます。
    c-romは、こちらのtiles2cromで変換すればいいです。

    しかし、wiiのvcにあるcr00のromが厳しい。
    メモリーダンプでc-rom以外はいけるのですが···
    何か方法はないでしょうか。

  9. メタルスラッグXの変換を試したところ、250-p1のCRC値が異なり起動不可でした(他のROMは全てCRC値一致)
    変換:60C33B1A
    本来:81F1F60B

    あとsteam版の幕末浪漫 月華の剣士は以下のバッチで変換出来ました
    echo off
    romcutter.exe lastblad_adpcm 234-v1.bin 0 400000
    romcutter.exe lastblad_adpcm 234-v2.bin 400000 400000
    romcutter.exe lastblad_adpcm 234-v3.bin 800000 400000
    romcutter.exe lastblad_adpcm 234-v4.bin C00000 400000
    romcutter.exe lastblad_game_m68k 234-p1.bin 0 100000
    romcutter.exe lastblad_game_m68k 234-p2.bin 100000 400000
    answap lastblad_game_sfix 234-s1.bin
    copy lastblad_game_z80 234-m1.bin
    tileswap lastblad_tiles lastblad_tiles.swp
    echo 2ndStage reference..
    echo 234-c1.bin : StartAddr=0 Line=0 Size=800000
    echo 234-c2.bin : StartAddr=0 Line=1 Size=800000
    echo 234-c3.bin : StartAddr=800000 Line=0 Size=800000
    echo 234-c4.bin : StartAddr=800000 Line=1 Size=800000
    echo 234-c5.bin : StartAddr=1000000 Line=0 Size=400000
    echo 234-c6.bin : StartAddr=1000000 Line=1 Size=400000
    tiles2crom.exe lastblad_tiles.swp
    copy lastblad_bios_m68k neo-geo.rom
    answap lastblad_bios_sfix sfix.sfx
    copy lastblad_zoom_table 000-lo.lo
    pause

    • バージョン違いやコピーライトの修正などで範囲が書き換えられている可能性もあるので、今のバージョンだと新たに解析しないとダメかもですね。

      • >バージョン違いやコピーライトの修正などで範囲が書き換えられている可能性もある

        250-p1の抽出元である”mslugx_game_m68k”のファイル更新日付は2012/10/27でしたので、こちらの記事が記載される以前ではあるんですけどね。

        残念。

    • こちらでも同じ状態でしたが Nebula で CRC エラーを無視して続行したら起動できました。

      普通に遊べているので、ゲームと直接関係無い箇所の修正があったのかもしれませんね。

      なお、Steam 版、GOG 版 で確認したところ、両方とも同じ CRC値(60C3B1A)でした。

      読み込み時に CRC チェックが厳格なエミュレータだとエラーになり起動できません。

  10. Prime Gaming(旧名称:Twitch Prime)のものを変換する際に作ったパッチですが、Steamも同じファイル構成なら使用出来るかも?

    Shock Troopers のバッチ(Bios分除く)============================

    romcutter.exe shocktro_adpcm 238-v1.bin 0 400000
    romcutter.exe shocktro_adpcm 238-v2.bin 400000 200000
    romcutter.exe shocktro_game_m68k 238-p1.bin 0 100000
    romcutter.exe shocktro_game_m68k 238-p2.bin 100000 400000
    answap shocktro_game_sfix 238-s1.bin
    copy shocktro_game_z80 238-m1.bin
    tileswap.exe shocktro_tiles 238-c.swp
    echo 238-c1.bin : StartAddr=0 Line=0 Size=400000
    echo 238-c2.bin : StartAddr=0 Line=1 Size=400000
    echo 238-c3.bin : StartAddr=400000 Line=0 Size=400000
    echo 238-c4.bin : StartAddr=400000 Line=1 Size=400000
    echo 238-c1.bin : StartAddr=800000 Line=0 Size=400000
    echo 238-c2.bin : StartAddr=800000 Line=1 Size=400000
    echo 238-c3.bin : StartAddr=C00000 Line=0 Size=400000
    echo 238-c4.bin : StartAddr=C00000 Line=1 Size=400000
    tiles2crom.exe 238-c.swp
    pause

    Shock Troopers – 2nd Squad のバッチ(Bios分除く)===============

    romcutter.exe shocktr2_adpcm 246-v1.bin 0 400000
    romcutter.exe shocktr2_adpcm 246-v2.bin 400000 400000
    romcutter.exe shocktr2_adpcm 246-v3.bin 800000 200000
    romcutter.exe shocktr2_game_m68k 246-p1.bin 0 100000
    romcutter.exe shocktr2_game_m68k 246-p2.bin 100000 400000
    answap shocktr2_game_sfix 246-s1.bin
    copy shocktr2_game_z80 246-m1.bin
    tileswap shocktr2_tiles shocktr2_tiles.swp
    echo 248-c1.bin : StartAddr=0 Line=0 Size=800000
    echo 248-c2.bin : StartAddr=0 Line=1 Size=800000
    echo 248-c3.bin : StartAddr=800000 Line=0 Size=800000
    echo 248-c4.bin : StartAddr=800000 Line=1 Size=800000
    echo 248-c1.bin : StartAddr=1000000 Line=0 Size=800000
    echo 248-c2.bin : StartAddr=1000000 Line=1 Size=800000
    tiles2crom.exe shocktr2_tiles.swp
    pause

  11. Steamの”SAMURAI SHODOWN NEOGEO COLLECTION”から以下リンク先のツールを用いる事で侍魂1~4が抽出出来ました
    https://github.com/ValadAmoleo/sf30ac-extractor

    Steamの”幕末浪漫第二幕 月華の剣士”(Dotemu移植)は、Cロム以外は以下のバッチファイルで変換?したところCRC値が一致しました
    romcutter.exe v1.bin 243-v1.v1 0 400000
    romcutter.exe v1.bin 243-v2.v2 400000 400000
    romcutter.exe v1.bin 243-v3.v3 800000 400000
    romcutter.exe v1.bin 243-v4.v4 C00000 400000
    copy m1.bin 243-m1.m1
    copy s1.bin 243-s1.s1
    romcutter.exe p1.bin 243-pg1.p1 0 100000
    romcutter.exe p1.bin 243-pg2.sp2 100000 400000

    あとは”c1.bin”と言ういかにもな名前の48MBのファイルからどうやってCロムx6を取り出すか?

    • SAMURAI SHODOWN NEOGEO COLLECTIONはepic gamesと同じものであれば、samsho5,5sp,5sp完全版もいけますよ。

      月華2のc1.binはもしかしたらtiles2cromで変換すればいいかもしれません。vita版はそれでいけました。
      ちなみにvita版のフライングパワーディスクもhenkaku導入していれば、rom構築までできます。

      • >SAMURAI SHODOWN NEOGEO COLLECTIONはepic gamesと同じものであれば、samsho5,5sp,5sp完全版もいけますよ。
        30ac-extractorを実行したところsamsho5系はzipファイルが作成されなかったので暗号化の都合かと思っていたのですが
        何か手法があるのでしょうか?

        >月華2のc1.binはもしかしたらtiles2cromで変換すればいいかもしれません。
        頂いたアドバイスを参考に下記数値で試したところいけました。

        243-c1.bin StartAddr:0 Odd_or_Even:0 SplitSize:800000
        243-c2.bin StartAddr:0 Odd_or_Even:1 SplitSize:800000
        243-c3.bin StartAddr:800000 Odd_or_Even:0 SplitSize:800000
        243-c4.bin StartAddr:800000 Odd_or_Even:1 SplitSize:800000
        243-c5.bin StartAddr:1000000 Odd_or_Even:0 SplitSize:800000
        243-c6.bin StartAddr:1000000 Odd_or_Even:1 SplitSize:800000
        243-c7.bin StartAddr:1800000 Odd_or_Even:0 SplitSize:800000
        243-c8.bin StartAddr:1800000 Odd_or_Even:1 SplitSize:800000

        これでSteamの”幕末浪漫第二幕 月華の剣士”の変換も完了です。
        有難う御座いました。

        あとSteamのでは”ベースボールスターズ2″か、餓狼MoWは無理っぽいし。

  12. 2020.8.27に掲載された記事を発見
    SNKコンソール版『ベースボールスターズ 2』から「台湾」関連名称が削除に―『龍虎の拳2』PC版からも旭日旗削除
    https://www.gamespark.jp/article/2020/08/27/101574.html
    >同作の登場球団はいずれも地名が含まれていますが、内「タイペイ・ホークス」「タイワン・ドラゴンズ」の2チームについて、名称から地名部分の削除が行われたとしています。
    >なお、Steam版では先日、全てのチームから地名が削られているとのことです。

    バイナリが一致しないはずだ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です