
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 対応のオートコンプリートドロップダウン付きメインビューのウォークスルー — サムネイルをクリックするとフルサイズで表示されます。
逆アセンブル一覧 色分けされたオペランド、制御フロー矢印、インラインの解決済み文字列リテラル |
制御フローグラフ 点線の条件付きエッジとルーティングされたマルチランクレーンを備えた関数ごとの CFG |
DEX 呼び出しグラフ ホバーで呼び出し先を展開、クリックでメソッドの smali にジャンプ |
セクションマップ概要 セクションサイズに応じた比例バー。クリックで一覧 / 16 進ビューにジャンプ |
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/main/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/main/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'