某スマホゲーのデータを抽出する方法

スポンサーリンク

今回は結構グレーな記事です。

リバースエンジニアリングは規約で禁止されています。この記事内の記述を実行した事によるいかなる損害も補償しません。すべて自己責任の元で行って下さい。というか、「指揮官、こんなことしちゃだめだぞ…」(CV.堀籠沙耶)
また悪用は厳禁です。課金アイテムを扱いたいならダイヤ購入もお忘れなくにゃ

やりたいこと

「これが君の望んでいる海戦(ロマン)」でお馴染みの某スマホゲーから持ってきたデータを復号して画像やL2DをGETし鑑賞。
もちろんGETした画像を配布するのはNG。あと課金アイテムの場合はちゃんと課金しよね。

準備

まずは準備だけど前提としてPCは必須。スマホオンリーでは(多分)無理。持ってない人は買うか回れ右。OSはwin10を前提とするけど、win7やwin8でも出来るかもしれない。というか多分出来る。OS XとLinuxも出来るかも。

とりあえず前提として以下のソフトをインストールしてあるものとする。

  • NoxPlayer
  • Python 3.x
  • pip
  • visual studio
  • Live2D Cubism

エミュレータだがこれはBlueStacksでもおk。データを持ってくるだけだからなんならAndroidスマホでも良い。データはapk内やスマホ内のfiles/AssetBundlesの中にある。これがどこにあるかは、、、頑張って探して下さい。多分すぐ見つかると思われ。見つけたらAssetBundlesごとPC内の適当な場所に放り込む。
Pythonはここからダウンロード。インストールの仕方はググって。(私が使ったのは3.7.2)
pipはここを参考にインストール。(もしかしたらPython 3インストール時に一緒にインストールされてるかも)
visual studioは適当にググってインストールして。
Live2D Cubismは公式からDLしてインストールするだけ。

以上で準備終了。

L2D抽出

11/01更新
ツールが古くなったためこちらを使用。

使い方は旧ツールと一緒なので下記をUnityLive2DExtractorに置き換えればおk。

まずはツールをダウンロード。
AzurLaneLive2DExtract(以下L2DE)

適当に保存して解凍する。AzurLaneLive2DExtract.slnが見つけられると思うのでダブルクリックで実行。visual studioが立ち上がるので、Any CPUの左をReleaseにしてビルド>AzurLaneLive2DExtractのビルドを実行。L2DE-master/L2DE/bin/Release/L2DE.exeが出力されればおk。(L2DEは省略した記述)

持ってきたデータのAssetBundles/live2d内のファイルをL2DE.exeにドラッグ&ドロップ。するとコマンドラインにログが表示され最後にDone!と書かれていたら復号完了。フォルダごと突っ込んでも処理してくれないのでそこは注意。コマンドラインはエンターキーを押すと終了出来る。
※〇〇_textureは差し替えテクスチャのみなので単体ではL2Dデータとしての復号は不可。

出力ファイルはlive2d/live2d内にフォルダごとに分かれて出力される。後はmoc3ファイルをLive2D Cubism Viewerで開いて鑑賞するなり、Unityに突っ込んで遊んだり個人使用の範疇で楽しみましょう。

追記:フォルダ名を大陸版から英語版に変換する

追記:2019/11/06

上記の方法でlive2dを出力すると画像のように大陸版のフォルダ名で出力されてどのフォルダがどの艦に該当するかわからない。

そこでこのフォルダ名を英語版に翻訳することにする。(日本語版にしないのは辞書がない関係上。日本語辞書をcsv形式で作れば日本語に変換することもできる。日本語辞書を作るとは言ってない国語(漢字)-英語-日本語辞書を作成するプログラムは作りました。詳しくはこっちの記事で。これを利用したファイル名変換は時間があるときに作ります。)

準備。
まずは辞書をダウンロードする。辞書はこちらのAzurLaneSDViewerから借りてくる。ダウンロードしたら適当な場所に解凍する。
もうひとつ極簡単なToolをここに公開したのでAL_DIRNAME_TRANSLATE.zipをDLして適当な場所に解凍する。(readmeに書いたがこのツールを実行して起こったことの責任は取れないのでそこんとこよろ)
Toolではnumpyをimportするので予め導入しておく。コマンドプロンプトを開いて以下のコマンドを入力するだけでおk。

pip install numpy

 

