SMALI ファイル形式とは?
.smali ファイルには、人間が読める形式の Dalvik または ART バイトコード(Android アプリケーションコードのアセンブリ言語表現)が含まれています。smali および baksmali という名前は、アイスランド語でアセンブラと逆アセンブラを意味します。これらのツールは 2010 年に Ben Gruver (JesusFreke) 氏によって作成され、現在は Google によってメンテナンスされています。
Android の .apk が apktool または baksmali を使用して展開されると、.dex ファイル内のコンパイル済みクラスがそれぞれ個別の .smali ファイルとして抽出されます。構文では、.class、.super、.implements ディレクティブでクラスのメタデータを宣言し、.field でフィールドを、.method....end method ブロック内でメソッドを宣言します。個々の Dalvik オペコード(invoke-virtual、move-result、return-void など)は、名前付きレジスタ(v0、v1、p0 など)を操作します。
.smali ファイルは主に Android のリバースエンジニアリング、セキュリティ研究、CTF(Capture The Flag)チャレンジで使用されます。一般的なワークフローは、apktool d で APK を展開し、.smali ソースを編集して動作をパッチし、apktool b で再パッケージ化して再署名するというものです。これらは中間的な逆アセンブル成果物であり、通常の Android ユーザーが生の .smali ファイルに遭遇することはありません。
各 .smali ファイルは、匿名内部クラス(個別のファイルとして表示されます)を含め、正確に 1 つのクラスに対応します。使用可能なオペコードは Android の API レベルによって異なり、それは .dex フォーマットのバージョン(例:Android 5 の場合は 035、Android 12 以降の場合は 039)に反映されます。
セキュリティと安全性
リスク: MEDIUM.smali ファイル自体はプレーンテキストであり、エディタで表示してもシステムに害を及ぼすことはありません。リスクは文脈に依存します。 1. 不審な APK を逆アセンブルした場合、.smali ファイルはその挙動を明らかにします。難読化された文字列、動的なコード読み込み (DexClassLoader)、不審なホストへのネットワークコールがないか確認してください。 2. APK にパッチを当てて配布用に再署名することは、アプリの利用規約や、一部の管轄区域では著作権法に抵触する可能性があります。個人利用は一般的に認められていますが、再配布は認められません。 3. 未知のソースから .smali の「パッチ」をダウンロードする場合は、実行可能コードと同様に扱い、適用前に内容を確認してください。
形式の詳細
概要SMALI ファイルを開くプログラム
技術的詳細
詳細仕様| 開発者 | Ben Gruver (JesusFreke) 氏(原作者)。現在は Google がメンテナンス(baksmali/smali v3 以降) |
| ファイルタイプ | プレーンテキストで人間が読める形式の Dalvik/ART バイトコードアセンブリ |
| エンコーディング | UTF-8 |
| 名前の由来 | smali と baksmali はアイスランド語でアセンブラと逆アセンブラを意味します |
| 1クラスにつき1ファイル | 各 `.smali` ファイルは、匿名内部クラスを含め、正確に 1 つの Java または Kotlin クラスに対応します |
| コンパイル済みの対応形式 | `.dex` (Dalvik Executable) - `.smali` はその逆アセンブルされた人間が読める表現です |
| 一般的なサイズ | 1ファイルあたり 1 KB ~ 200 KB。複雑な Android アプリでは数千の `.smali` ファイルが生成されます |
| レジスタ構文 | ローカルレジスタ: `v0`, `v1`, ...、パラメータレジスタ: `p0`, `p1`, ...(インスタンスメソッドでは `p0` が `this`) |
| オペコードのバージョン管理 | `.dex` フォーマットのバージョンに依存: 035 (Android 5-6), 037 (Android 7), 038 (Android 8-11), 039 (Android 12+) |
| 標準的なワークフロー | APK → `baksmali` 逆アセンブル → `.smali` 編集 → `smali` アセンブル → 再パッケージ化 APK(再署名が必要) |
| ツールの統合 | `apktool` は APK の逆アセンブルと再構築のために内部で `smali`/`baksmali` を使用しています |
| 主なユースケース | Android リバースエンジニアリング、アプリのパッチ適用、セキュリティ脆弱性の調査、CTF チャレンジ |
| リリース日 | 2010 (baksmali 1.0 by Ben Gruver/JesusFreke) |
| 最新バージョン | smali/baksmali 3.x (Google-maintained as of 2024) |
| 仕様書 | github.com |
SMALI の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。SMALI ファイルについて最初の質問をしてみましょう。