reashield について
REAShieldは、自社のJavaScript、Electron、Pythonアプリを自動リバースエンジニアリングから守るためのツールです。ロジックのサーバー移行、暗号化、実行時の動的化などで配布物を保護し、効果を測定できます。
主な機能
- 01JavaScript、Electron、Pythonアプリの保護
- 02機密ロジックのサーバー移行
- 03暗号化と実行時の動的化
- 04バンドラープラグインによる統合
- 05保護前後の復元結果を測定
活用シーン
- 01アプリに含まれる機密ロジックを保護
- 02ElectronのIPCチャンネルを動的に書き換え
- 03リバースエンジニアリングツールで効果を検証
MCP 対応
REAShieldはプロジェクトの検査、保護、測定を行うMCPサーバーを提供します。reashield_doctor、reashield_harden、reashield_measureの各ツールを公開し、MCPクライアントからstdioコマンドで接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
REAShield

REAはあらゆるアプリをリバースエンジニアリングします。REAShieldは解析結果を空にします。
REA — GitHubでトレンド第1位のリポジトリ — を使えば、AI エージェントがソースコードなしで、1つのコマンドから出荷済みアプリをリバースエンジニアリングできます。 REAShieldはその防御策です。 ビルドに組み込むだけで、出荷するコード(JavaScript/Electron/Python)を強化し、自動リバースエンジニアリングで何も得られないようにします。
主張ではなく、実際の攻撃者を使った測定
- REA(
rea-agents)は、保護されたトークンを6個復元しましたが、強化後は0個でした。 - webcrackは、強化後のクライアントを完全に難読化解除し(変更1103件、文字列配列をデコード)、それでも0個しか復元できませんでした。秘密情報は難読化しただけでなく、移動・封印されていたためです。
npm i -D reashield
npx reashield build # hardened client + generated server skeleton
npx reashield test --rea # run the REAL REA on before/after; score what it recovers
Python フロントエンド:pip install reashield(python/を参照)。
正直な保証と限界 — お読みください
オフラインのコードを解読不能にすることはできません。 マシン上で実行する必要があるコードは、そのマシン上に存在するため、労力をかければ常に抽出できます。難読化、WASM、バイトコードでできるのはコストを上げることだけです。REAShieldの役割は、自動化された攻撃(REAが先ほど誰もが使えるようにした攻撃)を防ぎ、人間のアナリストが解析に要する時間を数分から数日に延ばすことです。真に復元不可能なコードは、出荷しないコードだけです。サーバー側で実行してください(
mode: "relocate")。防御専用で、動作を維持し、透明性があり(外部への通信なし)、自分が所有し出荷するコードを強化します。他者のDRM、ライセンスチェック、アンチチートの回避には役立ちません。
AI エージェントから使用する(MCP サーバー)
REAは、エージェントにリバースエンジニアリングツールを提供するMCP サーバーです。REAShieldはその防御版を提供します。エージェントに強化ツールを渡すMCP サーバーにより、Claude Code/Cursorからチャットでプロジェクトを調査し、強化し、測定できます。
ツール:reashield_doctor(公開されているものを確認)、reashield_harden(強化を実行)、reashield_measure(実際のREAを実行し、復元スコアを報告)。
# Claude Code
claude mcp add reashield -- npx -y reashield-mcp
# Cursor / other MCP clients — add to your MCP config:
# { "mcpServers": { "reashield": { "command": "npx", "args": ["-y", "reashield-mcp"] } } }
2つのフロントエンド、1つのアーキテクチャ
REAShieldはモノレポです。同じく堅牢な設計思想 — 秘密情報をデバイス外へ移動し、静的な情報を実行時の情報に変え、その結果を測定する — を2つのエコシステム向けに実装しています。
| フロントエンド | インストール | 保護対象 | 状態 |
|---|---|---|---|
| JavaScript / npm / Electron(このパッケージ) | npm i -D reashield | 出荷するJSバンドル、app.asar | 公開済み |
Python(python/) | pip install -e python | 出荷する.pyアプリ | このリポジトリ内 |
どちらも、以下の柱の順序を共有しています。Pythonパッケージには、移動、封印(AES-GCM)、文字列の間接参照、名前の難読化、多態性、デコイ、測定用ハーネスが反映されています。また、誤ったコンパイルを行わず、処理を拒否する安全性アナライザーも備えています。python/README.mdを参照してください。
インタープリター型/ソースコードを出荷する言語が自然な適用先です。ネイティブコードにコンパイルされる言語(Go、Rust、C/C++)はソースコードを出荷せず、リバースエンジニアリングの手法も異なります。
これが機能する理由(脅威モデル)
REA の JavaScript/Electron パスは静的で、アプリを実行することはありません。バンドルを読み取り、モジュール、インポート、ルート、IPC チャネル、文字列のグラフを再構築してから、コーディングエージェントに推論用の簡潔な要約を渡します。実行時に計算されるものは解決できないことを正直に示し、グラフが大きくなりすぎると関係性を省きます。
そのため、持続的な防御策は、シークレットをデバイスの外に移すか、静的な事実を実行時の事実に変えて REA が解決できないようにするかのどちらかです。LLM を活用した逆難読化によって最も早く効果が薄れる単純な難読化は、土台ではなく、交換可能な外側の覆いにすぎません。
防御の柱(耐久性の高い順)
| 柱 | mode / レイヤー | 機能 | 正直な限界 |
|---|---|---|---|
| サーバー側への移行 | relocate | 実際の本体を生成されたサーバースケルトンに移し、1 つのエンドポイントを介して不透明なリモート呼び出しスタブのみを配布します。シークレットは配布されません。 | セキュリティで保護されたバックエンドが必要です。リクエストとレスポンスの境界は観察可能です。 |
暗号化シール(max) | seal | モジュールを暗号文として配布し、サーバーから取得したキーを使って実行時に復号します。 | 接続が必要です。復号されたメモリを人がダンプすることは防げません。 |
| WASM | wasm | 数値サブセットのロジックを実際の WebAssembly モジュールにコンパイルし、REA の JS グラフパスから外します。 | 数値サブセットのみが対象です。対象外では obfuscate にフォールバックし、その旨が報告されます。WASM も逆コンパイルされる可能性があります。 |
動的グラフ(max) | dynamicGraph | 計算されるインポートと実行時ディスパッチテーブルにより、REA が復元する呼び出し/インポートのエッジを削除します。 | CPU コストがかかります。保護された領域に限定されます。 |
| グラフの枯渇 | flattenBundle、stripSourceMaps、stringIndirection、dynamicChannels | 1 つのモジュールにまとめ、マップをなくし、意味のある平文文字列をなくし、チャネル名を計算するようにします。 | 難読化の効果は時間とともに薄れます。 |
| ポリモーフィズム | polymorphic | ビルドごとに名前、文字列、構造を再ランダム化し、バージョン間の差分比較を防ぎます。 | 単独では表面的な効果にすぎません。上記の対策と組み合わせてください。 |
| デコイ | decoys | もっともらしいルート/IPC/キー文字列を含む、機能に見せかけた無効なクラスタ(ハブ+リング状にリンクされたメンバー+偽のエントリーポイント)を作成し、REA の要約で中心的に見えるように構成します。 | 実験的な機能です。測定済みですが、サイズが増える場合があります。 |
| 整合性 | integrity(オフ) | フェイルセーフの改ざん防止機能です。 | REA の静的パスは防御しません(REA はアプリを実行しません)。 |
インストール
npm install --save-dev reashield
クイックスタート
npx reashield init # scaffold shield.config.cjs
npx reashield build # emit hardened client + server skeleton
npx reashield doctor # show config, layers, costs, deps
npx reashield test # measure before vs after (static; add --rea for real REA)
設定(shield.config.cjs)
module.exports = {
input: "src/index.js",
output: "dist-shielded",
preset: "balanced", // low | balanced | max
protect: [
{ name: "licenseCheck", mode: "relocate" }, // strongest: off-device
{ name: "sealedCalc", mode: "seal" }, // ciphertext + remote key (max)
{ name: "pricingLogic", mode: "wasm" }, // off the JS graph (fast-follow)
{ name: "featureGate", mode: "obfuscate" }, // harden in place
],
server: {
enabled: true, out: "server-shielded", adapter: "express",
endpoint: "/__s", keyEndpoint: "/__s/k", decoyCalls: false,
},
polymorphic: { enabled: true, seed: "auto" }, // "auto" rotates every build
layers: {
stripSourceMaps: true, flattenBundle: true, obfuscate: true,
stringIndirection: true, dynamicChannels: true, dynamicGraph: false,
decoys: { enabled: true, count: 5 }, integrity: false,
},
};
protect: ["a", "b"](通常の文字列配列)も使用できます。この場合、各項目のデフォルトは
mode: "obfuscate" です。また、package.json の reashield キーの下に設定を記述することもできます。
プリセット
- low — マップを削除し、フラット化して、名前をマングルします。高速で、サイズも最小限です。
- balanced(デフォルト)— 文字列の間接参照、名前の均質化、計算されるチャネル名、不透明な移行境界、構造的ポリモーフィズム、5 個のデコイを追加します。コストは低めです。
- max — 動的ディスパッチ、暗号化シール、デコイ呼び出し、制御フローのフラット化、デッドコードの挿入、自己防御、約 15 個のデコイを追加します。レイテンシー/CPU/サイズが増加します。
doctorがその旨を通知します。
バンドラープラグイン(既存のビルド内でハードニングを実行)
CLI の代わりに、esbuild/Rollup/Vite のビルドの一部としてハードニングを実行できます。プラグインはモジュールごとにソースレベルの柱を適用し、その後、各出力チャンクを最終処理して(デコイ+難読化+ソースマップの削除+クライアントランタイムの挿入)、サーバースケルトンを書き込みます。flattenBundle はここでは何もしません。バンドラーですでにバンドルされているため、プラグインはその出力をハードニングします。プラグインが設定するグローバルを使って、移行/シールのトランスポートを一度設定してください。
globalThis.__configureShield({ transport, keyTransport })(または、デフォルトの fetch トランスポートにエンドポイントを呼び出させます)。
// rollup.config.mjs
import { reashieldRollup } from "reashield/plugins";
export default {
input: "src/index.js",
output: { dir: "dist", format: "esm" },
plugins: [reashieldRollup({ configPath: "shield.config.cjs" })],
};
// vite.config.mjs (Vite consumes the Rollup plugin interface)
import { reashieldVite } from "reashield/plugins";
export default { plugins: [reashieldVite({ configPath: "shield.config.cjs" })] };
// esbuild build script
import { build } from "esbuild";
import { reashieldEsbuild } from "reashield/plugins";
await build({
entryPoints: ["src/index.js"],
bundle: true,
outdir: "dist",
plugins: [reashieldEsbuild({ configPath: "shield.config.cjs" })],
});
各プラグインは { config | configPath, cwd, seed } を受け取ります。注意:プラグインは出力されるすべての JS チャンクをハードニングするため、難読化のコストは出力全体にかかります。ビルドの対象範囲を適切に絞ってください。
生成されるサーバーのスケルトン
relocate と seal は、実際のロジックと鍵を含む server-shielded/ ディレクトリを生成します。ユーザーに配布しないでください。 独自の認証と TLS の背後で実行します。REAShield は Express/Fastify の配線と、テスト用のインプロセスハンドラーを生成します。エンドポイントのセキュリティ確保はユーザーの責任です(認証は追加されません)。
認証の接続箇所(ユーザー側で設定します)。 setAuthVerifier を呼び出すまでは、エンドポイントは公開状態です。配布前に必ず保護してください。クライアントは設定したソースからトークンを添付し、サーバーがそれを検証します。
// server
import { setAuthVerifier } from "./server-shielded/handlers.js";
setAuthVerifier(async (token, ctx) => (await myAuth.verify(token)) === true);
// client (wire once at startup)
__configureShield({ authToken: () => myAuth.currentToken() }); // (or globalThis.__configureShield in plugin builds)
アダプター。 adapter: "express" | "fastify" | "web" | "generic"。スケルトンは常に、Hono、Cloudflare Workers、Deno、Bun、または Next.js のルートハンドラーに組み込める、ランタイムをまたいで使用できる webHandler(request: Request): Promise<Response> をエクスポートします。
import { webHandler } from "./server-shielded/handlers.js";
export const POST = (req) => webHandler(req); // Next.js app route, Workers fetch, ...
移動または封印された関数は(往復処理を行うため)async になります。呼び出し元で await するようにしてください。また、関数は自己完結型でなければなりません(クライアント側のモジュール状態をクロージャーで参照しないでください)。
動作の保持
ハードニングによって、プログラムの動作が変わることは決してありません。同梱の例(examples/sample-package)では、移動および封印されたコードを含め、ハードニングの前後で出力が同一であることを、インプロセスサーバー経由で実行して検証します。また、デコイが実行されないこともアサートします。npm run example:test で実行できます。
Electron のハードニング
Electron アプリ向けに、REAShield は Electron 専用の経路を追加します(上記の JS の各柱と併用してください)。
- 動的 IPC チャネルの書き換え — リテラルの
ipcMain/ipcRenderer/webContentsチャネル文字列を、実行時に計算される文字列に変換します。REA は設計上、動的に計算される IPC 名を解決せず、これによりグラフの解析情報を直接枯渇させます。値は保持されます。両側で同一の文字列が計算されます。layers.ipcChannels: trueで有効にするか、単独で実行します。npx reashield electron ipc src/main.js --out dist/main.js - V8 バイトコード(
bytenode)—.jscを配布し、asar 内に読み取り可能な JS が含まれないようにします。
注意点: V8 バイトコードは正確な V8 バージョンに依存します。対象の Electron の Node/V8 でコンパイルしてください。そうしないとnpx reashield electron bytecode dist/main.js --out dist/main.jsc.jscは読み込まれません。自動化された静的 JS 解析のコストを高めますが、解読不能になるわけではありません。 - 防御的なフューズ(
@electron/fuses)— パッケージ化されたバイナリを、強化されたデフォルト設定に切り替えます(RunAsNode、Node CLI の inspect 引数、NODE_OPTIONSを無効化し、埋め込み ASAR 整合性検証とOnlyLoadAppFromAsarを有効化します)。パッケージ化後、afterPackで実行します。npx reashield electron fuses path/to/YourApp # --dry to preview
bytenode と @electron/fuses は任意の依存関係であり、これらのコマンドを使用した場合にのみ読み込まれます。プログラムから利用する場合:import { rewriteIpcChannels, compileToBytecode, recommendedFuses, applyFuses } from "reashield/electron"。
WASM バックエンド(重要な数値処理)
関数に mode: "wasm" を指定すると、REAShield はそれを実際の WebAssembly モジュールにコンパイルします(外部ツールチェーンを必要とせず、バイナリとして生成されます)。モジュールは同期的にインスタンス化されるため、動作は変わりません。これにより、算術処理は wasm バイト列内に置かれ、REA の JS モジュールグラフの解析経路から外れます。現在サポートされているのは、数値パラメーター、const ローカル変数、return、+ - * /、単項の -、比較/&&/||/! 条件を使った三項演算子、Math.(max|min|abs|floor|ceil|round|sqrt|trunc) です。この範囲外のものはインプレース難読化にフォールバックし、その旨が報告されます(通知なしに切り替わることはありません)。正直な限界として、wasm はより難しく、異なる分析領域に対するものですが、解読不能になるわけではありません。
耐久性:信頼せず、測定する
REA は頻繁にリリースされます。reashield test は独自の加工前後の成果物を比較してベースラインを書き込みます。コミット済みの GitHub Action(.github/workflows/reashield-regression.yml)は、rea-agents の各バージョンを組み合わせたマトリックスで再測定し、新しい REA がベースラインで許容される範囲を超えて復元できた場合に失敗します。シールドの強度を長期にわたって保つのは、このリグレッションゲートであり、個々の難読化手法ではありません。
rea-agents は任意の開発依存関係です。インストールされていない場合、reashield test は静的なプロキシ指標(ソースマップ、インポートのエッジ、文字列の漏えい、保護対象名の漏えい、秘密文字列の削除)にフォールバックします。
ロードマップ
✅ バンドラープラグイン(esbuild/Rollup/Vite) · ✅ Electron 対応(bytenode、防御的なフューズ、動的 IPC 書き換え) · ✅ WASM バックエンド(数値サブセットから実際の wasm へ)。
次の予定:WASM サブセットの拡張(制御フロー、文字列) · サーバーアダプターと認証ヘルパーの拡充 · 要約ビューに合わせたデコイ · ASAR パッケージング統合ヘルパー。
ライセンス
MIT。ご自身が所有し、配布するコードを保護するためにお使いください。ここにあるものは、他人のソフトウェアを攻撃するためのものではありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。