こっから作業。
解凍したAzurLaneSDViewer-gh-pagesのAzurLaneSDViewer-gh-pages/jsの中にあるcharData.jsをコピーして、ToolのAL_txt2csv.pyと同じ階層にペーストする。
AL_txt2csv.pyをダブルクリックして実行(ないしはコマンドプロンプトから実行)するとcharData.csvが作成される。これを辞書として使うことになるので、一度生成すれば元のcharData.jsが更新されない限り再度生成する必要はない。自分で辞書を更新する場合は、メモ帳等から「,」で区切って辞書データを追加したりExcelから追加したりして良い。
次にもう一つのAL_dirname_ch2en.pyをダブルクリックで実行する。「enter path.」と表示されるのでLive2Dを出力したフォルダのパスを入力する。上手く行けばフォルダ名が翻訳される。ただし辞書にないフォルダは「元のフォルダ名_ch」としてフォルダ名が変更されるので、手動で修正してあげよう。
最終的にこんな感じになればおk。

画像抽出

欲しい画像はおそらくローディング画像、SDのKANSEN画像、KANSEN画像の3種でしょうきっと。
これらはそれぞれloadingbg、shipmodels、paintingの中に入っている。故にこの3つのフォルダをどこか分かりやすい場所に放り込んでおく。

loadingbg shipmodelsの場合

まずはここからAssetStudioをダウンロードする。ただし、またビルドをするのは面倒だと思われるのでビルド済みのものをダウンロードすれば良い。

AssetStudioGUI.exeを起動し、File>Load Folderからloadingbgまたはshipmodelsを選択する。すると読み込み始めるので暫し待つ。読み込み終わったらExports > All assetsで出力する。
出力は元フォルダ内のSprite、Texture2Dフォルダの中にpng形式でアウトプットされる。

なおローディング画面の画質は、Twitterから見つけた画像のが良かったりする。なんでやねん。

paintingの場合

こちらはloadingbg、shipmodelsと比べるとちょっと複雑。
まずはloadingbg、shipmodelsと同じようにしてAssetStudioでpng画像を出力。しかしこの画像はパズルのように各要素がバラバラに配置されてしまっている。よってそれを修正してやる必要がある。

 

そのためにAzurLane-PaintingExtractを使うことになるが、これの導入が結構面倒なのでひとつひとつ解説していく。

 

まずはAzurLane-PaintingExtractをここからDLする。
とりあえずこれまでのようにどこかに放り込んで解凍しておく。

次にこのアプリケーションを使うための準備をする。
コマンドプロンプトを起動して

python --version

と入力し、pythonのバージョンが3以上なのを確認したら、

pip install pit

でpitをインストール。同様にwxpython, pywin32もインストールする。

pip install wxpython
pip install pywin32

これでAzurLane-PaintingExtractを動かすためのライブラリ等を導入できた。(導入できてない場合はコマンドプロンプトから実行してあげると、「~が見つかりません」とか「~が定義されてません」という旨のエラーが吐かれるのでファイル名でググってライブラリを見つけインストールしてあげればおk。もしわからなければページ下部のコメントに書いてくれたら(気がついたときに分かる範囲で)答えます。)

次に先程解凍したAzurLane-PaintingExtractのフォルダ内部にあるAzurLanePaintingExtract.pyをダブルクリックで起動。するとウィンドウがポップアップする。
左上、アイコンの下にある文件をクリックし

 

先程出力したTexture2DフォルダとMeshフォルダ内のファイルを全て選択し読み込ませる。この際Shift+左クリックで全選択すると楽。Texture2DフォルダについてはUISpriteも一緒に読み込ませてしまって問題ない。

 

ファイルを選択したら文件の下のひし形アイコンをクリックすると次のようなウィンドウがポップするので、1でタブを選択し、2で出力先を決定し、3をクリックする。

 

下の画像のようになんとか度:100%となったら出力が完了。選択したフォルダ内にある碧蓝航线-导出というフォルダに出力が格納される。

 

追記1:音声・音楽ファイル抽出

アz…某スマホゲーをプレイしたことがあるのならば、音声・音楽ファイルの大部分はapk内ではなく別途data内に追加DLをしていることを知っているはずである。したがって音声ファイルを抽出したい場合はapkと追加データの両方を持ってくる必要がある。
apkはスマートフォンから抽出してもよいが、それよりはapkpure.comから直接PCにダウンロードしてくる方が遥かに楽。DLしている間に追加データの方から/files/AssetBundles/cueを適当な場所に放り込んでおく。

