honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

NEOGEO ASP Unlock All games

!!!! WARNING !!!!!

You may broke your console.
If you wait unlock key from vender , you must wait.
You can this with your spare ASP.

 And I can make the "Unlock All USB" but I am busy for waiting new baby.
So I wrote this article for expert hacker who can use solder iron and Linux.


NEOGEO Arcade Stick Pro - Hidden Games Unlocked

Above game list is TRUTH.ASP has 40 games with hidden 20 games.

 

You can unlock all games with below operations,

but you will be rejected from repair service.

 

 

1.Open console.

f:id:honeylab:20191113140442j:plain

2.Take out the PCB from case and remove steel shield cover.

f:id:honeylab:20191113141114j:plain

3.Short "R44" pad for enable UART signal.

f:id:honeylab:20200108015807p:plain

f:id:honeylab:20200108020013p:plain

4.Connect to PC with USB-UART(3.3V level) converter.

"-" to "GND" , ASP "Rx" to PC "TX" , ASP "Tx" to PC "RX"
And set terminal 115200bps,8bit,None.

If connection OK and turn ASP power on , you could see bootup log on terminal.

f:id:honeylab:20200108020242p:plain

 

"root@snk:/ #" is linux terminal with root.

if you cannnot serial "root@snk:/" or hit [Enter] or check connection.

you type command and hit [enter].command line is "one line" if you see separate line.

and put linux expert on your side.

5. change current directory to mod

root@snk:/ # cd /mnt/vendor/res/local

root@snk:/mnt/vendor/res/local

6.check your filesystem

root@snk:/mnt/vendor/res/local # ls -la
drwxrwxrwx root root 2019-10-16 10:20 English
drwxrwxrwx root root 2011-01-01 22:33 Japanese
drwxrwxrwx root root 2019-10-16 10:20 Korean
drwxrwxrwx root root 2019-10-16 10:20 Simplified_Chinese
drwxrwxrwx root root 2019-10-16 10:20 Traditional_Chinese
-rwxrwxrwx root root 834240 2019-10-16 10:21 default.ttf
-rwxrwxrwx root root 186 2019-10-16 10:21 lang_array.ini

7.Enter "Japanese" locale

 I'm using Japanese Game List, if you are not , select "English" or "Korean"...

root@snk:/mnt/vendor/res/local # cd Japanese/

8.See to check the filelist.

root@snk:/mnt/vendor/res/local/Japanese # ls -la
-rwxrwxrwx root root 332 2019-10-16 10:21 copyright.ini
-r-xr-xr-x root root 1745776 2019-10-16 10:21 font.ttf
-rwxrwxrwx root root 229 2019-10-16 10:21 game_type.ini
-rwxrwxrwx root root 2418 2011-01-01 08:45 games.ini
drwxrwxrwx root root 2019-10-16 10:20 help
-rwxrwxrwx root root 2116 2019-10-16 10:21 lock.ini
-rwxrwxrwx root root 1922 2019-10-16 10:21 strings.ini

 "games.ini" is list of default 20 games.
"lock.ini" is list of unlocked hidden 20 games.
if you want to get hidden list, type "cat lock.ini"

9.remount filesystem for modify.

root@snk:/mnt/vendor/res/local/Japanese # mount -o rw,remount /mnt/vendor

 10.make backup before mod

root@snk:/mnt/vendor/res/local/Japanese # cp games.ini games_org.ini

 11.combine "games.ini" and "lock.ini" , and write-out to "games_unlock.ini"

 

root@snk:/mnt/vendor/res/local/Japanese # cat games.ini lock.ini > games_unlock.ini

