Every App Is Open Source について
Every App Is Open Source(EAOS)は、Ghidraを使ってエージェントがコンパイル済みプログラムを調べるMCPサーバーで、Apple Silicon搭載Macでのネイティブ解析を対象とします。簡潔な結果に加え、追跡可能でハッシュ検証済みの証拠を示し、事実・計算結果・推測を区別します。
主な機能
- 01Ghidraによるネイティブ解析
- 02関数の検索と調査
- 03静的な呼び出し関係の追跡
- 04ハッシュ検証済みの保存証拠
- 05アプリの一覧取得とJavaScript調査
活用シーン
- 01コンパイル済みプログラムの関数調査
- 02範囲を限定した静的呼び出し関係の追跡
- 03証拠に基づくエージェントの結論検証
- 04調査対象となるアプリコンポーネントの一覧化
MCP 対応
MCPサーバーは、検索、調査、メモリ読み取り、証拠取得などのプログラム解析ツールを公開します。利用可能なツール数はセッションによって異なり、ネイティブファイルでは8種類、アプリディレクトリでは11種類です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Every App Is Open Source
AI エージェントにコンパイル済みプログラムを渡すと、どのように構築されているかを解明します。逆コンパイルは Ghidra が行います。これはエージェント側の仕組みです。MCP ツールを少数に絞り、デフォルトでは簡潔に回答し、バイナリまでたどれる証拠を提供します。
この名前は挑発的なものであり、ライセンスを意味するものではありません。アプリの仕組みがわかっても、それをコピーする権利が得られるわけではありません。免責事項をお読みください。
使用例
EAOS のみに接続したエージェントに、小さなコンパイル済みプログラムを渡し、quote(6) が何を返すか尋ねました。以下は実際のツール呼び出しです。
| ツール呼び出し | 返された内容 |
|---|---|
search {"kind":"functions","pattern":"quote"} | 0x100000460 にある _quote |
inspect {"addresses":["100000460"],"mode":"all"} | アセンブリと逆コンパイルされたコード。証拠 fe8589bb… として保存 |
read_evidence {"id":"fe8589bb…"} | ハッシュ検証済みの保存された証拠 |
回答は 45 でした。4 未満の場合は 19、それ以外の場合は 7*n + 3 を返すと、アドレスと証拠 ID を引用しながら説明しました。
これは、すでに解析済みのキャッシュを使ったバージョン 0.1.1 の記録済みセッションの一例であり、ベンチマークではありません。完全なトランスクリプトには、すべての呼び出しとその制限が記載されています。
比較
REA および GhidraMCP と、変更を加えた3つのプログラムで比較しました。それぞれのツールで同じモデルと質問を使用しています。結果は対象によって異なり、EAOS が常に優れているわけではありません。
| 対象 | EAOS のバージョン | GhidraMCP との比較 | REA との比較 |
|---|---|---|---|
| 変更を加えた Doom | 0.1.0 | 16% 安く、17% 高速。18/18 件すべて正解 | 36% 安く、27% 高速。18/18 件すべて正解 |
| 変更を加えた Ollama | 0.1.4 | 28% 高く、23% 低速。GhidraMCP は195件中3件を見落としました | 14% 安く、17% 高速。どちらも195/195件正解 |
| 変更を加えた Ollama、第2ラウンド | 0.1.5 | 6% 安く、所要時間はほぼ同じ | 25% 安く、所要時間はほぼ同じ |
コストは API 換算のモデルコストで、所要時間には初期解析を含みません。各行はツールごとに3回実行した結果であり、一般的な順位を示すものではなく、説明のための結果です。第2ラウンドで他のツールが見落としたケースの大半は、ヘッダーの順序と不完全なエラーテキストであり、動作の誤りではありません。変更を加えたプログラムと解答は非公開にしているため、テスト結果が漏れることはありません。そのため、すべての実行サマリー、採点レビュー、プロトコルは確認できますが、これらの比較をそのまま再現することはできません。すべての数値、損失、制限事項は BENCHMARKS.md に記載されています。
最初の結果を得る
この手順は 0.2.0 を対象としています。公開前は、パッケージ要件の代わりに、レビュー済みのローカルホイールのパスを使用してください。
Apple Silicon 搭載 Mac、uv、および Apple の Command Line Tools(xcode-select --install)が必要です。Windows、Linux、Intel 搭載 Mac はまだサポートされていません。
1. インストールします。 チェックサムで固定された Java と Ghidra をダウンロード(約770 MB)し、公式ダウンロードには含まれていない Ghidra の Apple Silicon 用デコンパイラーをビルドします。
uvx --python 3.13 --from every-app-is-open-source==0.2.0 eaos setup
すべてのファイルは ~/Library/Application Support/Every App Is Open Source/ に保存されます。シェルのプロファイル、システムの Java、エージェントの設定には影響しません。バージョン、サイズ、トラブルシューティング、アンインストールについては、SETUP.md を参照してください。
2. 小さなテストプログラムをビルドして解析します。
mkdir -p /tmp/eaos-example
cat > /tmp/eaos-example/example.c <<'C'
#include <stdio.h>
__attribute__((noinline)) int quote(int n) { return n < 4 ? 19 : n * 7 + 3; }
int main(int argc, char **argv) { puts("eaos fixture anchor"); return quote(argc); }
C
clang -O0 /tmp/eaos-example/example.c -o /tmp/eaos-example/example
uvx --python 3.13 --from every-app-is-open-source==0.2.0 eaos call /tmp/eaos-example/example open_program
classification: computed、ARM64 言語、SHA-256、証拠 ID が表示されるはずです。
3. エージェントを接続します。 Claude Code の場合:
claude mcp add --transport stdio --scope local eaos -- uvx --python 3.13 --from every-app-is-open-source==0.2.0 eaos mcp /tmp/eaos-example/example
Codex およびその他の MCP クライアントについては、CLIENTS.md を参照してください。
4. 次のように質問します。
quote 関数を見つけてください。quote(6) は何を返しますか?両方の分岐を説明し、関数のアドレスと保存済みの証拠を引用してください。
正解は 45 です。これはセットアップが機能していることを確認するもので、エージェントがあらゆるアプリを理解できることを証明するものではありません。アドレスはコンパイラーによって異なるため、上記の例とは異なります。
スタンドアロンプログラムの場合は、同じ eaos mcp /absolute/path/to/program コマンドを使用します。アプリケーションディレクトリの場合は、明示的な外部ワークスペースを指定して、そのルートを選択します。
uvx --python 3.13 --from every-app-is-open-source==0.2.0 eaos mcp /Applications/Example.app --workspace /absolute/path/outside-bundles/eaos-workspace
エージェントに、ルートの一覧を作成し、返された ID でネイティブコンポーネントを1つ選択してから、そのコンポーネントを調べるよう依頼してください。完全なネイティブ解析がデフォルトであり、クイックモードはオプトインです。バンドル内の個別の実行ファイルパスは引き続き拒否されます。スタンドアロン解析を行うには、実行ファイルをコピーしてください。大きなスタンドアロンプログラムでは、エージェントを接続する前にターミナルでの事前解析を完了できます。
ツール
以前の24回のテスト実行でエージェントが行った呼び出しをもとに、最初は7つのツールから始めました。ネイティブファイルのセッションでは、現在、範囲を限定した静的呼び出しトラバーサルを含む8つのツールが利用できます。アプリケーションディレクトリのセッションでは、インベントリ、明示的なコンポーネント選択、範囲を限定したJavaScript調査が加わり、11個のツールが利用できます。
| ツール | 機能 |
|---|---|
open_program | プログラムの概要:アーキテクチャ、メモリレイアウト、解析ステータス |
search | プログラム内のテキストとその使用箇所、または関数を検索します |
inspect | 逆コンパイル済みコード、生の命令、呼び出し元と呼び出し先を調べます |
read_memory | 静的メモリまたはGo文字列テーブルを、来歴情報とともに読み取ります |
calculate | エージェントが暗算せずに済むよう、安全な算術演算とバイト列のデコードを行います |
decode_swift_string | Appleプラットフォーム上のSwiftコードに隠されたテキストを復元します |
read_evidence | 返信の根拠となった保存済み証拠をすべて取得し、ハッシュを検証します |
trace_calls | 範囲を限定して静的な呼び出し元/呼び出し先の関係をたどり、間接エッジと打ち切り箇所を未解決として保持します |
アプリケーションディレクトリのセッションでは、次のツールも利用できます。
| ツール | 機能 |
|---|---|
inventory_application | 選択したルートと対応するASARメンバーを、明示的な欠落箇所と予算とともにインベントリ化します |
select_component | インベントリ化したネイティブコンポーネントを1つ取得し、元のバンドル外で選択します |
inspect_javascript | 取得したJavaScriptソースを調べます。開発プロファイルでは、焦点を絞ったプリロード/モジュール調査と、範囲を限定した証拠関係の確認も利用できます |
0.2.0では、1 MiBのソースに限られていた0.1.9の初期JavaScript/ASAR調査を拡張しました。
0.2.0のソースプロファイルは、整合性のある最大8 MiBのJavaScriptキャプチャに対応し、明示的に範囲を限定した構文インデックスの継続処理と、固定サイズの結果ページを備えています。観測されたプリロードAPIを1つに絞り、選択したモジュールまたはその周囲のローダースケルトンを調べてから、選択した保存済み証拠を簡潔なソース関係パックにまとめられます。すべての候補は、コンポーネント、ソース、テーブル、証拠の識別情報を保持し、不明なバインディングは明示されます。Pythonパーサーの依存関係はパッケージに含まれており、JavaScriptやアプリケーションは実行されません。
公式のElectron Fiddle 0.39.0では、記録された開発チェックで大規模なバンドルを調査し、選択されたソースノード60個、条件付きモジュール検索候補6個、保持された限定的なプリロード関係3個を生成しました。完全なメインプロセスIPCエッジは確立されていません。動的なファクトリー置換、ローダー/相互運用の識別情報、継承されたディスパッチ、プロセスコンテキストは未解決のままです。これらはローカルでの静的チェックであり、比較ベンチマークでも、エージェントが信頼できる回答を行えるかのテストでもありません。別途実施した範囲限定のGhosttyトレースでも、Swift/C/Zigの完全なリロードチェーンは確立されませんでした。Electronの完全なサポート、再構築されたアプリケーション、REAとの同等性は確立されていません。
ネイティブトラバーサルでは、準備されていないクイックモード候補についても、利用可能な名前を保持します。ただし、命令本体を準備したり、欠落している関係を確立したりするものではありません。完全なネイティブ解析が引き続きデフォルトです。
各ツールの正確な入力、出力、制限については、ツールの仕様を参照してください。
すべてのツール結果には、その内容が明記されます
各ツールの結果には、次のラベルが付いています。
- fact:取得したバイナリまたはソースから直接読み取った情報です
- computed:逆コンパイル済みコードやデコードされた文字列など、そこから算出した情報です
- guess:検証されていない推論です
逆コンパイル済みコードは算出されたものであり、元のソースではありません。解析に成功した結果には、read_evidenceで取得できる保存済み証拠が含まれます。ステータス応答とエラーには証拠IDは含まれません。ツールの失敗は、解析に関する主張を示すものではありません。
これらのラベルが示すのはツールの結果であり、エージェントの最終回答ではありません。正しくラベル付けされた証拠でも、エージェントが読み違えることはあります。ラベルと証拠IDを使えば結論を確認できますが、結論が正しいと保証されるわけではありません。
一度解析して、再利用する
Ghidra の解析には時間がかかるため、スタンドアロンプログラムごとに、そのすぐ隣にある eaos-analysis/<sha256>/ フォルダーに、解析済みプロジェクトと証拠を保存します。互換性のある現行バージョンのプロファイルを再度開くと再利用されますが、エンジン、アーキテクチャ、解析プロファイルが異なる場合は、新たに解析が必要になることがあります。アプリケーションディレクトリのキャプチャとネイティブキャッシュは、明示的に指定した外部ワークスペースに保存されます。0.1.7 より前に作成されたプロジェクトは保持されますが、再利用されません。0.1.7 では新しいキャッシュ形式でプログラムを再解析します。
各セッションでは、ハッシュ計算の対象となった正確なバイト列の読み取り専用コピーを使用するため、元のファイルを変更しても、すでに開いているセッションには影響しません。キャッシュされたプロジェクトがプログラムのハッシュと一致しない場合、推測で処理を続けずに停止し、古い証拠を削除することもありません。
Ghidra には一つ注意点があります。.cache のように、名前がドットで始まるフォルダー内にはプロジェクトを作成できません。解析するプログラムは、そのようなフォルダーの外に置いてください。
解析オプション
デフォルトでは完全な解析を行います。CLI と MCP サーバーでは、メタデータの一部取得と関数リクエストの準備を行う --analysis-mode quick と、Mach-O のスライスを明示する --architecture arm64 を指定できます。クイック関数検索では、表示範囲に応じた結果のページネーションとは別に、明示的な範囲指定付きのインデックス継続が利用できます。クイックモードの対象は 64 ビット ARM/x86 Mach-O に限られ、すべての Swift 名を復元するものではなく、参照が見つからないことの証明にもなりません。速度や精度の新たな比較は行っていません。
Apple Silicon では、互換性のあるユニバーサル入力が自動的に ARM64 として選択されます。キャプチャした各ファイル全体のハッシュごとに、profiles/ の下にアーキテクチャ/プロファイル/エンジン別のキャッシュが保持され、変更されない証拠は共有されます。旧プロジェクトは保持されますが、新しいキャッシュ形式では再利用されません。ネイティブ操作の実行中もステータスを確認でき、期限とキャンセルを設定できます。これらのオプションを使用する前に、セットアップとツールの仕様を参照してください。
ベンチマークの実施方法
概要は上記に、詳細は BENCHMARKS.md にあります。対象ごとに 1 行で記載し、それぞれの実行概要と採点にリンクしています。
ルールは毎回同じです。
- 同じモデルを使い、セッションを新規作成して、ツールごとに 3 回実行します。
- 質問と解答は最初の実行前に確定します。 モデルが答えを暗記している可能性がある場合は、秘密裏に答えを変更してから、プログラムを再ビルドします。
- 同じ条件で開始します。 すべてのツールで、計測開始前にプログラムの解析を済ませておきます。
- REA は、バンドルされたスキルと完全なツールカタログを含め、実際のインストール方法で実行します。
- 負けたラウンドも含め、すべて記録に残します。
非公開の対象と解答を使っているため、同じ比較を正確に再現することはできません。ベンチマークガイドを使えば、ご自身の対象で同じ方法を試せます。
今後の予定
現時点では、Apple Silicon 搭載 Mac 上のネイティブプログラムを解析し、選択したルートのインベントリと、JavaScript/ASAR の初期段階の部分検査を行います。より多くの種類のソフトウェアを検査できるようにしたいと考えていますが、決まった順序やスケジュールはありません。新たなサポートは、必要性が実証され、再現可能なテストがある場合に追加し、それぞれについて何かを主張する前に独自のベンチマークを実施します。
セキュリティ
ツールが公開するのは、選択したプログラム、または明示的に選択したアプリケーションのルートとコンポーネント、およびそれらから生成された証拠です。汎用のファイル読み取りツールやシェルツールはありません。ただし、Python と Java のプロセスは OS によってサンドボックス化されていません。お使いのユーザー権限で実行され、バイナリから復元されたテキストは信頼できないものです。信頼できないものを解析する前に、セキュリティモデルをお読みください。
脆弱性を見つけましたか? 公開の Issue ではなく、非公開で報告してください。
開発
uv build
PYTHONPATH=src uv run --no-project --python 3.13 python -m unittest discover -s tests -v
python3 scripts/check_distribution.py dist
各チェックの実行場所:
| チェック | 実行場所 |
|---|---|
| ユニットテスト、失敗ケースのテスト、パッケージングテスト | Ubuntu 上の CI で、プッシュのたびに実行 |
| インストール済み wheel の CLI スモークテスト | Ubuntu 上の CI で、プッシュのたびに実行 |
| Apple Silicon 上で実際の Ghidra を使ったネイティブチェック(12 テスト) | リリース前に、設定済みの Mac でローカル実行。CI ではスキップ |
緑色の CI バッジが示すのは、最初の 2 行のみです。eaos setup または ./install.sh の後にネイティブチェックを実行するには:
EAOS_NATIVE_TESTS=1 uv run python -m unittest discover -s tests -v
PyPI ではなくチェックアウトしたソースから作業する場合、./install.sh ですべてをローカルにセットアップし、その後 ./eaos mcp /absolute/path/to/program でサーバーを起動します。
コントリビューション
これは私のプロジェクトであり、私自身が開発しています。Issueからのバグ報告やアイデアは大歓迎です。外部からのコードは受け付けていません。別の方向に発展させたい場合は、フォークしてください。それがライセンスの目的です。詳しくはCONTRIBUTING.mdをご覧ください。
ライセンスとクレジット
Apache-2.0。このプロジェクトを基に何かを作る場合は、NOTICEファイルを残してください。各リリースでの変更点はchangelogに記載されています。
Ghidra と PyGhidra が主要な処理を担っています。これらは、それぞれのコントリビューターによる成果です。比較の基準には、LaurieWired の GhidraMCP を使用しています。ベンチマークに使用しているプログラムとそのライセンスについては、BENCHMARKS.mdにクレジットを記載しています。
thomasisalwayslate が作成しました。私はアプリやゲーム、小さなツールを作っています。たいていは、自分で使いたいものです。私のサイトでは、ベンチマークの背景となる記事などを紹介しています。
調査の手間を省けたなら、⭐を付けてもらえると、ほかの人にも見つけてもらいやすくなります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。