honeylab's blog

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

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


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

 

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