12.re-check file list.
root@snk:/mnt/vendor/res/local/Japanese # ls -la
-rwxrwxrwx root root 332 2019-10-16 10:21 copyright.ini
-r-xr-xr-x root root 1745776 2019-10-16 10:21 font.ttf
-rwxrwxrwx root root 229 2019-10-16 10:21 game_type.ini
-rwxrwxrwx root root 2418 2011-01-01 08:45 games.ini
-rwxrwxrwx root root 2418 2011-01-01 22:32 games_org.ini
-rwxrwxrwx root root 4534 2011-01-01 22:33 games_unlock.ini
drwxrwxrwx root root 2019-10-16 10:20 help
-rwxrwxrwx root root 2116 2019-10-16 10:21 lock.ini
-rwxrwxrwx root root 1922 2019-10-16 10:21 strings.ini

confirm "games_unlock.ini" size has sum of "games.ini" and "lock.ini" bytes.

12.Do MOD. overwrite "games.ini"

root@snk:/mnt/vendor/res/local/Japanese # cp games_unlock.ini games.ini

13.confirm  your filesystem

root@snk:/mnt/vendor/res/local/Japanese # ls -la
-rwxrwxrwx root root 332 2019-10-16 10:21 copyright.ini
-r-xr-xr-x root root 1745776 2019-10-16 10:21 font.ttf
-rwxrwxrwx root root 229 2019-10-16 10:21 game_type.ini
-rwxrwxrwx root root 4534 2011-01-01 22:33 games.ini
-rwxrwxrwx root root 2418 2011-01-01 22:32 games_org.ini
-rwxrwxrwx root root 4534 2011-01-01 22:33 games_unlock.ini
drwxrwxrwx root root 2019-10-16 10:20 help
-rwxrwxrwx root root 2116 2019-10-16 10:21 lock.ini
-rwxrwxrwx root root 1922 2019-10-16 10:21 strings.ini

 

14. reboot and ....

root@snk:/mnt/vendor/res/local/Japanese # reboot

40 games will be shown.
If your console is not Japanese region , some file's size must be difference.
But same operation will make your console be unlocked.

 

 

NEOGEO Arcade Stick Pro system update detail

NEOGEO ASP stock ui has mechanism for system update.

If on booting up, update.bin and update_desc.ini are placed on / of NAND,
update.bin has called with execv.

With placing "update.img" on USB stroage and insert to ASP , and select "System Update" will place these file onto NAND and reboot.

Next boot will run update working.

 

update.img is legacy zip format.

(it is some special , I could not make zip with WinZip,but open...)

f:id:honeylab:20200107100536p:plain

Update.img(zip) has least two files "[somedir]/update.bin" and "[somedir]/update_desc.ini".

And it must be set password "xugameplay-snk"

 

update.bin is normal ELF executable binary or any.

update_desc.ini likes below.

 #Template
[VERSION]=<v1.0>
[VERSION_CODE]=<1911180932>
[PUBLISH_TIME]=<2019.11.18>
[DESCRIPT]=<Do packed script which execute USB/command.sh>
[LAUNCHER_NAME]=<Honeylab World>
[LAUNCHER_PATH]=</mnt/data/honeylab/command>
[INJECT_PATH]=</mnt/data>
[CRC]=<2904145815>

This update_desc.ini is testing , but it will work with more test.

stock UI's "system update" supports not only game unlock but any works.

NEOGEO Arcade Stick Pro cdkey file format for game unlocking.

・Unlock CD-Key system

Vendor already provided CD-Key files for unlocking two Games.
cdkey zip is contain cdkey/[GAME_TITLE].cdk file.
This hexdumps are METAL_SLUG.cdk and METAL_SLUG2.cdk.

f:id:honeylab:20200105230043p:plain

44 bytes from start are id and check header.Their two cdk file are same binary .

First 4bytes little endian 32-bit is length of least bytes = 0x 00 00 01 28 = 296(dec) bytes.
Next 32bit int is count for something 4byte values : and values[0]=0x00000100

least 0x20 =32(dec)bytes is MD5 encoded data from some data.

 value is [ e3251075554389fe91d17a794861d47b ]

least 0x100 bytes are encrypted cdk file.

openssl can decrypt this data stream.

because stock executable contains a secret key for decrypt them.