apkがダウンロードできたら拡張子をzipにして解凍。obbファイルが出力されるのでこれも解凍。(解凍は7zipが楽。)解凍したフォルダの中には色々データが入っているが、assets/AssetBundles/cueに目当てのものが纏まっている。ただし拡張子はbとなっている。この時点で音声データはapk、追加ファイル分全てをまとめてしまうと楽かもしれない。

このままでは音声ファイルとして聞けないのでbファイルを変換する。まずはhcaという拡張子に変換したいのでBGMToolboxを使う。ここからDLできる。

DLしたらVGMToolbox.exeを実行。以下の画像の用にCRI ACB/AWB Archive Extractorを選択したらファイルを全部投げ込む。ファイルごとにフォルダが出力されたらおk。

 

次はhcaファイルをwavに変換する。ツールはDereToreを使う。DLをはここ
この際ビルドしてもいいが、面倒ならば、説明内のNightly Buildからビルド済みのものを持って来ると楽。
※コメントにてご指摘がありましたが、11/14現在DereToreのNightly Buildがダウンロードできなくなっています。したがってここから直接hca2wavをダウンロードしてコンパイルするか、私がコンパイルしたものをこちらからDLして下さい。
またUTF-8でない環境では文字化けが発生するそうなので、PowerShellにて

chcp

で、現在のコードページをメモっておき

chcp 65001

からUTF-8に変更して下さい。終わったら同様にして戻してかまいません。(メモるの忘れちゃったって人は932に変更すればおそらくもとに戻ります。)

さて、このツールで複合するにはキーが必要。キーはaキーとbキーがあり、ここから見つけられる。//でコメントアウトされた16進数表記のうち、前半分がbキーで後ろ半分がaキーである。つまりaキーは9~2までの8桁、bキーは0~Eまでの8桁がそれぞれ該当する。これをメモっておく。

windows powershellを起動。

cd E:\azurlane_extraction\data\20190527\cue\cue

でディクトリ を移動。ただし移動先はcueフォルダのある場所で、人それぞれ違うので書き換えること。
次に以下のコマンドでhcaをコンバートし、サブディレクトリ内にwavを出力する。hogehogeはさっき見つけたキーに、hca2wav.exeは環境にあったパスにそれぞれ書き換えること。

Get-ChildItem -Recurse -filter "*.hca" | % {
 E:\azurlane_extraction\tool\deretore-toolkit-latest\Release\hca2wav.exe -a hogehoge -b hogehoge $_.FullName
}

全部を出力するには暫く時間がかかるので暫し待つ。私は寝た。

出力は得られたもののファイルツリーがぐちゃぐちゃなので整理する。

同じフォルダに一括配置する場合

まずは音声ファイルを同じフォルダ内に一括で置く場合。
Powershellで次のコマンドを実行する。

$src = "E:\azurlane_extraction\data\20190527\cue\cue"
$dest = "E:\azurlane_extraction\data\20190527\cue\cue\audio_output"
$num = 1

Get-ChildItem -Path $src -Filter *.wav -Recurse | ForEach-Object {
    $nextName = Join-Path -Path $dest -ChildPath $_.name
    while(Test-Path -Path $nextName){
       $nextName = Join-Path $dest ($_.BaseName + "_$num" + $_.Extension)    
       $num += 1   
    }
    $_ | Move-Item -Destination $nextName
}

$srcは音声ファイル入っているサブフォルダを配下に持つ親のフォルダ。
$dest出力フォルダ。

ファイル名+数字のファイルを出力できる。

 

フォルダごとに分けて出力する場合

Powershellで次のコマンドを実行する。

$src = "E:\azurlane_extraction\data\20190527\cue\cue"
$dest = "E:\azurlane_extraction\data\20190527\cue\cue\audio_output"
$List = (Get-ChildItem -Path $src -Filter *.wav -Recurse).FullName
foreach($a in $List){
    $name =Split-Path -Leaf $a
    $uppertDir0 = (Split-Path -Parent $a)
    $uppertDir1 = (Split-Path -Parent $uppertDir0)
    $uppertDir2 = (Split-Path -Parent $uppertDir1)
    $Dname = Split-Path -Leaf $uppertDir2
    $Dname = $Dname.Replace('_vgmt_acb_ext_', '')
    $nextName = Join-Path $dest -ChildPath $Dname | Join-Path -ChildPath $name
    if(!(Test-Path -Path (Join-Path $dest -ChildPath $Dname))){
	New-Item -Path (Join-Path $dest -ChildPath $Dname) -ItemType Directory
    }
    Move-Item $a $nextName
}

