
Glass - 高速かつ無料のIDA Pro代替品
透明で滑らか、という意味です
高速でネイティブな、モバイルアプリ最優先のインタラクティブディスアセンブラ。Android / iOS リバースエンジニアリングのワークフローにおける IDA Pro の精神的な後継であり、以下を中心に構築されています:
smali — APK / DEX / smali 処理用armv8-encode — AArch64 および ARMv7 (A32 / Thumb) 用 — ネイティブ .so、iOS Mach-Ogpui (Zed) — GPU アクセラレーションによるネイティブ UI 用redb — コンテンツアドレス型永続化用rquickjs — スクリプト可能なプラグイン用 (計画中)ライセンス: GPL-3.0-only (smali から継承)。
私たちは皆 IDA Pro を使ったことがあります。リバースエンジニアリングの業界標準であり、長年にわたるプラグインの蓄積がありますが、遅く、高価で、時代遅れです。Glass は 100% Rust ネイティブで、流れるような操作を実現する GPU アクセラレーション UI を備えています。また 100% 無料のオープンソースです — ぜひコントリビュートしてください。
arm64-v8a と armeabi-v7a の両コピーが 1 回のクエリで検索されます)。マスキング + ギャップ対応のバイトパターン文法、AArch64 および ARMv7 用の型付きアセンブリ文法、ISA 対応のオートコンプリートドロップダウン付きメインビューのウォークスルー — サムネイルをクリックするとフルサイズで表示されます。
Glass が GUI で行うすべての解析は、構造化 JSON を出力する CLI 動詞としても公開されています。同じ glass バイナリが自動化のエントリポイントです — サブコマンドを選択するだけで、ワンショットでスクリプト可能な結果が得られ、jq パイプラインや CI に最適です。```sh
glass classes ./app.apk --package com.example. --text
glass callers ./libfoo.so --artifact libfoo.so --symbol "glass::main"
onCreate across DEX, machine-readable:glass search ./app.apk onCreate | jq '.data.hits[] | select(.kind=="method")'
glass types ./app.ipa --kind swift-class --text
glass type ./app.ipa --artifact app --name blackjack.ContentView
人間が読める形式にするには `--text` を渡し、JSON の場合は省略します。
完全なリファレンス: **[docs/cli-api.md](https://github.com/azw413/glass/blob/HEAD/docs/cli-api.md)**。
つまり、一般的な操作をスクリプト化して自動化できます。
## スキルと MCP
CLI のすべての動詞は、組み込みの MCP(Model Context Protocol)サーバーを通じてツールとしても公開されているため、MCP 対応のホスト — Claude Desktop、Cursor、Zed、独自のクライアント — は Glass を直接操作して、リバースエンジニアリングのタスクを支援できます。```sh
# Print the machine-readable skill catalog (one JSON object listing
# every verb with its schema and an example invocation).
glass skills
# Run as an MCP stdio server. Plug into any MCP host's tool list.
glass mcp
Claude Desktop に登録するには、Glass を ~/Library/Application Support/Claude/claude_desktop_config.json に追加します:```json
{
"mcpServers": {
"glass": { "command": "/usr/local/bin/glass", "args": ["mcp"] }
}
}
The model can then call `inspect`, `symbols`, `disasm`, `cfg-of`, `dex-callers`, `search` and every other verb on any bundle you point it at. Tool results come back as the same JSON envelope you'd get from the CLI.
モデルは、指定した任意のバンドルに対して `inspect`、`symbols`、`disasm`、`cfg-of`、`dex-callers`、`search` など、すべての動詞を呼び出すことができます。ツールの結果は、CLI から得られるものと同じ JSON エンベロープで返されます。
## 検索
3つの補完的なエンジンはすべて、GUI の同じ ⌘F パレットから、また CLI / MCP 動詞として利用できます。
### 全文検索
バンドル全体にわたるファジーマッチで、ネイティブシンボル、DEX クラス / メソッド / フィールド、コードおよびデータセクション内の文字列リテラルを対象とします。入力に応じてライブフィルタリングされ、結果は適切なビューに振り分けられます(ネイティブアドレスにはリスト表示、DEX ターゲットには smali ビューア、データヒットには16進ビュー)。インデックスはロード後にバックグラウンドスレッドで構築され — 処理中は進行状況チップが表示されます。```sh
glass search ./app.apk onCreate # all things named like "onCreate"
glass search ./libfoo.so init --limit 20
CLI リファレンス: search 動詞(docs/cli-api.md 内).
バイトレベルのパターンエンジン。各アトムは、2文字の16進マスク(c0、e?、?f、??)またはギャップ(* = 0..=32 バイト、*(min..max) は明示的な範囲)です。マッチはセクションをまたぎません。GUIパレットでは、⌘2 でバイナリモードに切り替わり、Code only チェックボックス(デフォルトでオン)がスキャンをテキストセクションに制限するため、命令の形状を探すときにデータヒットに埋もれることはありません。```sh
mov w0, #1 ; retglass bin-search ./libfoo.so --artifact libfoo.so --pattern '20 00 80 52 c0 03 5f d6'
glass bin-search ./libfoo.so --artifact libfoo.so --pattern '?? ?? ?? 9? ?? ?? 4? 91'
glass bin-search ./libfoo.so --artifact libfoo.so --pattern 'de ad be ef'
完全な文法と動作例: [`docs/BinSearch.md`](https://github.com/azw413/glass/blob/HEAD/docs/BinSearch.md)。
### 命令検索
アセンブリを記述すると、Glass がバイト列にコンパイルします。`;` 区切りのシーケンスは、[armv8-encode](https://github.com/azw413/armv8-encode) によってエンコードされます — **AArch64**(`mov w0, #1`、`adrp x1, *`)および **ARMv7** の両モード(Thumb の `mov r1, r7` / `bxeq lr` / `push {r4-r7, lr}` と A32)。ワイルドカードは、バイトエンジンが処理を引き継ぐ前に、オペランドのビットマスクに変換されます。スキャンはグローバルです — バンドル内のすべてのネイティブアーティファクトが、対応する ISA のアトムを取得します(`arm64-v8a` と `armeabi-v7a` の両方のライブラリを持つ Android アプリは、単一のクエリで検索されます)。
GUI の Binary モードでは、⌘B で **Bytes** と **Asm** の文法を切り替えられます。ISA を認識するオートコンプリートドロップダウンには、入力した内容に一致するバリアントが表示されます — `r1` は AArch64 の候補を除外し、`w0` は ARMv7 の候補を除外します。
ワイルドカード:
| トークン | 意味 |
|---|---|
| `*` | 任意のオペランド(種類は選択されたオペコードから推測される) |
| `#*` | 任意の即値(オペコードピッカーへのヒント) |
| `x`, `w` | 任意の AArch64 X クラスまたは W クラスのレジスタ |
| `r` | 任意の ARMv7 GPR(`r0..r15`、`sp`、`lr`、`pc`) |
| `<*>`, `<X>`, `<W>`, `<R>`, `<imm>` | 括弧付きの等価表現。他の構文内にネストする場合に便利(`[x, #*]`、`[r, #*]`) |```sh
# AArch64 — every `mov w0, #N` (any N)
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'mov w0, #*'
# AArch64 — any ADRP into x1 followed immediately by ADD into the same reg
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'adrp x1, * ; add x1, x1, #*'
# ARMv7 (Thumb) — `mov r1, r*` followed by a return
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'mov r1, r* ; bx lr'
# ARMv7 (any cond) — conditional bx in literal-pool callers
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'bxeq lr'
# every `ret x30` — concrete, no wildcards
glass insn-search ./libfoo.so --artifact libfoo.so --pattern 'ret'
レスポンスは、コンパイルされたマスクを示す bytes_hex を保持します(例: adrp x1, * の場合は 01/1f ?? ?? 90/9f)。これにより、どのビットが固定され、どのビットがワイルドカードかを正確に確認できます。キャプチャ(パターン内の後続の同じオペランドを相互参照する <name:kind>)は設計済みですが、まだ実装されていません。
完全な設計とフェーズ分け: docs/InsnPattern.md。CLI/MCP リファレンス: docs/cli-api.md 内の insn-search。
Glass は現在、AArch64 および 32 ビット ARMv7(armeabi-v7a ライブラリ、A32 + Thumb)をターゲットとする Android(APK / DEX / ネイティブ .so)および iOS(IPA / Mach-O)アプリのリバースエンジニアリングに利用できます。
ファイル読み込み
.apk, .aab)、iOS バンドル(.ipa)、または任意のスタンドアロン ELF / Mach-O バイナリ(.so, .dylib、生の実行ファイル)を直接開くことができます — Glass がフォーマットを自動検出します。arm64e が優先され、プレーンな arm64 がフォールバックです。バンドルでもスタンドアロンファイルでも動作します(例: glass gui /usr/lib/dyld)。libfoo.so(または 2 つの IPA に含まれる同じ libswiftCore.dylib)は解析状態を共有します。smali 経由でデコード)。iOS — IPA / Mach-O
Payload/*.app/ を見つけ、Info.plist を解析し、内部の任意の fat バイナリから arm64 / arm64e スライスを選択します。Frameworks/*.framework + *.dylib がそれぞれ独立したネイティブアーティファクトとして読み込まれ、Android の .so ファイルと同じ Overview + セクションごとの逆アセンブリビューが使用されます。__objc_classlist から取得した Objective-C クラスブラウザ — クラス、カテゴリ、メソッド、ivar、プロパティ — デマングルされた名前(レガシーな _TtC... Swift マングリングを含む)と、メソッドアドレスからリスティングへのクリック可能なジャンプを備えています。__swift5_types から取得した Swift タイプブラウザ — クラス、構造体、列挙型とそのフィールド、および(クラスの場合)vtable が表示され、こちらもリスティングにクリック可能です。Android — APK / DEX / ネイティブ
lib/<abi>/ 配下のネイティブ .so ファイルが ABI ごとに読み込まれます。AArch64(arm64-v8a)と ARMv7(armeabi-v7a)の両方に完全な逆アセンブリビューが提供されます。他の ABI(x86 / x86_64)は、デコーダが登場するまで hex ビューにルーティングされます。編集
r1 と入力すると ARMv7 のバリアントのみが表示され、w0 と入力すると AArch64 のみが表示されます。AArch64 ネイティブ(ELF + thin Mach-O)
.eh_frame FDE、および合成された <name>@plt エントリからマージされたシンボルマップ。C++/Rust/Swift のデマングリングは symbolic-demangle 経由。adrp + add/ldr のペアはデータターゲットに解決され、インラインのコメントとして表示される文字列リテラルも含まれます。ARMv7 ネイティブ(ELF)
00 00 パディングなし)、32 ビット Thumb-2 と A32 は 4 バイトを表示します。.eh_frame、および合成された <name>@plt エントリ(12 バイトスタブ)。movw + movt 融合: movw R, #lo16 ; movt R, #hi16 が命令ペア間で検出され、解決された 32 ビット定数には movt 行に ; "..." の rodata 文字列コメントが付けられます。ldr Rt, [pc, #imm] リテラルプールロードは、AArch64 の ADRP+ADD パスと同じ種類のインライン文字列コメントのために、rodata への 1 レベルの逆参照を行います。UI
change me は changeMessage と change_me_count を見つけますが、dispatchMenuVisibilityChanged は見つけません)。arm64-v8a + armeabi-v7a を含む Android アプリでは、一致ごとにアーティファクト + セクションがラベル付けされた統合結果が得られます。redb に永続化され、再起動すると中断した場所から再開されます。embedded.mobileprovision の解析。resources.arsc の解析が必要になります)。r0, lsl #2)やプリ / ポストインデックスメモリ([rN, #imm]!, [rN], #imm)は解析されますが、具体的な場合のみです — ブラケット内のワイルドカードはありません。Glass は macOS 13+(プライマリターゲット、Metal 経由で GPU アクセラレーション — 追加の SDK は不要で、Metal フレームワークは OS に同梱)、Linux(gpui_linux 経由の X11 または Wayland、Vulkan バックエンド)、および Windows 10/11(gpui 経由の Direct3D バックエンド、MSVC ツールチェーンでビルド)で動作します。
Releases には macOS 用のビルド済みバイナリがありますが、ソースからビルドする必要がある場合: 良い知らせは、2 つのコマンドだけであることです。
This pulls in libxkbcommon-dev, the Wayland and XCB headers, Vulkan, ALSA, and the rest of the toolchain gpui_linux needs to link. Without these the build fails at link time with missing xkbcommon / wayland-client symbols.
これにより、libxkbcommon-dev、Wayland および XCB ヘッダー、Vulkan、ALSA、そして gpui_linux がリンクするために必要なその他のツールチェーンが取り込まれます。これらがないと、ビルドはリンク時に xkbcommon / wayland-client のシンボルが見つからず失敗します。
If you'd rather not run the script, the equivalent packages on Debian / Ubuntu (amd64) are:
スクリプトを実行したくない場合は、Debian / Ubuntu (amd64) の同等パッケージは次のとおりです。 ```sh
sudo apt-get update && sudo apt-get install -y
build-essential clang cmake pkg-config
libfontconfig-dev libfreetype-dev
libwayland-dev libxkbcommon-x11-dev
libasound2-dev libvulkan-dev
libzstd-dev libsqlite3-dev libssl-dev
libglib2.0-dev
`libfontconfig-dev` が不足している場合、依存関係のビルドスクリプトの初期段階でビルドが失敗し(`fontconfig was not found in the pkg-config search path`)、その後、X11/Wayland/Vulkan ライブラリのリンク時にも失敗します。Frida ドライバーが Linux では GLib を動的にリンクするため、`libglib2.0-dev` が必要です(macOS では Frida devkit が静的にバンドルします)— これがないと `undefined symbol: g_object_unref` でリンクが失敗します。
**Windows のみ — ネイティブビルドツールチェーンをインストールしてください。** `gpui` は MSVC ツールチェーンを必要とします(GNU/MinGW ターゲットはサポートされていません)。[winget](https://learn.microsoft.com/windows/package-manager/winget/) を使用する場合: ```powershell
# 1. MSVC compiler, linker, and Windows SDK (the "Desktop development with C++" workload).
winget install --id Microsoft.VisualStudio.2022.BuildTools `
--override "--quiet --wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"
# 2. CMake — tree-sitter (via the Zed `language` crates) builds wasmtime's C API with it.
winget install --id Kitware.CMake
# 3. LLVM/Clang — `bindgen` (frida-sys, gpui, media) needs libclang.dll.
winget install --id LLVM.LLVM
LLVM インストーラーは PATH に自身を追加しません。そのため、ビルド前に bindgen が libclang.dll を指すように設定してください(システム → 環境変数 で恒久的に設定するか、シェルごとに設定してください): ```powershell
$env:LIBCLANG_PATH = "C:\Program Files\LLVM\bin"
これらがないと、依存関係のビルドスクリプトでビルドが失敗します: `linker 'link.exe' not found` (MSVC がない場合)、`failed to spawn 'cmake'` (CMake がない場合)、または `Unable to find libclang` (`LIBCLANG_PATH` がない場合)。`glass` バイナリのスタック予約領域は MSVC 上で自動的に拡大されます (`crates/glass-cli/build.rs` を参照)。そのため、CLI が Windows の小さな既定のメインスレッドスタックをオーバーフローすることはありません — 操作は不要です。
3. **クローンとビルド**: ```sh
git clone https://github.com/azw413/Glass.git
cd glass
cargo build --release -p glass-cli
cp target/release/glass <to somewhere on your PATH>
The first build will compile gpui and friends and will take several minutes. Subsequent builds are fast.
最初のビルドは gpui とその関連をコンパイルするため、数分かかります。以降のビルドは高速です。
実行する: ```sh
glass ~/path/to/app.apk glass ~/path/to/app.ipa
glass ~/path/to/libfoo.so glass ~/path/to/libBar.dylib glass /usr/lib/dyld
glass
glass bundle ~/path/to/app.apk
glass db-dump ~/path/to/app.apk
常にリリースビルドを使用してください — デバッグビルドは逆アセンブルが桁違いに遅くなります。
.app バンドルのパッケージングFinder からダブルクリックで起動できるように、リリースバイナリを Glass.app バンドルにラップするには:```sh cargo build --release -p glass-cli ./packaging/make-app.sh open dist/Glass.app
このバンドルはアドホック署名(Developer ID 署名・公証なし)のため、初回起動時に macOS は開くことを拒否します。右クリック → **開く** で Gatekeeper を一度だけ迂回できます。
ローカルでビルドせずにプリビルド zip を取得する方法は 2 つあります:
- **最新の `main`** — プッシュのたびに `Glass-app-<sha>.zip` が 14 日間保持されるワークフローアーティファクトとしてアップロードされます。[Actions タブ](https://github.com/azw413/Glass/actions) から取得してください。
- **タグ付きリリース** — `v*` タグ(例: `v0.1.0`)をプッシュすると同じワークフローが実行され、さらに `Glass-<tag>-macOS.zip` が自動生成されたリリースノート付きで [Releases ページ](https://github.com/azw413/Glass/releases) に公開されます。
## Workspace
| Crate | Purpose |
|------------------|------------------------------------------------------------------|
| `glass-core` | 共有型(`CodeKind`、ID) |
| `glass-arch-arm` | AArch64 + ARMv7 逆アセンブル、シンボルマップ、PLT 合成、デマングリング |
| `glass-arch-dex` | `smali` 上に構築された DEX / smali ファサード |
| `glass-mobile` | APK + IPA バンドルの読み込み、ネイティブライブラリ抽出、マニフェスト |
| `glass-db` | コンテンツアドレス方式の永続化(redb): バンドル、タブ、設定 |
| `glass-device` | Android(adb)+ iOS(usbmux)デバイス検出 |
| `glass-api` | 解析動詞(検索、xrefs、CFG、編集)。CLI + MCP + GUI で共有 |
| `glass-ui` | `gpui` フロントエンド: ツリー、リスト、hex、マニフェスト、パレット |
| `glass-cli` | ヘッドレスインスペクタ + GUI ランチャー |
| `glass-mcp` | すべての CLI 動詞をツールとして公開する MCP サーバー |
| `glass-script` | QuickJS プラグインランタイム(プレースホルダー) |
## Roadmap
- **iOS のさらなる深掘り** — Entitlements と `embedded.mobileprovision` の解析。(ObjC `__objc_classlist` と Swift `__swift5_types` メタデータパスは実装済み — `glass types` / `glass type` を参照。)
- **x86 / x86_64** — Android `.so` ファイルのエミュレータビルド向け逆アセンブル。
- **内部スクリプティング** — 解析パスのための安定した API を備えた QuickJS プラグインホスト。
- **高度な機能** — 署名付き APK の再構築、ARMv7 インプレース編集におけるダウンストリームシフト(2→4 バイトへの拡張が拒否される代わりに隣接コードを越えてスプライス可能)。
逆アセンブル一覧 色分けされたオペランド、制御フロー矢印、インラインの解決済み文字列リテラル |
制御フローグラフ 点線の条件付きエッジとルーティングされたマルチランクレーンを備えた関数ごとの CFG |
DEX 呼び出しグラフ ホバーで呼び出し先を展開、クリックでメソッドの smali にジャンプ |
セクションマップ概要 セクションサイズに応じた比例バー。クリックで一覧 / 16 進ビューにジャンプ |