f:id:honeylab:20200105231527p:plain

snk $ openssl rsautl -decrypt -inkey snk.pem -in encrypted.dat -out decrypted.dat
snk $ cat decrypted.dat
[SN_NO]=<FFFFFFFFFFFFFF>
[CDKEY]
[ID]=<27>
[NAME]=<mslug>
[CDKEY/]
[ENCRYPT]=<850b405b3dcdaa1543309ad09e1a7f76>

this stream make order unlocking "mslug ,ID 27" to stock system.

openssl can re-generate public key for encrypt cdk file.
so in logically , we can generate cdkey file for unlock other games.

 

 

第二回 技術書同人誌博覧会に出展します

gishohaku.dev

(技書博本編へ 11:00~13:59 に来場される場合には事前予約(無料)が必要です。 14:00 以降は予約なしで入場いただけます)

※予約時間帯は満員となっています。現時点で予約されていない方は14:00以降の入場とのことです。

サークルページはこちらです

gishohaku.dev

既刊2冊と新刊「メガドライブミニのひみつ」を頒布します。

Image
価格はいずれも¥1000となっています。

今回、子連れでの参加となるため予期せぬ早期店じまいや
休憩中座ががある可能性があります。

在庫全部数持ち込みではなく、なんとなくの数量を搬入します。
万が一現地で品切れの際は通販をご案内させていただきます。

 あらかじめご購入を検討の際には twitterなどで一声かけていただけると目安になりますのでご検討ください。

 

家庭の事情により次回の技術書典はお休みにしました。
もしblogの読者、Twitterのフォロワーさんいましたら是非お声がけください。

NEOGEO Arcade Stick ProのOSSソースコードが公開されました!

過去2回分の以下の記事でさんざん悪態をついたOSS非公開の件、
どうやら2回目の記事を書いたちょっとあとぐらいにリンクが変更され

https://github.com/xudarren/NeogeoASP_OSS

こちらのサイトでソースコードが公開されたようです。

記事で指摘した".s"がツリーに戻されていた件も是正され
正しいソースコードに修正されたようにも見えます。
LGPLであるQUIのソースもオブジェクトコードが公開されました。
まだ詳細未確認ですが、この件については一定の対応があったと考え
煽るような内容でソースの公開を迫った態度を若干反省し
ソースコード公開に関わった関係者の皆様に感謝します。

(※GPL宣言のあるソースが本当に著作権者のものであるかどうかって言う点の確認が足りなかったところなど、今後に活かしたいと思います。)

 

honeylab.hatenablog.jp

honeylab.hatenablog.jp

SNKによるNEOGEO Arcade Stick ProのGPL逃れ(解消されました!)の手口と彼らのミス

以下、https://github.com/xudarren/NeogeoASP_OSS の公開によりいったん打消し線扱いにします

 

 

honeylab.hatenablog.jp

 

前回の記事

honeylab.hatenablog.jp

の続編です。

相変わらずSNKは内蔵Linuxカーネルソースコードを公開していませんが、
前回ひっそりと公開された内蔵エミュレータソースコードと主張するものを分析してみたいと思います。

 

文章がクソ長くなってしまったので結論だけ先に書いておきます

 

公開された「エミュレータソースコード」は、
ASPで使用されているエミュレータソースコードではない」ということです。

これは、明確にGPLの要求する事項を満たしてはいません。

 

以下、その結論に至るまでの経緯です。

 

 

エミュレータ"mvsnjemu"のソースコードとして公開されたリポジトリはこちらです。

https://github.com/xugamezhouyuhua/neogeoaspemu

移植元の"NJEMU"のリポジトリの一つはこちらです。

https://github.com/phoe-nix/NJEMU

パッと見てみると、NJEMUの機能のうち、CPSなどの部分を取り除き、
名前の通りMVSのエミュレータとして機能を抽出したように見えますが…

 

まず、バイナリをビルドするためのMakefileを見てみます。

