
Nodeまたはブラウザで保存されたARM64コードを実行し、デコードされた画像ピクセルと初期化済みメモリを検査します。
保存されたネイティブコードを実行する。その初期化済み状態を再び開く。 Capsulith は、選択された ARM64 関数、その呼び出し規約、および所有メモリを Node またはブラウザ向けにパッケージ化します。元の命令を保持したまま、元のアプリケーションなしで、初期化済みオブジェクトを新しいワーカー内で再開できます。
レガシーなデコーダ、チェックサム、または孤立したバイナリルーチンを、小さく再利用可能な API に変えることができます。Capsulith は、どのバイトと依存関係がそれに伴って移動するのか、実行がどこで読み書きを行うのか、そしてサポートされていない状態を必要とする機能がなぜ抽出できないのかを示します。
ネイティブイメージワークベンチを開く。 用意された QOI アートワークを使うには Load & run example を選択するか、小さな PNG または QOI 画像を持ち込んでください。抽出された元の QOI エンコーダがファイルを書き出し、別個のネイティブデコーダがそのピクセルを返し、個々の RGBA バイトを検査できます。その初期化済みピクセル割り当てを保存し、ワーカーを閉じ、その後、新しいワーカー内でそれを復元して解放します。公開ワークベンチを実行するのに、アカウント、アップロードサーバー、元のバイナリ、コンパイラは必要ありません。
PNG はブラウザでデコードされた RGBA を明示的な比較基準として使用します。QOI のみの入力には、独立したソースピクセルとの比較がありません。画像は各次元 256 ピクセル、1 MiB に制限されています。これは既知のソースを用いた準備済みネイティブコンポーネントのデモであり、新しいコーデックや汎用的なフォーマット復元ではありません。元の QOI ソース、コントラクト、独立したネイティブ/FFmpeg コントロール、およびスタンドアロン Node コマンド。

