Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
spectrIDA-Reverse_Engineering_Stack — 並列IDA Proバイナリ解析、AI駆動の関数命名機能、Neo4j知識グラフ、およびphantomrtエミュレーション/フッキング/ファジングエンジンを統合し、PE、ELF、NSO形式のリバースエンジニアリングを自動化します。 | Kitploit
ツール/GitHubGitHub/ggfuchsi-oss/spectrida-reverse_engineering_stack
静的分析動的分析 (サンドボックス)エクスプロイトリバースエンジニアリングデバッガファジングマルウェア分析CTFバイナリ解析AI支援リバースエンジニアリング

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
ファームウェア解析
GitHubggfuchsi-oss/spectrida-reverse_engineering_stack

spectrIDA-Reverse_Engineering_Stack

並列IDA Proバイナリ解析、AI駆動の関数命名機能、Neo4j知識グラフ、およびphantomrtエミュレーション/フッキング/ファジングエンジンを統合し、PE、ELF、NSO形式のリバースエンジニアリングを自動化します。

リポジトリを見る
4991ヶ月前Kitploit レビュー済み

👻 spectrIDA

バイナリを行き来するゴースト。

ローカルで動作するAI搭載リバースエンジニアリングアシスタント:並列IDA Pro解析、AIによる関数命名、ストレスのないターミナル、これまでに解析したすべてを記録するNeo4jナレッジグラフ、そしてClaudeがそのグラフを直接検索・連鎖できるMCPサーバー。

そして今や、phantomrt によって、壁を読むだけでなく、その中を歩き回れるようになりました。つまり、命名した関数をエミュレート、フック、ファジングし、実際に起きたこと をグラフに書き戻します。

``` spectrida analyze GameAssembly.dll --workers 16 ``` ## クイックスタート``` ◈ spectrIDA ▸ GameAssembly.dll

✓ 00 ✓ 01 ✓ 02 ✓ 03 ▸ 04 · 05 · 06 · 07 ✓ 08 ✓ 09 ✓ 10 ✓ 11 ✓ 12 ✓ 13 ▸ 14 · 15

14/16 shards │ 141,203 functions found ████████████████████████████░░░░ 89% ~4s remaining

root@kitploit:~
## 概要

IDA Proの自動解析はシングルスレッドです。34MBのil2cpp DLLでは*数分*かかります。spectrIDAはバイナリをN個のシャードに分割し、idalibを介して並列実行し、1つの`.i64`にマージした後、微調整された8Bモデルで**すべての関数に名前を付け**ます。しかも、サイバーパンクテーマと絶妙な皮肉が効いた1つのターミナルUIからすべてを実行できます。

それが第1章であり、単独で完結しています。純粋な速度向上であり、必要なければAIは不要です。