https://github.com/xugamezhouyuhua/neogeoaspemu/blob/master/Makefile

main関数のあるemumain.cや外部ライブラリ zlibなどのソースファイルは
拡張子".c"であるC言語のソースファイルを参照するようになっています。

しかし、エミュレータのコアに近い"mvs"フォルダや、
機種依存部分を記述したと思われる"elinux"フォルダの中にあるファイルは、
アセンブリ言語である".s"の拡張子を持ったファイルを使用するように記述されています。

https://github.com/xugamezhouyuhua/neogeoaspemu/blob/df0b7990066001b6a21b9270766d5cae5e60719d/Makefile#L47

ところが、この"mvs"フォルダには、移植・変更前と寸分違わぬ".c"ファイルも納められたままです。

f:id:honeylab:20191205145744p:plain

"biosmenu"の".s"ファイル

https://github.com/xugamezhouyuhua/neogeoaspemu/blob/master/src/mvs/biosmenu.s

"biosmenu"の".c"ファイル

https://github.com/xugamezhouyuhua/neogeoaspemu/blob/master/src/mvs/biosmenu.c

 

それなのに、Makefileからは参照が外されています。
通常、いわゆる「コンパイル」作業をすると".c"からアセンブリ言語".s"ファイル、objファイルなどを経由し、実行ファイルを生成します。
そのため、こういったソースツリーには中間生成物である".s"を含めないのが普通です。

上のリンクの.c と.sを見てみるとわかるように、C言語は通常人間が書くもので、いわゆるプログラミング言語の体を成しています。
しかし、コンパイラによって生成された.sファイルは簡単に読めるものではありません。(画像:アセンブリC言語の対比)

f:id:honeylab:20191205145246p:plain

 

それを逆手に取り、SNK(外注先)は、変更点を分かりにくくするため、元のC言語ファイルを手元に置き、修正したC言語ファイルをコンパイルしてできた

中間生成物の".s"ファイルのみをソースファイルと言い張ってソースツリーの中に戻したのです。


.sファイルは一から手で書くこともできますが、ここでツリーに挿入された.sファイルには、gccコンパイラ)によって生成されたものですよ、という注釈が取り除かれないまま残されています。

https://github.com/xugamezhouyuhua/neogeoaspemu/blob/df0b7990066001b6a21b9270766d5cae5e60719d/src/mvs/biosmenu.s#L460

f:id:honeylab:20191205145436p:plain

 

参照された"NJEMU"はPSP用として作られたようで、PSP用のSDKにしか存在しない関数を多数使用しています。しかし、その記述は.cの中にしか残っていません。
そのような機種依存部分と、自社の製品に合わせた変更を行った.cファイル(例えば"bios.c"ではエミュレータの使用中にBIOSファイル」を選択する機能無効化する変更が行われています。)は彼らの手の中にしかありません。

GPLを定義しているFSFのとしては、そのような行為は難読化と同等で、
ソース公開したとはみなさない、という主張もあります。
また、どうやら"NJEMU"では正常に動かなかったROMに対して、
自分たちの機械では動くように修正した部分などもあるようです。

f:id:honeylab:20191205150233p:plain

(画像:"Sengoku3"のROMを読み込んだ時に何らかのパッチを当てている部分)

 

もともと、彼らの(先祖の)機械をエミュレートした、という立場ではありますが、
主要部分をほとんど丸々コピーして使いつつ、都合の良いように改変して
それを秘密にし、還元しない、というのはOSSの考え方に対して
真っ向から砂をかけているようなものだと感じます。

さて、ここまでは難読化逆アセンブルソースをツリーに戻したという
精神的な反OSS行為に対する暴露でしたが、彼らは一つ(以上)ミスを残していました。

 

メイン関数があるemumain.c 、これに関してはソースコードや".s"ファイルをツリーに戻していません。mvsnjemuのemumain.cは以下のファイルですが、
https://github.com/xugamezhouyuhua/neogeoaspemu/blob/master/src/emumain.c

