今回は結構グレーな記事です。
リバースエンジニアリングは規約で禁止されています。この記事内の記述を実行した事によるいかなる損害も保障しません。すべて自己責任の元で行って下さい。というか、「指揮官、こんなことしちゃだめだぞ…」(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抽出
まずはツールをダウンロード。
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に突っ込んで遊んだり個人使用の範疇で楽しみましょう。
画像抽出
欲しい画像はおそらくローディング画像、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を動かすためのライブラリ等を導入できた。
次に先程解凍した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に変換する。ツールはDareToreを使う。DLをはここ。
この際ビルドしてもいいが、面倒ならば、説明内のNightly Buildからビルド済みのものを持って来ると楽。
さて、このツールで複合するにはキーが必要。キーは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オプションを使ったほうが良い。
最後に
ツールが揃っているおかげでかなり簡単に簡単にデータをぶっこ抜ける環境が整っている。しかし、環境が整っているからと言って気軽にやって良いわけではない。規約的にはおそらくアウトであり、当然法的にも問題となる可能性のあるかもしれない行為である。そんなわけでオススメ出来る行為ではないが、「どうしても俺はやりたいんだ!」って人は頑張れ。
ちなみにジャベリンの乳首テクスチャが埋もれてた。開発なにやってだ。
コメント