はじめに
今回はAssetStudioというツールを利用して、AssetBundleを抽出&解析してみるという記事になります。

あんまり深く掘っていくとグレーな予感がしてきますが、逆に開発者にとってもこういった危険性があるのだと認識していただければ幸いです。
またAsset Studioの利用は全て自己責任でお願いします。悪用はしないようにしてください。
概要
AssetStudioは以下のように説明されています。
None of the repo, the tool, nor the repo owner is affiliated with, or sponsored or authorized by, Unity Technologies or its affiliates.
AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.
AssetStudioはAssetやAssetBundlesを探索・抽出・エクスポートするためのツールです。
またUnity Technologiesと一切関係ないよと強調されていましたね。
対応しているUnityのバージョンは3.4 ~ 2021.2らしいです。
Support version:
3.4 - 2021.2
加えて対応しているアセットの種類は以下の通りで、結構幅広いですね。
Support asset types:
Texture2D : convert to png, tga, jpeg, bmp
Sprite : crop Texture2D to png, tga, jpeg, bmp
AudioClip : mp3, ogg, wav, m4a, fsb. support convert FSB file to WAV(PCM)
Font : ttf, otf
Mesh : obj
TextAsset
Shader
MovieTexture
VideoClip
MonoBehaviour : json
Animator : export to FBX file with bound AnimationClip
環境
Windows10
Unity 2020.3.32f1
AssetStudio.net472.v0.16.40
インストール
以下のReleaseページから一番新しいzipファイル(私の場合はAssetStudio.net472.v0.16.40.zip)をダウンロードして、解凍します。
github.com
下準備
解析するためのAssetBundleを生成します。
まずは実験対象として以下のファイルを用意しました。
- Animation Clip
- Audio Clip (mp3)
- Text Asset (json, txt)
- Video Clip (mp4)
- Shader
- Texture2D, Sprite (png)

後はビルドを行います。
public class CreateAssetBundles { [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { string assetBundleDirectory = "Assets/AssetBundles"; if(!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); } BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } }
ビルドされたファイル群
AssetBundles |--- AssetBundles |--- AssetBundles.manifest |--- sample |--- sample.manifest
最後にWindows StandAloneでビルドを行いました。
使い方
AssetStudioGUI.exeを起動します。

左上のFile/Load file(Load folderなら中のファイルを全部走査してくれる)を選択し、対象のAsset Bundleを選択します。

ちなみにローカルからAssetBundleを読み込む実装をしている場合には、たいていStreamingAssetsの中にAssetBundleが含まれています。
// Windows StandAloneの場合 . |--- ○○_Data |--- StreamingAssets |--- AssetBundles |--- AssetBundles.manifest |--- sample |--- sample.manifest
このsampleをLoadしてみると・・・。

ちゃんと中身が見れていますね。画像のプレビューとかは分かりますが、なんならAudioClipの再生機能までありました。
また上記の方法でAssetBundleを生成するとLZMA形式の圧縮がされていたはずですが、普通に見れるようです。
対象ファイルをエクスポート
対象のファイルを選択し、Export/All assetを押すことでエクスポートすることができます。



ひとこと
今回はローカルにあるAssetBundleを対象としていましたが、サーバーからダウンロードするタイプでもいくらでも中身を見る手法はあります。
あんまり書くと怒られそうですが、リモートからダウンロードしたAssetBundleは結局ローカルに保存されることが多いですし、なんならダウンロード先のURLを調べることができればAssetBundleを取ってこれます。
またURLから予想して、まだ正式に公開されていないAssetBundleを・・・なんてことも不可能ではありません。
逆に開発者側の視点に立つならば、URLを予想できないようにしたり、AssetBundleの中身を暗号化 or AssetBundle自体を暗号化するなどの対策が考えられます。