Arcade Stick Pro(ASP)にインストールされたmvsnjemuの実行ファイルを解析したところ、明らかに上記のコードとは違う動作をしていました。

main関数では、起動時のディレクトリをgetcwd関数で取得し、その文字列を加工してROMやキャッシュファイルの場所を決定するようになっていました。
しかし、ASPでは実行ファイルとROMのファイルの場所が大きく離れています。そのため、この部分を手っ取り早く固定文字列に変更する、という変更を加えていました。

以下のリンク先のソースコードは、"Ghidra"というツールを使用して、main関数を逆アセンブルしたものに注釈を書き加えたものです。

https://bitbucket.org/snippets/bakueikozo/8nMMAB

固定文字列をリソースとして使用してしまっているため、出力された実行ファイル内にもこの文字列は残ってしまっています。(下画像)

Image


このemumain.cをコンパイルして出力された.sファイルはなぜかツリーに戻されず、emumain.cにも変更が反映されていません。
もちろん、公開したとするリポジトリ内に"/mnt/"のような文字列は含まれていません。これは、ASP上で動かすためだけに必要な情報だからです。

 

つまり、公開された「エミュレータソースコード」は、
ASPで使用されているエミュレータソースコードではない」ということです。

これは、明確にGPLの要求する事項を満たしてはいません。


もはやSNKのサポートにメールを送ったところで個別に対応されるとは全く思っていませんが、彼らには、OSSの利用に対するルールとして、著作権情報の表示と必要なソースコードの提供を行ってくれることを切に希望します。

ところで、たまに私のことをGPL警察みたいに呼んでくれる人がいるみたいですが、
私はGPL警察でも何でもありません。大した権利者でもないし。


ただ、私はこのGPLの成果物が入った機械に払った金銭には、
このソースコードの分の価値が入っているはず、と信じて購入しているのです。
その分がついてこなかったので、ブーブー文句を言っているだけなのです。


この部分をきちんとしているゲームコンソール等のメーカーは、それをきちんと原価だと考えて対応しているはずです。
それを入れないまんま、うっぱらっておしまいなのは、
ちゃんとそれを原価に入れてるメーカーにケンカを売ってるんだと思うんですよね。

 

以上、ソースツリーの検証と手口の解析 おしまい。

 

(解消されました!)GPL違反状態になっていたNEOGEO Arcade Stick Proの解析情報

先ほど確認したところ、OSSソースコードリポジトリが公開されたようです。

以下、一旦打消し線扱いにします。

 

https://github.com/xudarren/NeogeoASP_OSS

 

honeylab.hatenablog.jp

 

先日発売され、分解していろいろ遊んでいる NEOGEO Arcade Stick Proですが、

(以前の記事を読んでいない方はこちらを先にお読みいただくとより詳しいです)

honeylab.hatenablog.jp

honeylab.hatenablog.jp


解析しているうちに、以下のソフトで構成されていることがわかっています。

・OS Linux 3.4.0+ (Android kernel for Actions semiconductor Soc ATM7029)

エミュレータ "mvsnjemu"

・ソフトウェア

 ・SNK_MAIN (ELF executable) (QUI_G1のローダ&アップデータ実行環境)

 ・QUI_G1 (ELF executable) (黄色いゲームメニューUI)

 ・そのほか 若干のシェルスクリプト

 

このうち、Linux 3.4.0は GPL v2のはずで、私の言葉でいうと「このソフトウェアのバイナリを受け取った者に対し、ソースコードの請求に応じる必要がある」ということになっています。これに応じない場合、いわゆるGPL違反」状態になります。

また、これらGPLのソフトウェアを使用していることおよび、その著作権表示を行わなければいけないことになっています。

 
(以下のリンクを参考にしています)

https://www.gnu.org/licenses/old-licenses/gpl-2.0-faq.ja.html#CompanyGPLCostsMoney

 