さっきと同じく、$srcは音声ファイル入っているサブフォルダを配下に持つ親のフォルダ、$destは出力フォルダ。

フォルダごとに整理できている。

 

あとはwavをmp3に変換するなり自分で聞くなりご自由に。もちろん配布はNG。

 

追記2:データ差分を取る

よく考えたらファイラの更新日時でソートしてやればいいやん…

無駄なの

某スマホゲーでは追加データが毎週アプデごとに追加されていくが、古いデータがapkに格納されることは(滅多に)ない。ということは上記の手順では毎週全データを再度復号することになる。それは非常にアホらしいので、ファイル名の差分を取り、更新されたデータだけを復号出来るようにする。差分はpowershellで以下のスクリプトを使って取れば良い。

$new = "E:\azurlane_extraction\data\20190530\Azurlane\live2d"
$old = "E:\azurlane_extraction\data\20190527\live2d"
$out = "E:\azurlane_extraction\data\live2d"
$num = 1
$List0 = (Get-ChildItem -Path $new).FullName
foreach($a in $List0){
	$namea =Split-Path -Leaf $a
	$num = 0
	$List1 = (Get-ChildItem -Path $old).FullName
	foreach($b in $List1){
		$nameb =Split-Path -Leaf $b
		if($namea -eq $nameb){
			$num = 0
			break
		}
		else{
		$num = 1
		}
	}
	if($num -eq 1){
		$nextName = Join-Path $out -ChildPath $namea
		cp $a $nextName
	}
}

newは更新後データのフォルダのパス、oldは古いデータ(1週間前)のフォルダのパスに書き換える。outはもちろん出力先。
またGet-ChildItemに-Recurseオプションを追加すればサブディレクトリまで検索してくれる。毎週全データの差分を取ったりするなら-Recurseオプションを使ったほうが良い。

追記3:OPを抽出

11/13追記
10月末から始まった大型イベントのポイント稼ぎが一段落したころ、そいえば今回流れたオープニングを保存してないことに気が付いた。このオープニングを保存したけれども、画面キャプチャだとなんだかなってなったので、今度はOPを抽出します。

まず目的のファイルを持ってきます。こいつはずばりそのままopeningという名前で、AssetBundles/uiの中に入ってました。
このopeningを例によって例のごとくAssetStudioで分離します。出力できるファイルの中でop_zh.txtというファイルが目当てのファイルなのでこれを確保します。
このop_zhをバイナリエディタで見てやると、以下の画像のようにusmという拡張子の動画ファイルであことが推察できます。

このままvgmtoolboxで通常の動画プレーヤで再生可能なファイル取り出したいところですが、残念暗号化されていて再生可能なファイルにはなりません。幸いにも(というか当然)暗号鍵は音声ファイルで使用したものと共通で使えるので、この鍵を使って復号します。
復号に使うツールは「CRID(.usm)分離ツール」で、こいつは製作者が公開してないっぽい?ですがツール名でググると二次配布されたものを見つけられます。自己責任で探してダウンロードしてきて下さい。

CRID(.usm)分離ツールを解凍して、crid.exeと同じ階層にop_zh.txtを投げ込みます。
次にコマンドプロンプトを起動してcdでカレントディレクトリをcrid.exeのあるディレクトリに指定します。(Cドライブ以外の場合は/dオプション使わないとディレクトリを変更できないので注意)
変更したらば

crid.exe -a hogehoge -b hogehoge -o "出力フォルダ名" "op_zh.txt"

で復号を実行します。(hogehogeは暗号鍵)
「op_zh.txt を分離中…」と表示された実行が終了して、出力フォルダ名の中にm2vとwavが入っていたら成功です。
ただしこのツールは分離ツールなので音声と動画が分離されてしまっています。視聴するにはMPC-HCを使ったり、予めaviutil等編集ソフトで合成する必要があります。

最後に

ツールが揃っているおかげでかなり簡単に簡単にデータをぶっこ抜ける環境が整っている。しかし、環境が整っているからと言って気軽にやって良いわけではない。規約的にはおそらくアウトであり、当然法的にも問題となる可能性のあるかもしれない行為である。そんなわけでオススメ出来る行為ではないが、「どうしても俺はやりたいんだ!」って人は頑張れ。
ちなみにジャベリンの乳首テクスチャが埋もれてた。開発なにやってだ。

コメント

  1. DareToreのNightly Buildのリンク先が存在していないようです。deretore-toolkit-latest.zipを別リンクで入手できるようにしていただくことは可能ですか?

タイトルとURLをコピーしました