> For AI agents: the complete documentation index is available at https://renmori.mewbaka.cn/ja/llms.txt, the full documentation bundle is available at https://renmori.mewbaka.cn/ja/llms-full.txt.

# 保護強度とクローズドプラグイン

RenMori はオープンコアアーキテクチャを採用しています。オープンソースの `renmori` CLI がアーカイブ化、検証と CI 連携を担い、固定のオープンソースのベースライン形式を内蔵しています。完全な強度の保護は、クローズドのネイティブプラグインが提供します。プラグイン自体は無料のビルド済みバイナリであり、非公開なのはそのソースコードのみです。

## 2 つの保護強度

| 項目            | ベースライン保護                                  | フル保護                                    |
| ------------- | ----------------------------------------- | --------------------------------------- |
| 有効化の方法        | `--strength baseline`                     | デフォルト、または `--strength` でプラグインが宣言する強度を指定 |
| プラグインの要否      | 不要（ダウンロードも呼び出しもしない）                       | 必要（初回使用時に自動ダウンロード）                      |
| コンテナ形式        | 固定・公開のコンテナ形式 v1                           | ビルドごとにランダム化されるポリモーフィック形式                |
| 鍵             | ビルドごとに生成、または環境変数から読み込み、ローダー拡張に平文で書き込む     | プラグインが実行時に導出し、ディスク上に平文の鍵を保存しない          |
| スクリプト層        | コンパイル済みスクリプトを独立したスクリプト鍵で再暗号化              | プラグインが実行（ビルドごとの AST エンコード変換を含む）         |
| ネイティブコアとランチャー | なし                                        | ネイティブコア、任意でネイティブランチャー（`--launcher`）     |
| オフラインでの実行     | 常に可能                                      | プラグインのキャッシュ後は可能                         |
| 防御できる対象       | `unrpa`、`unrpyc` などの既存のアンパックツールやデコンパイルツール | 既存のツールに加え、単一の形式を対象に作られた汎用アンパッカー         |
| 適した場面         | 開発中のデバッグ、完全なオフライン環境、プラグインを使用できない場合        | 正式なリリース                                 |