例えば、同様にLinuxを採用しているニンテンドークラシック ファミコンミニ などではこちらのサイトで紹介されているように、

www.banwanko.net

ゲーム内の「権利表記」から確認することができるようになっています。
使用しているライブラリのひとつひとつについて名前と著作権表示が行われているはずです。
また、任天堂の公式サイトで必要なソースコードの公開が行われています。

www.nintendo.co.jp

(公開、としていますが、必要なのは請求者に届けることです。公開のほうが簡単な場合、このような手段になることが多いです。)

 

NEOGEO Arcade Stick Proでは、少なくともLinuxに関してこのようなソースコードの公開(もしくは、使用したオリジナルのソースコードを入手できる場所の案内)及び、このような権利表記を行っていません。
それっぽい 以下のような表示は行われていますが、これはGPLのソフトウェアを使用している、ということだけを示していて、何の権利表記を満たしたものでもありません。

f:id:honeylab:20191202155513j:plain



よりによってGPLであることを明示しながら義務を果たしていません。
ぬけぬけと「使用許諾されている」と書いてありますが、
許諾すらされていないことになりかねません。

表の人だけではなく中の人がGPLに関して全く理解していない可能性さえあります。

 

加えて、エミュレータである "mvsnjemu"は、話によればGPLであるnjemuというエミュレータからのforkであるとの噂。別の製品であるNEOGEO miniでも使われているものとほぼ同様のようですが、機種依存周りは変更されているはずです。

このようなGPL問題はNEOGEO miniでも存在していたはずですが、Linuxソースコードは最終的に公開されていません。
また、エミュレータソースコードとされるものがしぶしぶ公開されましたが、
一部がcソースから生成されたobjの逆アセンブルであるなど、
なかなか悪質な状態のようでした。

(私はNEOGEO miniを所有していないので、請求する権利はありません。)

 

先日、上記の件を簡潔にまとめてSNKのサポートに連絡したところ、ホームページで公開する準備を始めた、とのことでまったり見ていました。

(以下送信した文面)

f:id:honeylab:20191202143657p:plain

これが11月15日のことです。

それから2週間ほど経った12月1日、ホームページを確認すると、

ページ下部に「オープンソースソフトウェア」の表示がありました。

f:id:honeylab:20191202143446p:plain

これをクリックしてみると

https://github.com/xugamezhouyuhua/neogeoaspemu

というそっけないgitリポジトリのページが開きました。
NEOGEO Miniの時と同じ対応のようです。

ほかのゲームコンソールのように、権利表記を行うこともなく、
中途半端にエミュレータソースコードを(しかも一部を逆アセンブラの出力に置き換えるという姑息な手段で)公開したところで、お茶を濁そうというのでしょうか。

SNKのサイトを見ると「ライセンス事業」ということで、自社保有のIPを提供した
各種事業を行っているようですが、
他人のIPは踏みにじっていくスタンスのようです。

https://www.snk-corp.co.jp/license/

 

ということで、本体を入手して割とすぐに解析していろんなことがわかってはいたものの、SNKにはSNKなりのゲームアンロックとか周辺機器発売とかのちょっとしたプランがあるんだろうと侍的に黙っていたのですが、わりとどうでもよくなりました。

 

だから全然売れてないんだよ。Twitterで検索しても全然情報がないんだけどwww

 

というわけで、追加の解析情報をぼちぼちとまとめていきたいと思います。

私が普段こういった機器を解析するときは、まず実行バイナリをstringsに書けるあたりからやっていくのですが、今回は趣向を変えて上に書いた"QUI_G1"をRetDecというオープンソースの逆コンパイラにかけてみることにしました。

forest.watch.impress.co.jp

このソフト、なかなかのメモリ喰いで、普段作業している人権のない4GBメモリのマシンでは途中終了してしまっていました。
仕方なく、メモリをかき集めて64GBのマシンを作ったところ、ようやく逆コンパイルができ、結構有用な情報を得ることができました。
(※逆コンパイルの権利について後に書きます)