第2章では、出力をセッションを超えて存続するものに変換します。MCPクライアント(Claude、[pi](https://pi.dev)、MCPを話す任意のもの)が実際に利用できるNeo4jグラフを生成し、あなたがデコンパイラの出力を1関数ずつチャットウィンドウにコピーペーストする必要がなくなります。```
Binary  ─▶  Parallel IDA Analysis  ─▶  Demangle  ─▶  AI Naming  ─▶  Neo4j Graph  ─▶  MCP Server  ─▶  Claude
              (N idalib shards)       (free, real)   (stripped     (persists,        (search/chain/
                                                       leftovers     forever,          rename, live)
                                                       only)         across sessions)

第3章 (phantomrt) は、静的ツールには決してない半分の機能を追加します。それはコードを実行します。OSなしで関数をエミュレートし(起動すらできないバイナリ、例えばSwitchの.nsoでも動作)、ライブプロセスにフックしたり、ファジングしたりします。そして、その判定結果(crashes / needs live state / clean)を、名前と同じグラフノードに刻印します。

完全な詳細、まだやるべきことも含めて、第2章と第3章にあります。

これはGhidraではありません。ひとつの厄介なこと(遅い解析+命名)を高速にこなし、実際に使うのが楽しいです。199ダウンロードがそれを物語っています。

クラウドなし。テレメトリーなし。完全にあなたのマシン上で動作します。


数値

タスク時間
Among Us DLL — シングルスレッドIDA~4時間
Among Us DLL — spectrIDA (16ワーカー)67秒
153,649関数のバイナリ — 全命名パス一晩
バイナリ概要(これは何をするものか?)~30秒

測定に使用したハードウェア: AMD Ryzen 7 5800X3D (8C/16T)、32 GB RAM、RTX 4070 12 GB。 異なるハードウェアでは並列解析の数値が変わります(コア数が多いほど、シャード数が多いほど高速になります)。命名の数値はほとんどGPUに依存します。4時間/67秒のAmong Usの数値は第2章以前のもので、すべてのリリースで独立して再検証されているわけではありません。ご自身のマシンとバイナリでの数値が必要な場合は、spectrida analyze を自分で再実行してください。結果はシャード密度とバイナリサイズによって異なります。

実際に第2章の開発中に再検証された数値(同じハードウェア):

そのNSOの行は、以前のAmong Usの「4時間→67秒」という主張の実際の相当物であり、今回のリリースで新たに74,790関数のSwitchバイナリで測定されたものです。AI命名は関与していません(デマングルのみ — populate=False)。並列フェーズ(16コア、約55秒)は初期のシャード発見を行います。マージフェーズ(約143秒)は設計上シングルスレッドです — 1つのIDAデータベース、1つのライター — そのため、その部分でタスクマネージャーを見て15コアが休んでいるのを見ても、それはバグ報告ではなく、物理的な制約です。

ここで正直な数値を得ること自体が、ちょっとしたホラーストーリーでした。NSOサポートの最初のバージョンは正常に動作し、終了コード0で、約75,000関数あるバイナリに対して727関数を堂々と返しました。クラッシュではなく、ただ見事に、自信満々に間違っていたのです。それがなぜか悪質です。IDAにはネイティブのNSOローダーがないため、ファイルはプレーンx86("metapc")として静かにロードされました。Switchは発売当初からARM64であるにもかかわらずです。すべてのシャードは、純粋なAArch64命令に対してx86プロローグスキャナーを実行し、誤って「関数」に一致したものを何でも関数と呼びました。アーキテクチャを修正してもそれだけでは何も解決しませんでした。なぜなら、バイナリはメモリ上で依然としてLZ4圧縮されていたからです。そのため、スキャンされたものの半分は、控えめに見てもノイズでした。そして、適切に解凍され、AArch64と識別された後でも、各シャードはバイナリのごく小さなスライス内のコールターゲットのみを探し、シャード境界をまたぐすべてのコールを見逃していました。このサイズのバイナリでは、それらがほとんどです。3つのバグ、1つの数値、そしてそのどれもが例外を投げるという礼儀さえ持っていませんでした。(また、IDAのスタックフレーム解析をスキップすることでマージフェーズを短縮しようと試みました。素晴らしい高速化と、Hex-Raysがその半分の逆コンパイルを丁寧に拒否するデータベースを得ました。それはすぐに戻されました。代わりに、はるかに小さく、はるかに安全なFLIRTシグネチャスキップを保持しました。これは肩をすくめる程度の約3%の価値があり、何も壊しませんでした。この時点ではそれは維持する価値のある性格特性のように感じられました。)

命名精度について: Ghidra並みの正解率ではなく、8Bモデルが疑似コードから推測しているものです。一般的なヘルパー/ゲッターはうまく当たる傾向がありますが、ゲーム固有の深いロジックはコイン投げのようなものです。間違ったものはすべて名前を変更してください — それがrename_functionが直接グラフに反映される理由です。


機能

  • 並列シャード解析 — アドレス空間シャードに分割し、N個のidalibインスタンスを実行し、1つの.i64にマージします。ワーカーはフラグ、設定、環境変数を介して設定可能。
  • プラグイン可能なフォーマット対応 — PE、NSO (Switch)、ELF (.so/Linux) が標準搭載されています。新しいフォーマットを追加するのは単一ファイルで、コアの変更は不要です。spectrida formats で登録済みのリストを表示します。新しいバイナリフォーマットの追加 を参照。
  • AI関数命名 — ファインチューニングされたQwen3-8BがOllamaを介してローカルで動作し、トークンごとに名前をストリーミングします。Nを押す。考えるのを見守る。名前が現れる。
  • バッチ命名 — Bでリスト内のすべてのsub_*関数に名前を付けます。その場を離れる。戻ってくる。
  • バイナリ概要 — Oを押すか、spectrida overview file.i64を実行。モデルが120のサンプリングされた関数名を読み取り、バイナリが何をするか、サブシステムは何か、セキュリティ関連の情報を教えてくれます。153k関数のIL2CPPランタイムを30秒で正しく識別しました。
  • コールチェーンエクスプローラ — Cで呼び出し元と呼び出し先を表示します。モデルはこれらを命名時のコンテキストとして使用します — Player$$TakeDamageによって呼び出される関数は、単独の場合よりも適切に名前が付けられます。
  • 逆コンパイラビュー — DでHex-Rays疑似コードを切り替え。

インストール```bash

pip install spectrida

root@kitploit:~
必要条件: **IDA Pro 9.x** with idalib · **Python 3.10+** · **Ollama**```bash
# install Ollama (Windows)
winget install Ollama.Ollama

# pull the model (8.7 GB — go get coffee)
ollama pull hf.co/gdfhhjk/spectrida-re-gguf:latest

# first run — detects your IDA install and sets everything up
spectrida onboard

# or just try the demo right now
spectrida --demo

コマンド```bash

analyze a binary from scratch

spectrida analyze GameAssembly.dll spectrida analyze GameAssembly.dll --workers 8 # custom worker count

open an existing .i64 in the browser

spectrida open file.i64

ask the AI what this binary is

spectrida overview file.i64 spectrida overview file.i64 --addr 0x10001000 --addr 0x10353fd0 # include specific functions

export function names

spectrida export file.i64 -f idc # IDA script — apply names to any install spectrida export file.i64 -f json # full dump with addresses + sizes spectrida export file.i64 -f csv # spreadsheet spectrida export file.i64 -f symbols # addr name pairs spectrida export file.i64 --named-only # skip sub_* functions

check Ollama + model status

spectrida serve

re-run the setup wizard

spectrida onboard

root@kitploit:~
## TUIキー

| キー | アクション |
|-----|--------|
| `N` | 選択した関数に名前を付ける — AIが結果をライブストリーミング |
| `R` | 名前変更 — AIの提案で事前入力 |
| `D` | 逆コンパイルされた擬似コードの切り替え (Hex-Rays) |
| `C` | 呼び出しチェーン — 呼び出し元と呼び出し先 |
| `B` | 現在のリスト内のすべての `sub_*` 関数を一括で命名 |
| `O` | 概要 — バイナリ全体のAI要約 |
| `/` | あいまい検索 |
| `?` | ヘルプ |
| `Q` | 終了 |

## プログラムAPI

TUIは不要 — スクリプト、Claude Code、ノートブックなどからspectrIDAを駆動:```python
import asyncio
from spectrida.api import open_i64

async def main():
    async with open_i64("GameAssembly.i64") as db:

        # list all 153k functions
        funcs = await db.list_functions()

        # name one function — returns name + reasoning + confidence
        result = await db.name_function(0x10001000)
        print(result["new_name"])     # init_atexit_handler
        print(result["reasoning"])    # allocates array of 3 fn ptrs, calls _atexit...

        # batch name everything (with live progress)
        async def on_progress(done, total, r):
            print(f"  {done}/{total}  {r['old_name']} -> {r['new_name']}")

        await db.batch_name(limit=500, rename=True, progress_cb=on_progress)

        # ask what the binary does
        overview = await db.overview()
        print(overview)

        # export to IDA script
        await db.export("names.idc", fmt="idc", named_only=True)

asyncio.run(main())

モデル

hf.co/gdfhhjk/spectrida-re-gguf — リバースエンジニアリング用にファインチューニングされたQwen3-8B

学習データ:

  • x86/x64アセンブリ → 呼び出しチェーンコンテキストを持つ関数名のペア
  • jtsylve/ida-mcp からのツール呼び出しトレース — idalibを備えたヘッドレスIDA
  • コードベースコンテキストサーバーからの拡張コンテキスト推論トレース

学習アプローチ: ニューロンターゲットSFT + GRPO。RE関連のニューロンのみが調整されています — 基本的なQwen3の知識はそのままに、非常に特定のスキルが追加されただけです。

Ollamaを介してローカルで実行されます。GGUF — CPU、GPU、またはその両方で動作します。


誰のためのものか

何かをリバースしています。150,000個の関数を持つバイナリがあります。おそらく2,000個はメタデータから名前が付けられています。残りの148,000個はsub_XXXXXXXXです。ネットワークコードを見つけたいと思っています。まだ何も名前が付けられていないため、grepで検索することはできません。

熟練したREであれば、1時間あたり約50〜100個の関数に名前を付けることができます。その速度では、15万個の関数 = 3年かかります。

spectrIDAはそれらを一晩で命名します。完璧ではありません — 一般的な関数ではおそらく70%の精度ですが、モデルが認識するパターンでははるかに高精度です。しかし、14万8千個のsub_関数ではなく、network_send_packet、serialize_player_state、validate_checksumといった名前が付けられ、どこを探せばよいかがわかります。

熟練したリバースエンジニアに取って代わるものではありません。退屈な80%を処理することで、興味深い20%に集中できるようにします。これはオリエンテーション層です。

実際のユースケース:

  • ゲームモッディング — 15万個の関数を持つバイナリ内の物理システムを数日ではなく数分で見つける
  • セキュリティ研究 — マルウェアのトリアージ、バイナリのアーキテクチャを迅速に理解する
  • CTF — 時間的プレッシャーがある中で、何を見ているのかを即座に知る必要がある
  • sub_140001234を20分間見つめ、「もっと良い方法があるはずだ」と考えているすべての人

設定

`/.spectrida/config.toml:````toml [ida] idalib = "C:/Program Files/IDA Professional 9.1" output_dir = "/.spectrida/output"

[ollama] base_url = "http://localhost:11434" model = "spectrida-re" # any ollama model name works

[pipeline] workers = 16

root@kitploit:~
環境変数の上書き: `SPECTRIDA_IDALIB` · `SPECTRIDA_MODEL` · `SPECTRIDA_WORKERS` · `SPECTRIDA_OLLAMA_URL`

---

## 新しいバイナリ形式の追加

フォーマット対応はプラグインシステムであり、if/elif の山ではありません — PE、NSO、ELF はすべて `spectrida/analysis/formats/` 以下のファイルで、自動的に発見されます。現在登録されているものを確認するには、`spectrida formats` を実行してください。```bash
$ spectrida formats
ELF        spectrida.analysis.formats.elf.ELFHandler
NSO        spectrida.analysis.formats.nso.NSOHandler
PE         spectrida.analysis.formats.pe.PEHandler
generic    spectrida.analysis.formats.generic.GenericHandler

フォーマットハンドラの役割は狭い範囲に限定されています — ファイルを調べて、それが自分が担当するものかどうかを判断し、そのコードレイアウトを記述することです。その他すべて(シャーディング戦略、GPUプロローグスキャン、複数のシャードを1つの .i64 にマージすること)は、フォーマットパッケージの外部で一度だけ、汎用的に処理されます。NSOは完全な例です。そのLZ4 decompress + idaapi mem2base/add_segm ロジックは既に nso_loader.py に存在していました(第2章の歴史における、アーキテクチャ誤認識/圧縮状態/ローカルエントリポイント盲のバグの修正)— formats/nso.py は、その既存の検証済みモジュールを FormatHandler コントラクトを通じて公開する薄いアダプタであり、書き換えではありません。

フォーマットを追加するには、spectrida/analysis/formats/ に新しいファイルを1つ置くだけで他には何も必要ありません。 parallel_analyze.py、shard_worker.py、またはレジストリを編集する必要はありません — HANDLER インスタンスを公開するモジュールをディレクトリからスキャンすることで自動的に認識されます。```python

spectrida/analysis/formats/myformat.py

from spectrida.analysis.formats.base import FormatHandler, PreparedImage, Section

class MyFormatHandler(FormatHandler): name = "MYFMT"

root@kitploit:~
@staticmethod
def sniff(header: bytes, path: str) -> bool:
    return header[:4] == b"MYF0"          # however you recognize the format

def prepare(self, path: str, workdir: str) -> PreparedImage:
    # Format idalib already loads natively (ELF, PE, Mach-O)? Just parse
    # the section/segment table — return the original path unchanged.
    return PreparedImage(
        binary_path=path,
        image_base=0,
        sections=[Section(name=".text", va=0x1000, raw_off=0x400,
                           raw_size=0x2000, vsize=0x2000, is_code=True)],
        arch=None,        # set "x86_64"/"arm64" only if IDA can't detect it itself
    )

# Only needed if idalib has NO native loader for this format (NSO is the
# example): do any manual idaapi/ida_segment setup here, called right
# after idapro.open_database() succeeds, before analysis starts.
# def post_open(self) -> None: ...

HANDLER = MyFormatHandler()

root@kitploit:~
That's the whole contract:

| Method | Required? | What it does |
|---|---|---|
| `sniff(header, path)` | yes | Magic-byte/extension check — does this handler own the file? |
| `prepare(path, workdir)` | yes | Return a `PreparedImage`: the file idalib should open + its section table |
| `post_open()` | no (default no-op) | Manual segment setup for formats with no native IDA loader (see `nso.py`) |
| `make_shard_binary(image, dst, va_start, va_end)` | no (default works) | Override only if zeroing out-of-shard section bytes is wrong for your format (see `nso.py` — never zero a compressed file) |
| `code_range(image)` | no (default works) | Override only if "min/max of `is_code` sections" isn't the right answer |
| `read_bytes(image, va_start, va_end)` | no (default works) | Override if `prepare()` already holds the relevant bytes in memory (NSO) instead of on disk |
| `global_entry_points(image, text_start, text_end)` | no (default: None) | Only override if a per-shard local scan would miss real entry points — NSO needs this because AArch64 leaf functions are only discoverable via BL targets seen elsewhere in the binary, not a local prologue scan |

| メソッド | 必須? | 説明 |
|---|---|---|
| `sniff(header, path)` | はい | マジックバイト/拡張子チェック — このハンドラがファイルを所有しているか? |
| `prepare(path, workdir)` | はい | `PreparedImage` を返す:idalib が開くファイル + そのセクションテーブル |
| `post_open()` | いいえ (デフォルトは何もしない) | ネイティブIDAローダーがないフォーマット向けの手動セグメント設定(`nso.py`参照) |
| `make_shard_binary(image, dst, va_start, va_end)` | いいえ (デフォルトで動作) | シャード外のセクションバイトをゼロにすることがフォーマットにとって間違っている場合のみオーバーライド(`nso.py`参照 — 圧縮ファイルは決してゼロにしない) |
| `code_range(image)` | いいえ (デフォルトで動作) | 「`is_code` セクションの最小/最大」が正しい答えでない場合のみオーバーライド |
| `read_bytes(image, va_start, va_end)` | いいえ (デフォルトで動作) | `prepare()` が関連するバイトをディスクではなくメモリに保持している場合(NSO)にオーバーライド |
| `global_entry_points(image, text_start, text_end)` | いいえ (デフォルト: None) | シャードごとのローカルスキャンで実際のエントリポイントを見逃す場合のみオーバーライド — NSOではこれが必要。なぜなら、AArch64のリーフ関数はローカルのプロローグスキャンではなく、バイナリ内の別の場所で見られるBLターゲットを介してのみ発見可能だからです。 |

Look at `formats/pe.py` for the simplest possible handler (pure header parsing, no overrides) and
`formats/nso.py` for the full case (wraps decompression + manual segment setup + every override).

最も単純なハンドラ(純粋なヘッダーパース、オーバーライドなし)については `formats/pe.py` を参照し、完全なケース(展開のラッピング + 手動セグメント設定 + すべてのオーバーライド)については `formats/nso.py` を参照してください。

Third-party packages can register a handler too, without touching spectrIDA's source at all, via
the `spectrida.formats` entry-point group:

サードパーティパッケージも、spectrIDAのソースに一切触れずに、`spectrida.formats` エントリポイントグループを介してハンドラを登録できます。```toml
# in a separate package's pyproject.toml
[project.entry-points."spectrida.formats"]
myformat = "spectrida_myformat_plugin:HANDLER"

Test coverage for the format system lives in tests/test_formats.py — pure Python, no IDA/idalib required, so it runs in CI.


Chapter 2 — the ghost learns to talk back

Chapter 1 was a faster, funnier IDA. Chapter 2 is spectrIDA as a teammate: a persistent, queryable knowledge graph of every function it's ever named, and an MCP server so Claude (or any MCP client — pi works too) can search and reason through it directly, instead of you copy-pasting decompiler output into a chat window.```bash spectrida install mcp

root@kitploit:~
それだけです。Claude Codeとpiにサーバーを自動登録し(`mcp` + `neo4j`が不足している場合は、素の`pip install spectrida`でスキップされた場合にプルインします)、設定を書き込み、どの再起動が必要かを通知します。

**Neo4jが起動している状態で、Claudeが実際に取得するもの(`spectrida`のconfig `[graph]`セクション、またはローカルインスタンスを指定するだけ):**

- `search_functions` / `get_function` / `get_callees` / `get_callers` / `trace_chain` — 高速なキャッシュ済みグラフ読み取り。`get_function`は疑似コード**と**逆アセンブリ(厳密な命令境界とオペランド — 疑似コードだけでは得られない層であり、「これは何をするか」から「これをパッチする正確な場所はどこか」に移行する瞬間に重要)に加えて、インラインの呼び出し元/呼び出し先を返すため、Claudeはレスポンス内で呼び出し先がまだ`sub_*`かどうかを確認することで、さらに深くチェーンするかどうかを判断できます — 何も見るものがないことを確認するためだけの余分な往復は不要です。
- `get_full_pseudocode` / `rename_function` — キャッシュされたスニペットでは不十分な場合や、名前がついに判明した場合に、ライブで信頼性の高い読み取り/書き込みを`.i64`に直接行います。
- `analyze_binary` — 未解析のバイナリ(PEまたはNSO、どちらでも並列シャーディング)を渡すと、パイプライン全体(解析 → デマングル(Itanium **および** MSVC) → 本当にストリップされた残骸にAI命名 → すべてをグラフにプッシュ)を1つのバックグラウンドジョブとして実行し、ポーリング可能なので、数分かかる実行でも会話をブロックしません。
- `doctor` / `start_all` — チャットを離れずにllama-server + Neo4jを確認または起動。llama-server自体がどこにもインストールされていない場合、`start_all`はwinget(Windows)またはbrew(macOS)経由で先にそれを取得します — 別途llama.cppのダウンロード/セットアップは不要です。

魔法ではありません — 誰もまだ見ていないために`sub_140001234`のままの関数は、やはり`sub_140001234`のままです。しかし、グラフはモデルが**解明した**すべてを永久に、セッションをまたいで記憶し、Claudeは一度に1つの関数を見つめる代わりに、既にコードベースを読んだ同僚のようにそれを辿ることができます。

**今後提供予定:**

- **深いコンテキスト命名** — コールツリーをNレベル深く追跡し、完全なチェーンをモデルに提供。`encrypt_block`から3ホップ先の関数は、自分が暗号パスにいることを認識できるはず。
- **難読化解除** — TigressVMパターン検出とハンドラトレーシング
- **実際のパッチ適用** — 逆アセンブリがグラフに格納されたので、エージェントはバイトレベルのパッチを計画**できます**。「ここが変更すべき正確な命令」を「そしてここが書き込みだ」に変えるのが次のステップです。

---

## 第3章 — 幽霊は壁をすり抜ける

第1章と第2章はバイナリを読み込み、それを記憶します。しかし、関数を読むことはそれが**何であるか**を教えるだけで、トリガーを引いたときに**何をするか**は決して教えません。第3章 — [**phantomrt**](https://pypi.org/project/phantomrt/) — がトリガーを引きます。```bash
pip install "spectrida[atlas]"

既に名前が付けられた関数 spectrIDA を受け取り、それに対して以下の3つの幽霊のようなことのいずれかを実行します:

  • エミュレートする(Unicorn、OSなし、任意のアーキテクチャ)— Switch の .nso や Android の .so のように、起動できないバイナリで動作する唯一の方法です。
  • ライブインストルメントする(Frida)— 実行中のプロセスにアタッチし、実際の引数と戻り値を監視します。エミュレーションでは実状態が必要なため、ただ肩をすくめることしかできない関数のためです。
  • ファズする — 変異した入力(自分で用意したシード、またはバイナリ自体から切り出したシード)を使用し、クラッシュをキャッチし、再現可能な入力を保持します。

そして、その判定を同じ Neo4j ノードに dyn_* プロパティとして刻印します。これにより、グラフを巡回するエージェントは、名前と動作を一箇所で確認できます。6つの新しい MCP ツール — emulate_function、hunt_crashes、live_trace、dynamic_overview、risk_functions、learn_vm — がすべて1つのグラフを支えています。推論の部分は任意の LLM が担当します。phantomrt は、雰囲気ではなく実際のランタイムの事実を推論に使えるようにするだけです。``` spectrIDA (names it) ─▶ phantomrt (runs it) ─▶ graph (dyn_status / crash / live args) ─▶ the agent reasons

root@kitploit:~
**そして、上記のNSOのホラーストーリーの精神に基づいて:** 最初の実際のバグハントは正直に*何も*見つけられませんでした — そしてその理由はクラッシュよりも興味深いものでした。本当に古く、本当に脆弱なFreeTypeを狙ったブランドファジングはゼロでした。カバレッジガイドファジングは見事な**64,000エッジ**をカバーしたと報告しました — しかしそれは嘘で、バイナリがPIEであり、ASLRが毎回アドレスを静かに再ランダム化していたため、「新しいカバレッジ」のほとんどはローダーがデッキをシャッフルしていただけでした。ASLRを無効にすると、正直な数字は*実際の*727エッジに落ち着き、そこで頭打ちになります — なぜならすべてのシードがTrueTypeフォントだったため、ファザーは1つのパーサーに閉じ込められ、バグが実際に存在するCFF/Type1/BDFコードに構造的に変異することができませんでした。修正はよりスマートなミューテーターではなく、より良いシードでした:エージェントが実際のOpenType/Type1/BDFサンプルを取得し、1回のファズ反復の前にカバレッジは727 → 4,013に跳ね上がり、適切に探索されました。それでも予算内ではクラッシュは発生しません — これは通常数時間かかるジョブに対して1コアで3分間実行した正直な状態です。仕組みは本物です。報告する代わりに、*自分自身の*偽の番号を捕まえました。それがすべての要点です。

**正直なゴースト免責事項:** phantomrtは`0.1.0`です。アルファ版です。堅牢な動的レイヤーであり、魔法のバグオラクルではありません — おもちゃのターゲットでは仕掛けられたバグを即座に見つけ、実際のターゲットでは行き詰まったとき(`needs_state`)、クラッシュが*候補*に過ぎないとき(ポインタが実際に入力制御されているか確認してください)、そしてより多くの時間とより良いシードが必要なときを正直に教えてくれます。Switchバイナリはライブで実行できません — Fridaは起動できるものを必要とします — そのため、エミュレーションが唯一の方法であり、`needs_state`が頻繁に表示されます。それは正直であり、壊れているわけではありません。

それは意図的に重い追加機能です(`torch`, `unicorn`, `frida`)— ベースの `pip install spectrida` では何もインストールされません。ソースは [`phantomrt/`](https://github.com/ggfuchsi-oss/spectrida-reverse_engineering_stack/blob/HEAD/phantomrt/) にあります;独自のゴースト風味のREADMEは[こちら](https://github.com/ggfuchsi-oss/spectrida-reverse_engineering_stack/blob/HEAD/phantomrt/README.md)です。

*静的ゴーストはあなたの関数に名前を付けます。こちらはそれらを告白させます。* 👻

---

## ライセンス

MIT. 好きに使ってください。動けばクール。動かなければ、GGUF量子化のせいにしてください。

意地とコーヒーとRTX 4070で作られました。
このモデルはマーケティングゼロで199回ダウンロードされています。ダウンロードごとに開発速度が0.01%向上します。
(これは真実ではありません。しかし近いです。)👻
ツールをダウンロード
バイナリ関数タスク時間 / 結果
test_small.dll (PE)189並列解析、4ワーカー、CLI6.4s
test_small.dll (PE)164完全なMCPパイプライン(解析+デマングル+グラフ書き込み)9.8s
main.nso — Mario Odyssey (NSO)、16ワーカー28,038 シード関数並列シャードスキャンフェーズ54.5s
main.nso — Mario Odyssey (NSO)、16ワーカー74,790 全関数+ マージ/完全解析フェーズ143.1s
main.nso — Mario Odyssey (NSO)、16ワーカー74,790 全関数エンドツーエンドのウォールタイム197.6s
main.nso — Mario Odyssey (NSO)74,790デマングルのみで解決(Itanium ABI、無料、AIなし)67,300 (90.0%)
  • エクスポート — すべてをJSON、CSV、IDA .idcスクリプト、またはシンボルファイルにダンプします。.idcは、AIが生成したすべての名前をワンクリックで任意のIDAインストールに適用します。
  • プログラムAPI — from spectrida.api import open_i64。スクリプト、ノートブック、Claude CodeからTUIに触れることなくすべてを操作できます。
  • MCPサーバー — spectrida install mcp でClaude Codeや pi に直接接続でき、手動のJSON編集は不要です。ClaudeはNeo4jバックエンドの関数グラフ(名前、疑似コード、逆アセンブリ、呼び出し元/呼び出し先)を検索/読み取り/連鎖し、新しいバイナリ自体の新鮮な解析を開始できます — analyze_binary は1つのツール呼び出しから全パイプライン(並列解析 → デマングル → AI命名 → グラフ)をバックグラウンドジョブとして実行し、ポーリングします。PEとNSOで動作します。下の第2章を参照。
  • デモモード (spectrida --demo) — ゼロセットアップですべてを試せます。IDAもOllamaも不要。
  • 初回実行ウィザード — Ollamaとモデルのインストールを支援し、IDAのインストールを自動検出し、その後は二度と尋ねません。