honeylab's blog

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

(解消されました!)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