コンパイルとは言いますが、こういった実行ファイルでは関数名などの情報が失われていることが普通です。そのため、関数名は単なるアドレス名に置き換えられます。

f:id:honeylab:20191202145440p:plain

この関数の中身を見てみると

// Address range: 0x194f6c - 0x194fa8
int32_t function_194f6c(int32_t a1, int32_t a2, int32_t a3, int32_t a4) {
    // 0x194f6c
    g_r3 = a4;
    g_r2 = a3;
    g_r1 = a2;
    g_r0 = a1;
    int32_t v1 = g_r3; // 0x194f6c
    int32_t v2 = g_r5; // 0x194f6c
    int32_t v3 = g_r1; // 0x194f70
    g_r3 = v3;
    g_r4 = v3;
    uint32_t v4 = *(int32_t *)(v3 - 4); // 0x194f78
    g_r2 = v4;
    int32_t v5 = g_r0; // 0x194f7c
    g_r5 = v5;
    int32_t v6; // 0x194f98
    int32_t v7; // 0x194f90
    if (v4 >= 0) {
        // 0x194f88
        g_r0 = v3;
        g_r0 = function_194e04(v3);
        v7 = g_r1;
        g_r3 = v7;
        v6 = g_r5;
    } else {
        v6 = v5;
        v7 = v3;
    }
    int32_t v8 = *(int32_t *)(v7 - 12); // 0x194f94
    g_r1 = v8;
    g_r0 = v6;
    *(int32_t *)v6 = v8 + v7;
    g_r3 = v1;
    g_r5 = v2;
    return g_r0;
}

 

 こんな感じで、果たして何をしているのかわからないことがほとんどです。
しかし、ちょっとした手掛かりをもとに少しずつ関数を解析していきます。

今回、"QUI_G1"と"SNK_MAIN"はSDLを使用していそうだ、ということがざっくりとした解析からわかっていました。
そのため、"SDL"という文字列を検索してみます。

すると、例えば以下のような部分が見つかります。