:::warning
ベースライン形式はコンテナの構造が公開されており、鍵とリーダーが平文でゲームと共に配布されます。既存のツールを無効化することはできますが、標的を絞った攻撃者に対しては実質的な保護になりません。正式なリリースにはフル保護を使用してください。両者の脅威モデルは[脅威モデル](https://renmori.mewbaka.cn/ja/technical/threat-model.md)を参照してください。
:::

## 強度の決定方法

| `--strength` または `strength` | プラグインが利用可能                       | プラグインが利用不可                    |
| --------------------------- | -------------------------------- | ----------------------------- |
| 未設定                         | プラグインが宣言する最も強い強度を使用              | 終了コード 2 で失敗し、ベースラインへの格下げは行わない |
| `baseline`                  | プラグインを使用せず、ベースラインを使用             | ベースラインを使用                     |
| `auto`                      | プラグインが宣言する最も強い強度を使用              | ベースラインを使用                     |
| その他の値                       | プラグインがその値に対応していれば使用し、対応していなければ失敗 | 終了コード 2 で失敗                   |

デフォルトの動作が自動的な格下げよりも失敗を選ぶのは、ベースライン強度しか持たないビルドを気付かないままリリースすることを防ぐためです。「プラグインがあればフル保護、なければベースライン」という動作が必要な場合は、`auto` を明示的に指定してください。

## プラグインの取得順序

プラグインが必要な場合、`renmori` は以下の順序で探し、最初に利用可能だったものを使用します。

1. `--plugin PATH` で指定したファイル
2. 環境変数 `RENMORI_PLUGIN` で指定したファイル
3. ローカルキャッシュ内のプラグイン
4. 公開 Release からの自動ダウンロード

指定したパスが存在しない場合は、stderr にその旨を表示して次の手順に進みます。`RENMORI_NO_DOWNLOAD` を設定した場合は手順 4 をスキップします。

## 自動ダウンロード

### プラットフォームとファイル

| `renmori` を実行するプラットフォーム | ダウンロードされるファイル                |
| ----------------------- | ---------------------------- |
| Windows x64             | `renmori-plugin-win-x64.exe` |
| Linux x64               | `renmori-plugin-linux-x64`   |
| macOS Apple シリコン        | `renmori-plugin-mac-arm64`   |
| macOS Intel             | `renmori-plugin-mac-x86_64`  |

プラグインは `renmori` を実行するプラットフォームに応じて選択され、ゲームの対象プラットフォームとは関係ありません。対象プラットフォームは `--platforms` または自動検出によって決まります。上表以外のプラットフォームにはダウンロード可能なプラグインがないため、`--plugin` で指定するか、ベースライン保護を使用するしかありません。

### ダウンロードの手順

1. ダウンロード先の決定：デフォルトは `https://github.com/MewBaka/RenMori/releases/download/<tag>/` で、`<tag>` のデフォルトは現在のバージョンに組み込まれたプラグインタグ（`RENMORI_PLUGIN_TAG` で上書き可能）。`RENMORI_PLUGIN_BASE_URL` を設定した場合はそのアドレスからダウンロード
2. 確認：対話型端末では `Full protection needs the closed plugin. Download <asset> from <url> ? [Y/n]` と表示し、`n` または `no` と回答するとダウンロードを中止（CLI の出力言語は中国語または英語のみであり、ここでは英語出力の文言を示す）。CI、非対話環境、`--quiet` または `-y` の場合は確認せずにダウンロード
3. 同じアドレスにある `SHA256SUMS` を取得し、対象ファイルのチェックサムを探す。該当するエントリが見つからない場合は中止
4. プラグインファイルをダウンロードして SHA-256 を計算し、`SHA256SUMS` と照合。一致しない場合はファイルを破棄し、`Downloaded plugin failed its checksum; discarded` と表示
5. まず一時ファイルに書き込み、その後アトミックにキャッシュパスへ置き換え。macOS と Linux では実行権限を設定

いずれかの手順が失敗した場合、プラグインは利用不可とみなされます。強度が未設定の場合はコマンドが失敗し、`auto` の場合はベースラインにフォールバックします。

### キャッシュの場所

| プラットフォーム    | キャッシュディレクトリ                                                                       |
| ----------- | --------------------------------------------------------------------------------- |
| Windows     | `%LOCALAPPDATA%\renmori\plugin\<tag>\`                                            |
| macOS、Linux | `$XDG_CACHE_HOME/renmori/plugin/<tag>/`（未設定の場合は `~/.cache/renmori/plugin/<tag>/`） |

キャッシュは Release タグごとのディレクトリに保存されるため、`renmori` をアップグレードしたり `RENMORI_PLUGIN_TAG` を変更したりすると、対応するタグの新しいディレクトリが使用されます。キャッシュディレクトリを削除すれば、強制的に再ダウンロードできます。

## 環境変数

| 環境変数                      | 機能                                                |
| ------------------------- | ------------------------------------------------- |
| `RENMORI_PLUGIN`          | 指定したパスのプラグインを使用し、キャッシュとダウンロードをスキップ。`--plugin` と同等 |
| `RENMORI_NO_DOWNLOAD`     | 空でない任意の値を設定すると一切ダウンロードしない。既存のキャッシュは引き続き使用         |
| `RENMORI_PLUGIN_BASE_URL` | プラグインと `SHA256SUMS` をこのアドレスから取得。社内ミラー向け           |
| `RENMORI_PLUGIN_TAG`      | Release タグを指定し、キャッシュのサブディレクトリも決定                  |

## オフライン環境と社内ネットワーク

- **事前キャッシュ**：ネットワークに接続できるマシンで一度フル保護を実行し、キャッシュディレクトリをオフラインマシンの同じ場所にコピー
- **パスの固定**：プラグインファイルをビルドマシンに配置し、`RENMORI_PLUGIN` または `--plugin` で指定
- **社内ミラー**：社内サーバーでプラグインファイルと `SHA256SUMS` の両方を提供し、`RENMORI_PLUGIN_BASE_URL` でそのアドレスを指定
- **ネットワークアクセスの禁止**：`RENMORI_NO_DOWNLOAD=1` を設定し、ビルド処理が一切ネットワークリクエストを発行しないようにする

CI でプラグインをキャッシュする方法は[CI との連携](https://renmori.mewbaka.cn/ja/integration/ci.md)を参照してください。

## ケイパビリティハンドシェイク

プラグインを使用する前に、`renmori` は `capabilities` サブコマンドでプラグインを呼び出し、返された JSON を読み取ります。この JSON には、プラグインが対応するインターフェースバージョンと利用可能な強度のリストが含まれます。以下の場合、プラグインは利用不可とみなされます。

- プラグインを実行できない、0 以外の終了コードを返す、または 30 秒以内に応答しない
- 返された内容が有効な JSON ではない
- インターフェースバージョンが `renmori` の要求するバージョンより古い（この場合、stderr に `plugin interface … unsupported` と表示される）

ハンドシェイクに成功すると、`renmori` は `protect` サブコマンドでプラグインを呼び出し、ソースディレクトリ、出力ディレクトリ、強度、プラットフォーム、ランチャー、除外リスト、チャンクサイズとロックダウン設定を含むリクエスト JSON を stdin 経由で渡し、プラグインの stdout の最終行から結果を読み取ります。プラグインの進捗情報は直接 stderr に出力されます。プラグインのファイル名が `.py` で終わる場合は現在の Python インタープリタで実行し、それ以外の場合は直接実行します。

オープンソースのツールとクローズドプラグインの間の完全なプロセスインターフェースは、[オープン部分とクローズド部分のインターフェース](https://renmori.mewbaka.cn/ja/technical/plugin-interface.md)を参照してください。