キー不要のブラウザオブジェクトデモを試し、Run lifecycle を押してください。実際に抽出された命令をローカルで実行します。結果を生成するためにサーバーを呼び出すことはありません。
リリースから Python wheel をダウンロードし、次に:
python3 -m pip install capsulith-0.3.0-py3-none-any.whl
capsulith studio
http://127.0.0.1:6359 を開きます。関数 Studio は LZ4 デコーダーと xxHash の検体を保持します。Object studio を開き、Open original LZ4 example を選択してから Run lifecycle を実行すると、実際にコンパイルされたストリームの作成、圧縮、辞書の保存、チェックポイント、復元、継続、解放を行います。API キーや有料サービスは不要です。抽出には Python 3.10+ と Capstone が必要です。ブラウザは同梱の WebAssembly エミュレーターを介して実行されます。Node 20+ は CLI またはエクスポートされた Node 呼び出しにのみ必要です。
Studio は ARM64 Mach-O dylib を受け入れ、その関数を一覧化し、選択したルートを抽出し、バッファ、レジスタ引数、スカラー入力、戻り値の型を編集できるようにします。依存関係ビューはヘルパー/インポートを実際の呼び出し箇所と元の命令に結び付けます。実行イベントは名前付きメモリ領域と元のコードにリンクします。停止した実行は、成功結果を主張することなく部分的な証拠を表示します。
Export portable capsule は、現在のバイト列、コントラクトと入力、Node/ブラウザランナー、固定されたバックエンド、完全なバックエンドのソース/ビルドスクリプト、ライセンスをダウンロードします。解凍して node run.cjs を実行するか、そのフォルダーを HTTP で配信して独立したブラウザランナーを開きます。これらの呼び出しには Python、Capstone、元のバイナリは不要です。エクスポートされた API は異なる入力を受け付け、キャンセルをサポートし、宣言された制限を適用します。
Original LZ4 methods, restored dictionary access and exact native comparison in the object Studio
オブジェクト Studio は、抽出されたモジュール JSON をインポートするか、明示的に宣言された名前付きメソッドを持つ、あなたが所有する ARM64 Mach-O アーティファクトを読み取ります。実際のルート、チャンク、依存関係を検査し、16 進数またはローカルファイルから名前付き呼び出し元バッファを割り当て、メソッドを選択して型付き領域参照または整数を指定します。メモリマップは、推測されたフィールドではなく不透明な生バイトとともに、実際に所有された領域と初期化を表示します。戻り値、アクセス範囲、カウンター、境界付きイベントは元の命令から得られます。
元に戻す必要がある可能性のある操作の前にチェックポイントを保存します。一致するモジュールを復元するとゲストアドレスと領域 ID は保持されますが、新しいインスタンス ID が作成されます。参照は領域 ID で再バインドしてください。入力を編集すると古い証拠は無効になり、フォールトまたはキャンセルには事前のチェックポイントまたは新しいインスタンスが必要です。ネイティブの解放と呼び出し元バッファの解放は、別々の明示的なライフサイクル操作です。ランタイムは、ネイティブポインタがまだバッファを参照しているかどうかを推測することは決してありません。
capsulith module examples/lz4/liblz4.dylib \
--methods examples/native-objects/methods.json --out stream.module.json
node runtime/object-cli.cjs examples/native-objects/start.json \
--module stream.module.json --checkpoint-out first.checkpoint.json
# The first Node process has ended. This command opens a fresh worker.
node runtime/object-cli.cjs examples/native-objects/continue.json \
--module stream.module.json --checkpoint first.checkpoint.json
capsulith export-module stream.module.json \
--checkpoint first.checkpoint.json --out stream-object.zip
新しい出力名を選択してください。module、checkpoint、object のエクスポートコマンドは既存のファイルへの上書きを拒否します。提供される操作プログラムは、文書化された LZ4 ライフサイクルに固有のものです。汎用モジュールには、独自の呼び出し元が宣言するメソッドと操作プログラムが必要です。
オブジェクトのエクスポートには、元の命令モジュール、オプションで保持されたチェックポイントのバイト列、独立した Node/ブラウザランナー、オブジェクト Studio、ランタイムおよび対応するバックエンドのソース/ビルドスクリプト、ライセンス、そしてバイト数、SHA256、パーミッションを含むファイルマニフェストが含まれます。フォルダを配信して index.html を開けば、API エンドポイントなしでバンドルされたチェックポイントを復元できます。または node run.cjs your-operations.json --checkpoint checkpoint.json を実行してください。実行に元のバイナリ、Python パッケージ、コンパイラは不要です。チェックポイントには保持された呼び出し元のバイト列が含まれます。共有する前にそれらを検査してください。オブジェクト API と操作フォーマット および ネイティブの例 を参照してください。
capsulith inspect legacy.dylib
capsulith extract legacy.dylib --root _decode \
--contract decode-contract.json --out decode.capsule.json
capsulith run decode.capsule.json --inputs input.json
capsulith export decode.capsule.json --inputs input.json --out decoder.zip
ルート選択は、検証済みの関数開始アドレス(例: --root 0x440)も受け付けます。エクスポートされたシンボルはプロトタイプではありません。実際の呼び出し規約は利用者が指定します。Capsulith は ABI(引数と戻り値をレジスタに配置する規則)を推論しません。ランタイムガイドでは、バッファ、32/64ビット整数、メモリインポートと制限について定義しています。examples/xxhash/contract.json は完全な3引数の例です。
LC_FUNCTION_STARTS。__const/__cstring の保持、明示的な境界付き memmove、memcpy、memset インポート。malloc、bzero、free メモリモデル、初期化された所有ヒープバイト、メソッド境界でのコード結合チェックポイントをサポートします。ヒープレイアウトやポインタ書き換えは推論されません。間接制御フロー、書き込み可能な静的状態、再配置された静的ポインタ、サポートされていないインポート、トラップ、その他のアーキテクチャ、その他のアーティファクトファミリには明示的な診断が出力されます。静的アドレス候補は基本ブロックの構文的証拠であり、実際のトレースが観測されたアクセスを確立します。この最初のスコープでは、ソースの復元、任意のプロトタイプの推論、アプリケーション全体のクローン、エミュレータのセキュリティ分離の確立は行いません。アーティファクトのハッシュは来歴を記録するものであり、カプセルの認証は行いません。使用権のあるアーティファクトのみを抽出・再配布してください。
テストでは、手書きのアルゴリズム代替物ではなく、実際の完全なライブラリアーティファクトを使用しています:
| 検体 | 元のコード | 独立した比較 |
|---|---|---|
| LZ4 v1.10.0 初期化済みストリーム | 12,548 コードバイト、26 関数 | 元の create/compress/save/free、新規プロセス間での正確な継続出力、辞書読み取りエビデンス、ネイティブの独立デコード |
| LZ4 v1.10.0 デコンプレッサ | 2,456 バイト、3 関数 | 128 の完全ネイティブコントロール、不正なブロック、短い出力、元の静的データ、宣言された memmove、ストリップされたヘルパー名 |
| xxHash v0.8.3 XXH32、O2 | 308 バイト | 本番 Wasm における 550 の異なる入力/シードの組み合わせ |
| xxHash v0.8.3 XXH32、別途コンパイルされた O1 | 284 バイト | 同じ 550 の組み合わせ、異なる元の命令 |
初期化済みストリームは、最初の 65,536 バイトのパケットを 8,459 バイトに圧縮し、復元後の異なる 32,768 バイトのパケットを 6,795 に圧縮します(新規ストリームでは 8,355)。保持された入力とコンパイルされた saveDict パスの両方が、独立したネイティブオラクルと正確に一致します。ブラウザ Studio のライフサイクルも 8,459/6,795 バイトを計算し、保持された履歴から 8,205 バイトを読み取り、freeStream を通じてネイティブヒープを解放しました。これらは有限の機能比較であり、スループットのベンチマークではありません。
xxHash のネイティブコントロールはさらに、4つの実際のポインタアライメントをカバーし、合計 4,400 のネイティブ呼び出しになります。本番のポインタは現在アライメントされています。ソースライセンス、リテラルのオラクル入力/結果、アーティファクトハッシュ、コンパイラコマンドは examples/ に保持されています。これらの有限のコントロールは宣言されたスコープを裏付けるものであり、普遍的な等価性や性能の証明ではありません。
ソースチェックアウトからリリースゲートを実行します:
python3 -m pip install -e .
python3 -m unittest discover -s tests
node --test tests/*.test.cjs tests/*.test.mjs
node examples/xxhash/check-node.cjs
Apple Silicon では、python3 examples/xxhash/build-native-oracle.py /tmp/new-xxhash-proof を実行すると、両方の完全なネイティブコントロールが新しいディレクトリに再ビルドされ、保持されているオラクルと比較されます。オブジェクトオラクルは、Apple Silicon 上で固定された既知ソースの LZ4 フィクスチャを使用し、python3 examples/native-objects/build-native-oracle.py /tmp/new-object-proof で再現できます。ネイティブロードはこれらの制御されたフィクスチャ生成器に限定されており、製品の抽出はバイトを解析し、実行には Wasm を使用します。
Python パーサーと Capstone の逆アセンブリによって、検査可能な依存関係カプセルが構築されます。JavaScript ランタイムは、確立された CPU エミュレーションプロジェクトである Unicorn.js と Unicorn を通じてそれらのバイトを実行します。ネイティブ命令のブラウザ実行は、これらのプロジェクトの能力です。
Capsulith は、抽出、宣言されたコントラクト、アクセス可能な実行証拠、および独立して再利用可能なエクスポートを組み合わせており、現在では明示的に初期化されたオブジェクトの所有権と分離されたチェックポイントの継続を含みます。エミュレーション、バイナリ解析、または関数分離を発明したとは主張していません。LZ4 と xxHash は公開された検証可能な検体であり、その既存のソースは直接 Wasm にコンパイルすることもできます。カプセルワークフローは、分離された機能を保持したいサポート対象のコンパイル済みアーティファクトを対象としています。