// Address range: 0xe609c - 0xe6114
int32_t function_e609c(void) {
    int32_t v1 = g_r4; // bp-8
    int32_t v2 = &v1; // 0xe60a0
    g_r1 = (int32_t)"/dev/fb0";
    g_r2 = (int32_t)"/dev/fb/0";
    g_r3 = 0;
    g_r0 = (int32_t)"SDL_FBDEV";
    int32_t v3 = func_getenv("SDL_FBDEV", (int32_t)"/dev/fb0", (int32_t)"/dev/fb/0", 0); // 0xe60b4
    g_r0 = v3;
    g_r1 = v2;
    int32_t v4 = v3 == 0 ? 4 : 0;
    g_r3 = v4;
    int32_t v5 = v4 + v2; // 0xe60c8
    g_r2 = v5;
    int32_t v6 = *(int32_t *)(v5 - 16); // 0xe60d0
    g_r0 = v6;
    if (v6 == 0) {
        // 0xe610c
        return 0;
    }
    // 0xe60dc
    g_r4 = g_sp + v4;
    g_r1 = 2;
    g_r2 = 0;
    int32_t v7 = func_SYS_open(v6, 2, 0, v4); // 0xe60f8204
    g_r0 = v7;
    int32_t v8; // 0xe60f8
    if (v7 >= 0) {
        v8 = v7;
      lab_0xe6104:
        // 0xe6104
        function_160d30(v8, 2);
        g_r0 = 1;
        // 0xe610c
        return 1;

※(func_getenvとfunc_SYS_openは私がほかの部分を解析して置換したものです)

"SDL_FBDEV"という文字列リソースなどが見つかります。
このような文字列の手がかりや、システムコール呼び出しなどを手掛かりに、関数名を少しずつ置換していきます。

        g_r7 = 5;
        __asm_svc(0); // SYS_open     

このようなコードがあった場合、システムコール5番のopenが呼ばれている、ということです。これが含まれる関数は、ファイルなどを開いている可能性が高いです。

 

最終的に、"QUI_G1"には、zlibやlibpngなどもあわせてリンクされていることがわかりました。zlib,libpngのライセンスは"zlib"ライセンスですので

https://ja.wikipedia.org/wiki/Zlib_License

著作権表示の義務はありません(結構表示している機器はありますが)

しかし、SDLはどうでしょう。

https://ja.wikipedia.org/wiki/SDL

ファミコンミニやプレステクラシックなどではSDL2というSDLの後継ライブラリが使用されていました。
SDLのバージョン2はzlibライセンスであり、ソースコードの公開や著作権表示の義務はありません。
しかし、SDL(バージョン1)についてはLGPLというライセンスになり、一定の義務のもとライセンスされることになっています。

https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License

簡潔にまとめると

・動的リンクなら何もする必要なし

・静的リンクなら、オブジェクトコード等、ライブラリの別のバージョンとリンクするための仕組みを提供する必要がある

著作権者情報の表示

などの義務があります。

私にとっては、ここまでデタラメなことをしたメーカーが嫌な思いをした方が面白いため、この実行ファイルがSDLバージョン1を使用している、という可能性について調査しました。すると、同様のSDL関連の部分で"SDL_CDROM"などの環境変数を参照していることがわかりました。SDLの1→2の移行の際に、ネイティブCD-ROMのサポートの打ち切りがあることは既知のことでした。

例えば

    function_10502c("Invalid starting track", v8, a3, v16);

に含まれるこの"Invalid ending frame for track"という文字列は、SDL_cdrom.cに含まれますが、このファイルはSDL1にしか存在しません。

f:id:honeylab:20191202153000p:plain

その他、上記の文字列も明らかにSDL_cdrom.cに含まれるものです。

参考: https://github.com/turican0/dosbox-x-remc2/blob/master/vs2015/sdl/src/cdrom/SDL_cdrom.c

かりにSDL2とSDL1が混在していたとしても、このファイル内に明確にLGPLの宣言があります。

そのほか、類似の手がかりを探していきました。

そのような断片をつなぎ合わせ、さらに添付されたエミュレータ"mvsnjemu"は明確にSDLバージョン1を使用していて、改めて別のライブラリを開発環境に入れるだろうか、ということなどからも、この二つの実行ファイルはやはりSDLバージョン1を使用していて、静的リンクされている、という強い確信を持っています。

その場合、『LGPLv2.1第6節またはLGPLv3第4項の条項により、「顧客(カスタマー)自身の利用のための改変ならびにそのような改変をデバッグするためのリバースエンジニアリング」を許諾する必要がある』という規約から、このようなリバースエンジニアリングはライセンス上禁止することができない(Wikipediaより)、という状態にあるということです。

一部のゲーム機などでは、ソフトウェアEULAなどでリバースエンジニアリングの禁止を条件にしたりすることがあり、そのような場合(仮に実際には行っていたとしても)このようなメーカーが権利を持っていそうな部分を解析した結果を公開することはあまりしていませんでした。しかし、あまりにもSNKがデタラメなので、こちらはこちらでリバースエンジニアリングして遊んでいきたいと思います。

 

(※配布元がLGPLを謳っていないのに、こっちがそうだといって通るかどうかとかいうことは私にはわかりません。しかし、契約で明確に禁止されていないものをやったところで、ということもありはしますが、それでも日本のお国柄、あんまり派手にとっちらかすとメーカー以外のところからあれやこれや言われて嫌な気分になるのでほどほどにしておきますが…)

 

ということで、SNKのあまりにもデタラメな対応のせいで
GPL違反状態になっているNEOGEO Arcade Stick Proの解析情報パート1でした
(長い…)

 

(ライセンス周りについて、間違いや勘違いがある可能性がありますので、見つけた方は是非指摘してください)

 

続きを書きました

honeylab.hatenablog.jp