バージョン 1.0.0
2026年2月
有限会社 パオ・アット・オフィス
https://www.pao.ac/
2.2 必要な環境
3.2 macOS
4.3 保護したバイナリを実行してみよう
5.8 Swift
6.4 プロジェクトファイル
7.3 CI/CD での活用
8.6 注意事項
9.5 制限事項
PaoZip Studio は、コンパイル済みのバイナリファイル(.exe, .dll, .jar など)を丸ごと暗号化して保護するツールです。
普通のソフトウェアは、リバースエンジニアリングツールを使えば、中のロジックをかなり読み取れてしまいます。特に .NET や Java はバイトコードなので、元のソースコードに近い形まで復元できてしまうことも。
PaoZip Studio を使えば——
あなたのアプリ.exe → 暗号化 → 保護されたアプリ.exe
これだけです。 保護されたアプリは、エンドユーザーからは今まで通り普通に使えます。でも中身を覗こうとしても、暗号化されたデータしか見えません。
┌───────────────────────────────────────────────────────────┐
│ PaoZip Studio でできること │
├───────────────────────────────────────────────────────────┤
│ │
│ .NET の .exe / .dll ──→ 暗号化して保護 │
│ Java の .jar ──→ 暗号化して保護 │
│ Go のバイナリ ──→ 暗号化して保護 │
│ C / C++ のバイナリ ──→ 暗号化して保護 │
│ Dart CLI のバイナリ ──→ 暗号化して保護 │
│ Flutter デスクトップ ──→ 暗号化して保護 │
│ Rust のバイナリ ──→ 暗号化して保護 │
│ Swift のバイナリ ──→ 暗号化して保護 │
│ │
│ GUI でもCLI でも。Windows でも macOS でも。 │
│ │
└───────────────────────────────────────────────────────────┘
しかも——
| 言語 | 入力 | 保護方式 | 特記事項 |
|---|---|---|---|
| .NET | .exe / .dll | ネイティブランチャー | Framework / .NET 5+ 両対応 |
| Java | .jar | ネイティブランチャー / ライブラリ保護 | 実行可能 JAR・ライブラリ JAR 両対応 |
| Go | .exe / バイナリ | ネイティブランチャー | |
| C | .exe / バイナリ | ネイティブランチャー | |
| C++ | .exe / バイナリ | ネイティブランチャー | |
| Dart CLI | .exe / バイナリ | ネイティブランチャー | dart compile exe の出力 |
| Flutter | デスクトップアプリ | Flutter専用ランチャー | data/app.so を暗号化 |
| Rust | .exe / バイナリ | ネイティブランチャー | |
| Swift | .exe / バイナリ | ネイティブランチャー |
全言語統一アーキテクチャ: すべてのコンパイル型言語で、同一のネイティブ C ランチャー方式を採用しています。 暗号化されたペイロードをランチャー内に埋め込み、実行時にテンプディレクトリに展開→実行→削除します。 詳しくは 8.2 保護の仕組み をご覧ください。
PaoZip Studio の保護は、こんな感じで動きます。
保護するとき(あなたの PC で):
あなたのアプリ.exe
│
▼
┌──────────────┐
│ 暗号化エンジン │ ← ランダムな暗号鍵を生成
│ (zencode) │ ← zlib圧縮 → XOR暗号化 → ビット反転
└──────────────┘
│
▼
┌──────────────┐ ┌──────────────┐
│ ランチャー │ + │ 暗号化データ │
│ (自動生成) │ │ (ペイロード) │
└──────────────┘ └──────────────┘
│ │
└──────┬───────────────┘
▼
保護されたアプリ.exe ← これを配布!
エンドユーザーが実行するとき:
保護されたアプリ.exe をダブルクリック
│
▼
ランチャーが起動
│
▼
暗号化データを復号
│
▼
元のアプリを実行 ← ユーザーには普通のアプリに見える
│
▼
アプリ終了
│
▼
復号データを削除 ← 痕跡を残さない!
ポイント: - 暗号鍵はランチャーの中に難読化して埋め込まれます - 復号されたデータは実行後に自動削除されます - エンドユーザーは保護されていることに気づきません
PaoZip Studio の他に、言語ごとの「paozip for ○○」というツールもあります。何が違うのでしょう?
【paozip for Python / PHP / Dart / ...】
ソースコードを暗号化
→ 開発・配布フェーズで使う
→ import / include で透過的に復号
【PaoZip Studio】
コンパイル済みバイナリを暗号化
→ ビルド後・納品フェーズで使う
→ 実行時に自動的に復号&実行
| 比較 | 言語別ツール | PaoZip Studio |
|---|---|---|
| 保護対象 | ソースコード | コンパイル済みバイナリ |
| 使うタイミング | 開発中〜配布前 | ビルド後〜納品 |
| 特に有効な場面 | コードの秘匿 | リバースエンジニアリング対策 |
| 併用 | 可能(二重保護!) | 可能(二重保護!) |
両方使えば、ソースもバイナリも保護できます。最強の組み合わせです。
| OS | GUI | CLI | 状態 |
|---|---|---|---|
| Windows 10/11 (x64) | PaoZip Studio (WPF / MAUI) | paozip protect | 対応済み |
| macOS 14+ (Apple Silicon / Intel) | PaoZip Studio (MAUI) | paozip protect | 対応済み |
Windows(GUI + CLI): - .NET ランタイム不要(自己完結型バイナリとして配布) - 追加のコンパイラやツールは一切不要
macOS:
- macOS 14 (Sonoma) 以降
- Xcode Command Line Tools(clang コンパイラが必要)
Windows 版 は、事前コンパイル済みランチャーテンプレートを使用するため、GCC 等の外部コンパイラは不要です。 macOS 版 では、Xcode Command Line Tools をインストールしてください(
xcode-select --install)。 .NET や Java のアプリを保護する際にも、保護ツール側に追加の SDK は不要です。 (もちろん、保護する前のビルドには各言語の開発ツールが必要です)
Step 1: ダウンロードした ZIP を解凍します。
PaoZip Studio/
├── Paozip.Studio.exe ← GUI アプリ(ダブルクリックで起動)
├── Paozip.Cli.exe ← CLI ツール(コマンド名: paozip)
└── Templates/
├── launcher_generic_gui.exe ← ランチャーテンプレート(汎用 / .NET 5+)
├── launcher_java.exe ← Java 用
├── launcher_flutter.exe ← Flutter Desktop 用
├── launcher_dotnetcore_linux ← .NET 5+ Linux 用
└── launcher_dotnetcore_mac ← .NET 5+ macOS 用
Step 2: 好きな場所に配置します。
インストーラーはありません。ZIP を解凍するだけです。
C:\PaoZip Studio\ や C:\Tools\PaoZip Studio\ など、お好みの場所に置いてください。
Step 3: (任意)CLI を PATH に追加します。
コマンドラインから paozip をどこでも使いたい場合は、解凍先を PATH 環境変数に追加してください。
体験版には回数制限がありますが、機能制限はありません。すべての機能を試せます。
Mac でも PaoZip Studio が使えます!
Step 1: PaoZipStudio-1.0.0.pkg をダブルクリック
Step 2: 画面の指示に従ってインストール
Step 3: Applications フォルダに「PaoZip Studio」が登場!
/Applications/
└── Paozip.Studio.Maui.app ← これが PaoZip Studio
初回起動時、macOS が「開発元が未確認のため開けません」と表示することがあります。
方法 1: 右クリック →「開く」→「開く」をクリック
方法 2: システム設定 → プライバシーとセキュリティ →「このまま開く」をクリック
これは macOS のセキュリティ機能(Gatekeeper)です。一度許可すれば、次回からはダブルクリックで起動できます。
バイナリ保護にはコンパイラ(clang)が必要です。まだインストールしていない場合:
xcode-select --install
ダイアログが表示されたら「インストール」をクリック。数分で完了します。
PaoZip Studio は .NET MAUI で開発されたネイティブ macOS アプリです。 Windows 版と同じ機能が Mac でも使えます。
ここでは、実際にアプリを保護してみましょう。驚くほど簡単です。
Step 1: PaoZip Studio を起動します。
Paozip.Studio.exe をダブルクリックPaoZip Studio を起動(または Spotlight で検索)Step 2: 保護したいファイルを選びます。
「Browse」ボタンをクリックして、保護したいファイルを選択します。 (ドラッグ&ドロップでもOK!)
対応ファイル:
Windows:
.exe → .NET / Go / C / C++ / Dart / Rust / Swift
.dll → .NET 5+ アセンブリ
.jar → Java
macOS:
バイナリ → Go / C / C++ / Dart / Rust / Swift(拡張子なし)
.jar → Java
Step 3: ファイル情報を確認します。
ファイルを選ぶと、自動的にフレームワーク検出が行われます。
Framework: .NET v10.0 ← 自動検出!
Type: Console
Size: 162,304 bytes
Types: 42
ネイティブバイナリの場合は:
Framework: Native ← .NET でも Java でもないバイナリ
Type: Windows x64 ← macOS では "macOS ARM64" や "macOS x86_64"
Size: 2,363,392 bytes
Step 4: 「Protect」ボタンをクリック!
あとは待つだけ。保護ログがリアルタイムで表示されます。
Inspecting assembly...
Framework: .NET v10.0 Type: Console
Size: 162,304 bytes Types: 42
Reading: MyApp.dll
Generating encryption key...
Encrypting... 162,304 bytes
Obfuscating key...
Generating launcher...
Launcher: .NET 5+ (template)
OK
---
Protection Complete!
Original: 162,304 bytes (1 types)
Protected: 174,843 bytes
GUI を使わずに、コマンドラインからも保護できます。
Windows:
paozip protect MyApp.exe -o out/MyApp.exe
macOS:
paozip protect myapp -o out/myapp
たったこれだけ。出力ファイル名を指定することもできます:
paozip protect MyApp.exe -o dist/MyApp.exe # Windows
paozip protect myapp -o dist/myapp # macOS
⚠ .NET 5+ アプリの制限: .NET 5+ アプリを保護する際は、入力ファイルと異なるディレクトリを
-oで指定してください。同一ディレクトリに出力しようとするとCannot protect .NET 5+ app in the same directoryエラーになります。
保護されたバイナリは、元のバイナリと同じように実行できます。
Windows:
# 保護前
MyApp.exe --input data.csv --output result.json
# 保護後(まったく同じ!)
MyApp.protected.exe --input data.csv --output result.json
macOS:
# 保護前
./myapp --input data.csv --output result.json
# 保護後(まったく同じ!)
./myapp.protected --input data.csv --output result.json
引数も、終了コードも、標準出力も——全部そのまま。 エンドユーザーには、保護されていることがわかりません。
保護済みバイナリを再度保護しようとすると、ちゃんとエラーになります。二重保護はできません(安全設計!)。
PaoZip Studio は、入力ファイルを自動判別します。 .NET なのか Java なのかネイティブバイナリなのか——あなたが選ぶ必要はありません。
対応フレームワーク: - .NET Framework 4.x(.exe 直接保護) - .NET 5 / 6 / 7 / 8 / 9 / 10+(.exe を入れれば自動で .dll を検出)
保護方式: ネイティブランチャー(C / C++ と同一方式)
┌─────────────────────────────────────────────────────┐
│ .NET の保護イメージ │
├─────────────────────────────────────────────────────┤
│ │
│ ネイティブ C ランチャー(.exe) │
│ ┌──────────────────────────────────────────┐ │
│ │ 暗号化された元のアセンブリ(リソース埋込) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ ████████████████████████████████ │ │ │
│ │ │ ████████████████████████████████ │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ │ │
│ │ 起動時: │ │
│ │ 1. テンプディレクトリ作成 │ │
│ │ 2. 暗号化データを復号・書き出し │ │
│ │ 3. 依存 DLL・設定ファイルをコピー │ │
│ │ 4. CreateProcess で元のアプリを実行 │ │
│ │ 5. 終了後テンプディレクトリを削除 │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
使い方:
# .NET Framework
paozip protect MyApp.exe
# .NET 5+(.exe を入れれば自動で同名 .dll を検出・保護。-o で別ディレクトリを指定)
paozip protect MyApp.exe -o protected/MyApp.exe
# macOS .app バンドル(MAUI / ネイティブ)
paozip protect MyApp.app
⚠ .NET 5+ は同一ディレクトリへの出力不可: .NET 5+ アプリを保護する際は
-oで異なるディレクトリを指定してください。同一ディレクトリに出力しようとするとエラーになります。
ポイント:
- 出力はネイティブ C ランチャー(.exe)です
- .NET 5+ は .exe(apphost)をドラッグ&ドロップするだけで、同名の .dll を自動検出して保護します(.dll を直接指定する必要はありません)
- .NET Framework: 依存 DLL と .config をランチャーの隣に配置してください
- .NET 5+: 依存 DLL と .json(runtimeconfig, deps)をランチャーの隣に配置してください
- ランチャーは実行時にこれらをテンプディレクトリにコピーして実行します
逆コンパイル対策として最も効果的:
.NET アセンブリは IL(中間言語)で構成されているため、ILSpy や dnSpy などで簡単に逆コンパイルできてしまいます。PaoZip Studio で保護すれば、ネイティブ C ランチャーの中に暗号化された IL が埋め込まれるため、逆コンパイルツールでは中身を一切読めません。ランチャー自体はネイティブコードなので、.NET の逆コンパイルツールはそもそも認識しません。
macOS の MAUI アプリ(Mac Catalyst)は、ランチャー方式ではなく ライブラリ暗号化方式 で保護します。Mac Catalyst は実行バイナリの名前やプロセス情報でバンドルを解決するため、ランチャーで実行バイナリを差し替えると起動できなくなります。
手順:
paozip protect で .app バンドルを暗号化します:paozip protect MyApp.app
# → MonoBundle 内の DLL が暗号化されます(.dll → .dll.enc)
# → 実行バイナリ(Contents/MacOS/)はそのまま残ります
Program.cs に PaozipLoader.Initialize() を追加します:using Paozip.Runtime;
PaozipLoader.Initialize(); // ← 暗号化 DLL を実行時に復号
return DoWork(); // ← 暗号化 DLL の型を使うコードは別メソッドに分離
static int DoWork()
{
// ここでアプリの通常処理
}
Paozip.Runtime を参照追加します:<ItemGroup>
<Reference Include="paozip">
<HintPath>path/to/paozip.dll</HintPath>
</Reference>
</ItemGroup>
codesign --force --deep --sign - MyApp.app
重要:
PaozipLoader.Initialize()と暗号化 DLL の型を使うコードは 別のメソッドに分離 してください。同じメソッド内に書くと、JIT がInitialize()の前に型解決を試みて失敗します。Windows MAUI との違い: Windows 版はランチャー方式で動作するため、
PaozipLoader.Initialize()は不要です。Mac 版のみこの手順が必要です。#if MACCATALYSTで条件分岐すれば、同じソースコードで Windows / Mac 両対応できます。
対応: 実行可能 JAR(Main-Class あり)およびライブラリ JAR(Main-Class なし)
保護方式: ネイティブランチャー(C / C++ と同一方式)
paozip protect MyApp.jar
# → MyApp.exe を生成(ネイティブランチャー!)
仕組み:
- 暗号化された JAR がネイティブ C ランチャーの中にリソースとして埋め込まれます
- 起動時にテンプディレクトリに復号 → java -jar で実行 → 終了後に削除
- JAR の中身は一切見えません
# 保護前
java -jar MyApp.jar --port 8080
# 保護後(.exe をダブルクリックで実行!)
MyApp.exe --port 8080
出力が .jar → .exe に変わります。
java -jarで実行する代わりに、ダブルクリックで直接実行できるようになります。Java がインストールされている必要はありますが、ユーザーにとってより自然な起動方法になります。Java の JAR ファイルは
.classファイルの集合体で、jd-gui などで簡単にデコンパイルできます。保護すれば、ネイティブ C ランチャーの中に暗号化データとして埋め込まれるため、Java のデコンパイルツールでは全く認識できません。
対応: go build で生成された実行可能バイナリ
保護方式: ネイティブランチャー
# Go でビルド → 保護
go build -o myapp.exe main.go # Windows
paozip protect myapp.exe # → myapp.protected.exe
go build -o myapp main.go # macOS
paozip protect myapp # → myapp.protected
テスト結果(実績):
| 項目 | 値 |
|---|---|
| 元のサイズ | 2.3 MB |
| 保護後 | 1.4 MB(38% 圧縮!) |
| 引数パススルー | OK |
| 終了コード | OK |
Go バイナリはランタイムを含むため大きくなりがちですが、PaoZip Studio の圧縮効果で保護後の方が小さくなることが多いです。
対応: GCC / Clang / MSVC でコンパイルされた実行可能バイナリ
保護方式: ネイティブランチャー
# Windows
gcc -O2 -o myapp.exe myapp.c # C
g++ -O2 -o myapp.exe myapp.cpp # C++
paozip protect myapp.exe
# macOS
clang -O2 -o myapp myapp.c # C
clang++ -O2 -o myapp myapp.cpp # C++
paozip protect myapp
テスト結果:
| 言語 | 元 | 保護後 | 備考 |
|---|---|---|---|
| C | ~60 KB | ~150 KB | ランチャーテンプレート(~120KB)のオーバーヘッドにより増加 |
| C++ | ~65 KB | ~155 KB | 同上。ペイロード自体は圧縮されている |
注: 小さなバイナリ(100KB 以下)では、ランチャーテンプレートのオーバーヘッド(約 120KB)により、保護後のファイルサイズは元より大きくなります。Go や Flutter のような大きなバイナリ(数MB)では圧縮効果が上回り、保護後の方が小さくなります。
対応: dart compile exe で生成された実行可能バイナリ
保護方式: ネイティブランチャー
# Windows
dart compile exe main.dart -o myapp.exe
paozip protect myapp.exe
# macOS
dart compile exe main.dart -o myapp
paozip protect myapp
Dart CLI バイナリは AOT(事前コンパイル)で生成されるネイティブバイナリです。Go や Rust と同様の方式で保護できます。
対応: flutter build windows / flutter build macos で生成されたデスクトップアプリ
保護方式: ネイティブランチャー(Flutter 専用)
Flutter デスクトップアプリは、他のバイナリとはちょっと構造が違います。
build/windows/x64/runner/Release/
├── myapp.exe ← C++ ランナー(90KB 程度)
├── flutter_windows.dll ← Flutter エンジン
└── data/
├── app.so ← Dart コード(ここが本体!)
└── flutter_assets/ ← アセット
大事なポイント: Dart のコードは .exe ではなく data/app.so に入っています。
PaoZip Studio はこれを自動検出して、app.so だけを暗号化します。
# Release フォルダの .exe を指定するだけ
paozip protect myapp.exe
保護の流れ:
保護前: 保護後:
├── myapp.exe ├── myapp.exe ← 新しいランチャー
├── flutter_windows.dll ├── myapp_original.exe ← 元のランナー
└── data/ ├── flutter_windows.dll
├── app.so ← 5.5 MB └── data/
└── flutter_assets/ ├── app.so.enc ← 2.4 MB(暗号化)
└── flutter_assets/
仕組み:
1. ランチャー(新しい myapp.exe)が起動
2. data/app.so.enc を復号 → data/app.so を生成
3. 元の Flutter ランナー(myapp_original.exe)を実行
4. Flutter アプリが普通に動作
5. アプリ終了後、data/app.so を削除
Flutter アプリの見た目や動作は一切変わりません。ユーザーは保護されていることに気づきません。
テスト結果:
| 項目 | 値 |
|---|---|
| app.so 元サイズ | 5.5 MB |
| app.so.enc 保護後 | 2.4 MB(56% 圧縮!) |
| 動作 | 完全に正常 |
| app.so 自動削除 | OK |
対応: rustc / cargo build で生成された実行可能バイナリ
保護方式: ネイティブランチャー
# Windows
cargo build --release
paozip protect target/release/myapp.exe
# macOS
cargo build --release
paozip protect target/release/myapp
テスト結果:
| 項目 | 値 |
|---|---|
| 元のサイズ | 158 KB |
| 保護後 | 108 KB(32% 圧縮) |
| 引数パススルー | OK |
| 終了コード | OK |
対応: swiftc でコンパイルされた実行可能バイナリ
保護方式: ネイティブランチャー
# Swift でコンパイル
swiftc -O -o myapp main.swift
# 保護
paozip protect myapp.exe # Windows
paozip protect myapp # macOS
Swift on Windows と macOS の両方に対応しています。
PaoZip Studio の GUI はシンプルで直感的です。
┌──────────────────────────────────────────────────────┐
│ PaoZip Studio [─][□][×]│
├──────────────────────────────────────────────────────┤
│ File Settings Help │
├──────────────────────────────────────────────────────┤
│ │
│ ▼ Input Assembly │
│ ┌──────────────────────────────────┐ [Browse] │
│ │ C:\path\to\MyApp.exe │ │
│ └──────────────────────────────────┘ │
│ │
│ Framework: .NET v10.0 Type: Console │
│ Size: 12,345 bytes Types: 42 │
│ │
│ ▼ Output Settings │
│ ┌──────────────────────────────────┐ [Browse] │
│ │ C:\path\to\MyApp.protected.exe │ │
│ └──────────────────────────────────┘ │
│ ☑ Copy .config file │
│ ☑ Copy dependency DLLs │
│ │
│ ▼ Protection Log │
│ ┌──────────────────────────────────────────────┐ │
│ │ Inspecting assembly... │ │
│ │ Framework: .NET v10.0 Type: Console │ │
│ │ Encrypting... 12,345 bytes │ │
│ │ Protection Complete! │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ [ ★ Protect ★ ] │
│ │
├──────────────────────────────────────────────────────┤
│ Ready │
└──────────────────────────────────────────────────────┘
各セクションの説明:
| セクション | 説明 |
|---|---|
| Input Assembly | 保護したいファイルを選択。ドラッグ&ドロップにも対応。macOS では .app バンドルもドロップ可能 |
| Output Settings | 出力先パス。自動的に .protected.exe が設定される |
| Protection Log | 保護処理のリアルタイムログ |
| Protect ボタン | クリックで保護開始! |
Settings → Theme で切り替えられます。
設定はアプリ内で即座に反映されます。
Settings → Language で切り替えられます。
ログメッセージも含めて、完全にバイリンガル対応です。
よく使う設定を .paoproj ファイルとして保存・読み込みできます。
CI/CD や定型的な保護作業に便利です。
GUI を起動せずに、コマンドラインから直接保護できます。CI/CD パイプラインに組み込む場合に特に便利です。
Usage: paozip protect <input> [options]
Arguments:
<input> 保護するファイルのパス
Options:
-o <path> 出力先パスを指定(省略時: *.protected.* を自動生成)
--skip-deps-patch deps.json のパッチ処理をスキップする
ランチャー方式で companion DLL を暗号化する際に使用
Windows:
paozip protect MyApp.exe # → MyApp.protected.exe
paozip protect MyApp.exe -o dist/MyApp.exe # 出力先を指定
paozip protect MyApp.dll # .NET 5+ → MyApp.protected.dll
paozip protect MyApp.jar # Java → MyApp.protected.exe
# exe + companion DLL を両方暗号化する場合:
paozip protect MyApp.exe -o protected/MyApp.exe
paozip protect protected/MyLib.dll -o protected/MyLib_enc.dll --skip-deps-patch
mv protected/MyLib_enc.dll protected/MyLib.dll
macOS:
paozip protect myapp # → myapp.protected
paozip protect myapp -o dist/myapp # 出力先を指定
paozip protect MyApp.jar # Java → MyApp.protected
GitHub Actions の例:
steps:
- name: Build
run: dotnet publish -c Release -o dist/
- name: Protect
run: paozip protect dist/MyApp.dll -o dist/MyApp.dll
- name: Upload
uses: actions/upload-artifact@v4
with:
name: protected-app
path: dist/
Jenkins の例:
stage('Protect') {
steps {
bat 'paozip protect build\\MyApp.exe -o release\\MyApp.exe'
}
}
CLI の終了コード: 0 = 成功、1 = 失敗。CI/CD のステップ制御に使えます。
実行体(.exe)だけじゃない。ライブラリも丸ごと暗号化できます。
あなたが作った DLL や JAR を暗号化して配布すれば、 リバースエンジニアリングからライブラリの中身を守れます。 しかもユーザーのアプリからはいつも通り呼び出すだけ。 難しい設定は要りません。
💡 実行体(.exe)の暗号化との違い
- 実行体の暗号化(前章まで): ランチャーで包む → そのまま実行できる
- ライブラリの暗号化(この章): ランタイムで復号 → アプリから呼び出す
ライブラリは「実行するもの」ではなく「呼び出されるもの」なので、 ランチャーで包む方式は使えません。代わりに、ランタイムが 暗号化ライブラリを透過的に復号してメモリにロードします。
┌─────────────────────────────────────────────────────┐
│ ライブラリ暗号化の流れ │
├─────────────────────────────────────────────────────┤
│ │
│ 【開発時】 │
│ あなたの DLL/JAR/SO │
│ ↓ paozip protect │
│ 暗号化された DLL/JAR/SO + ランタイム │
│ │
│ 【ユーザーのアプリ実行時】 │
│ アプリ起動 → ランタイムが自動復号 → 普通に使える │
│ │
│ ※ 復号はメモリ上で行われます。 │
│ 復号されたファイルがディスクに残ることはありません。 │
│ │
└─────────────────────────────────────────────────────┘
| 暗号化したライブラリ | 一緒に配布するランタイム | 説明 |
|---|---|---|
MyLib.dll (.NET) |
paozip.dll |
.NET 用復号ランタイム |
MyLib.jar (Java) |
paozip.jar |
Java 用復号ランタイム |
mylib.dll / .so / .dylib (C/C++等) |
paozip_loader.dll / .so / .dylib |
ネイティブ用復号ランタイム |
ランタイムはライセンスフリーです。暗号化ライブラリと一緒に自由に再配布できます。
paozip protect MyLib.dll
これだけ! 3つのことが自動で行われます:
MyLib.dll が暗号化されますpaozip.dll(ランタイム)が同じフォルダにコピーされます*.deps.json から MyLib の参照が自動的に除去されます💡 deps.json の自動パッチ
.NET 5+ では、ランタイムが
.deps.jsonに登録されたアセンブリを 直接ロードしようとします。暗号化された DLL は有効な PE ファイルではないため、 これが失敗します。PaoZip は暗号化時に deps.json を自動的にパッチして この問題を回避します。あなたが何かする必要はありません。
ユーザーのアプリの起動コードに 1行だけ 追加してもらいます:
using Paozip.Runtime;
// アプリの最初に1回だけ呼ぶ
PaozipLoader.Initialize();
これで暗号化ライブラリは自動的に復号されてロードされます。
ユーザーのコードは一切変更不要。いつも通り using MyLib; で使えます。
暗号化ライブラリの型を使うコードは、Initialize() と別のメソッドに書いてください。
// ✅ 正しい書き方
PaozipLoader.Initialize();
RunMyApp(); // ← 暗号化DLLの型はこの中で使う
static void RunMyApp()
{
var result = MyLib.DoSomething(); // ← ここで初めてMyLibの型に触れる
}
// ❌ ダメな書き方(同じメソッド内)
PaozipLoader.Initialize();
var result = MyLib.DoSomething(); // ← Initialize() より前に型解決されてしまう
なぜ? .NET の JIT コンパイラは、メソッド内のすべての型参照を メソッド実行前に解決します。同じメソッドに書くと、
Initialize()が 実行される前に暗号化DLLの型を解決しようとして失敗します。
// Program.cs
using Paozip.Runtime;
PaozipLoader.Initialize();
return App.Run(args);
// App.cs(別ファイルでも別メソッドでもOK)
static class App
{
public static int Run(string[] args)
{
// 暗号化されたライブラリをいつも通り使える
string json = Newtonsoft.Json.JsonConvert.SerializeObject(new { message = "Hello!" });
Console.WriteLine(json);
return 0;
}
}
MyApp/
├── MyApp.exe ← ユーザーのアプリ
├── MyApp.dll
├── MyApp.deps.json ← 自動パッチ済み
├── MyLib.dll ← 暗号化済みライブラリ(中身は暗号文)
├── paozip.dll ← ランタイム(自動コピー済み)
└── その他の依存DLL...
paozip protect MyLib.jar
暗号化された MyLib.jar と paozip.jar(ランタイム)が生成されます。
import com.paozip.PaozipRuntime;
public class MyApp {
public static void main(String[] args) throws Exception {
// 暗号化 JAR をロード
ClassLoader cl = PaozipRuntime.loadEncryptedJar("MyLib.jar");
// リフレクションでクラスを取得して使う
Class<?> myClass = cl.loadClass("com.example.MyClass");
Object instance = myClass.getConstructor().newInstance();
myClass.getMethod("doWork").invoke(instance);
}
}
💡 Java の場合はリフレクション経由
Java のクラスローダーは .NET とは仕組みが異なるため、 暗号化 JAR 内のクラスは
PaozipRuntime.loadEncryptedJar()で 取得したClassLoader経由でロードします。
myapp/
├── MyApp.jar (or .class) ← ユーザーのアプリ
├── MyLib.jar ← 暗号化済み JAR
└── paozip.jar ← ランタイム
paozip protect mylib.dll # Windows
paozip protect libmylib.so # Linux
paozip protect libmylib.dylib # macOS
暗号化されたファイルと paozip_loader(ランタイム)が生成されます。
#include "paozip_loader.h"
int main(void)
{
// 暗号化ライブラリをロード
void* lib = paozip_load("mylib.dll");
// 関数を取得
typedef int (*MyFunc)(int, int);
MyFunc add = (MyFunc)paozip_sym(lib, "add");
// 普通に呼ぶ
int result = add(3, 4); // → 7
// 使い終わったら閉じる
paozip_close(lib);
return 0;
}
| 関数 | 説明 |
|---|---|
paozip_load(path) |
暗号化ライブラリを復号してロード。戻り値はハンドル。 |
paozip_sym(handle, name) |
シンボル(関数/変数)のアドレスを取得。 |
paozip_close(handle) |
ライブラリをアンロードして後片付け。 |
paozip_error() |
最後のエラーメッセージを取得。 |
myapp/
├── myapp.exe
├── mylib.dll ← 暗号化済み(元の .dll と同名)
├── paozip_loader.dll ← ランタイム
└── paozip_loader.h ← ヘッダファイル(開発時に必要)
これらの言語は、C/C++ と同じ paozip_loader ランタイムを使います。
各言語に合わせたラッパーが用意されています。
package main
import "yourapp/paozip" // Go ラッパー
func main() {
lib, err := paozip.Load("mylib.dll")
if err != nil { panic(err) }
defer lib.Close()
sym, _ := lib.Symbol("add")
// C.call_add(sym, 3, 4) などで呼ぶ
}
⚠️ Go c-shared ライブラリの制限事項
Go で作成した共有ライブラリ(
-buildmode=c-shared)をpaozip_loaderで暗号化→ロードする場合、 Go ランタイムの初期化が不安定になるケースがあります。
- 動作するもの:
net/url、fmt、stringsなど軽量な標準ライブラリのみを使う関数- SEGFAULT するもの:
crypto/*、reflect、encoding/json、compress/*など Go ランタイムの深い初期化に依存するパッケージを使う関数これは Go ランタイムが DLL のロード時に特殊な初期化処理を必要とし、
paozip_loaderがテンポラリファイル経由でロードする方式と互換性がないためです。推奨: Go で作成した共有ライブラリを暗号化する場合は、 軽量な関数のみをエクスポートするか、実行体(.exe)の暗号化を検討してください。
### Rust
```rust
use libloading::{Library, Symbol};
fn main() {
// paozip_loader.dll をランタイムロード
let loader = unsafe { Library::new("paozip_loader.dll") }.unwrap();
let pz_load = unsafe { loader.get::<fn(*const i8) -> *mut ()>(b"paozip_load") }.unwrap();
// 暗号化ライブラリをロードして使う
let handle = pz_load(c"mylib.dll".as_ptr());
// ...
}
import 'package:your_app/paozip_loader.dart';
void main() {
PaozipLoader.initialize();
final handle = PaozipLoader.load('mylib.dll');
final sym = PaozipLoader.symbol(handle, 'add');
// NativeFunction として呼ぶ
PaozipLoader.close(handle);
}
import PaoZipLoader
let lib = try EncryptedLibrary(path: "mylib.dylib")
let add: @convention(c) (Int32, Int32) -> Int32 = try lib.symbol(name: "add")
let result = add(3, 4) // → 7
Flutter アプリから暗号化ライブラリを使う場合、dart:ffi で paozip_loader を呼びます。
import 'dart:ffi';
import 'package:ffi/ffi.dart';
// paozip_loader をロード
final loader = DynamicLibrary.open('paozip_loader.dll'); // Windows
// final loader = DynamicLibrary.open('paozip_loader.dylib'); // macOS
// 暗号化ライブラリをロード
final pzLoad = loader.lookupFunction<...>('paozip_load');
final handle = pzLoad('mylib.dll'.toNativeUtf8());
// シンボル取得して関数呼出し
final pzSym = loader.lookupFunction<...>('paozip_sym');
final sym = pzSym(handle, 'add'.toNativeUtf8());
final add = sym.cast<NativeFunction<Int32 Function(Int32, Int32)>>()
.asFunction<int Function(int, int)>();
print(add(3, 4)); // → 7
💡 Flutter macOS での注意点
- サンドボックス無効化: Flutter macOS のデフォルト設定ではサンドボックスが有効です。 暗号化
.dylibをロードするには、macos/Runner/DebugProfile.entitlementsとRelease.entitlementsでcom.apple.security.app-sandboxをfalseにしてください。- コード署名: 暗号化済み
.dylibはアドホック署名が必要です:codesign --force --sign - libMyLib.dylib- パス解決:
.appバンドル内では作業ディレクトリが不定です。Platform.resolvedExecutableからContents/Frameworks/を算出してください。
暗号化ライブラリだけを配布しても動きません。
必ずランタイム(paozip.dll / paozip.jar / paozip_loader.dll)を一緒に配布してください。
paozip protect コマンドで暗号化すると、ランタイムは自動的にコピーされます。
以下のライブラリは暗号化に向きません:
ネイティブ依存のマネージド DLL(例: SkiaSharp 本体)
→ 暗号化すると deps.json のネイティブプロービング情報が壊れます。
SkiaSharp を使うあなたのライブラリ(例: MyGraphics.dll)を暗号化してください。
Rust rayon (Windows のみ) および Go c-shared の一部パッケージ
→ Rust の rayon(データ並列)は Windows 環境で SEGFAULT する場合があります
(macOS では問題ありません)。tokio などの一般的な async ランタイムは問題ありません。
並列処理が必要な場合は crossbeam(ロックフリーチャネル + スコープドスレッド)を
お使いください。crossbeam は paozip_loader 経由で正常に動作します。
Go c-shared で crypto/* / reflect / encoding/json を使うライブラリは、
paozip_loader のテンポラリロード方式と互換性がなく SEGFAULT する場合があります。
また、Go c-shared DLL は paozip_close()(内部で FreeLibrary)でクラッシュする
場合があります(Go ランタイムの制限)。Go DLL の場合は paozip_close を呼ばず、
プロセス終了時の自動クリーンアップに任せてください。
Java: 複数JARにまたがる依存ライブラリ(例: Jackson databind + core + annotations)
→ loadEncryptedJar() はJARごとに独立したClassLoaderを作成するため、
暗号化JARが別の暗号化JARのクラスを参照できません。
対処法: 依存元JARのみ暗号化し、依存先は通常のクラスパスに配置してください。
Windows システム DLL(例: kernel32.dll)
→ OS に最初からロードされている DLL を再ロードすると衝突します。
.wasm ファイル
→ 現在のバージョンでは .wasm 拡張子は未対応です。
Windows では .dll 拡張子が .NET DLL とネイティブ C/C++ DLL の両方に使われるため、
paozip protect コマンドは 拡張子だけではどちらのランタイムが必要か判別できません。
.dll を暗号化すると、.NET 用ランタイム paozip.dll が自動コピーされますpaozip_loader.dll と paozip_loader.h を手動で配置してくださいpaozip_loader.dll は PaoZip Studio のインストールフォルダに含まれています暗号化DLL配布フォルダ/
├── mylib.dll ← 暗号化済み
├── paozip_loader.dll ← ネイティブ C/C++ 用ランタイム(手動配置)
└── paozip_loader.h ← 開発時ヘッダ(手動配置)
.so(Linux)や.dylib(macOS)は明確にネイティブなので、この問題は発生しません。
paozip_loader の paozip_load() 関数は PAOZIPDK 形式で暗号化されたファイルのみロードできます。
暗号化されていない通常の DLL を渡すと "Not a PAOZIPDK file" エラーで NULL が返ります。
通常の DLL と暗号化 DLL を混在させる場合は、通常の DLL は LoadLibrary / dlopen で、
暗号化 DLL は paozip_load でロードしてください。
100回連続のロード/アンロードサイクルで検証済みです。 初回ロード時に約 5MB の初期化コストが発生しますが、以降のロード/アンロードでメモリは一切増加しません。
実行時のパフォーマンス影響はゼロです。
復号はライブラリの初回ロード時に1回だけ行われます。 一度メモリにロードされれば、通常のライブラリとまったく同じ速度で動作します。 100万回の関数呼出しでもオーバーヘッドは測定不能でした。
1つのアプリで複数の暗号化ライブラリを同時に使えます。 テストでは 8つの .NET DLL を同時に暗号化して問題なく動作しました。
ただし、paozip protect コマンドは1つずつ順番に実行してください。
(同じフォルダで並列実行すると deps.json の書き換えが競合します)
# ✅ 正しい(順番に実行)
paozip protect LibA.dll
paozip protect LibB.dll
paozip protect LibC.dll
# ❌ ダメ(並列実行)
paozip protect LibA.dll &
paozip protect LibB.dll & # deps.json 競合の可能性!
ここからは技術的な詳細です。PaoZip Studio がどう動いているのか、もっと知りたい人向け。
PaoZip Studio は zencode という独自の暗号化エンジンを使用しています。
暗号化の流れ:
元データ
│
▼
zlib 圧縮(DEFLATE) ← サイズを小さく
│
▼
XOR 暗号化(鍵ベース) ← 鍵がないと復号できない
│
▼
ビット反転 ← さらに難読化
│
▼
マジックヘッダ付与 ← "\tPAOZIPW\t" で識別
│
▼
暗号化データ
鍵の保護:
- 暗号化鍵は 64 文字のランダム hex 文字列(256 ビット相当)
- ランチャーに埋め込む際は XOR マスク方式で難読化
- mask[] と maskedKey[] の2つの配列に分割
- key[i] = mask[i] ^ maskedKey[i] で復元
- 鍵が平文でバイナリに含まれることはありません
全コンパイル型言語で統一されたネイティブランチャー方式を採用しています。
.NET、Java、Go、C/C++、Dart、Rust、Swift — すべて同じアーキテクチャです。
対象: 全コンパイル型言語(.NET, Java, Go, C, C++, Dart CLI, Rust, Swift)
ネイティブ C ランチャー起動(事前コンパイル済みテンプレート .exe)
│
▼
埋め込みペイロードを復号
│
▼
テンプディレクトリ作成 ← Windows: %TEMP%\paozip_{PID}\ / macOS: /tmp/paozip_{PID}/
│
▼
復号したバイナリを書き出し
│
▼
依存ファイルをコピー ← .dll, .config, .json 等
│
▼
プロセスを起動 ← CreateProcess / fork+exec
│
▼
実行完了を待機
│
▼
テンプディレクトリを削除 ← 痕跡を完全消去!
特長: - ランチャー自体がネイティブ C コードなので、.NET / Java の逆コンパイルツールで解析不可 - 実行後に自動削除(リトライ付き) - 引数と終了コードは完全にパススルー - 全言語で同じ仕組みなので、信頼性が高い
言語別の動作の違い:
| 言語 | テンプに書き出すもの | 実行方法 (Windows) | 実行方法 (macOS) |
|---|---|---|---|
| .NET Framework | .exe | CreateProcess | — |
| .NET 5+ | apphost + .dll | CreateProcess (apphost) | dotnet exec |
| Java | .jar | java -jar |
java -jar |
| Go / C / C++ / Rust / Swift / Dart CLI | バイナリ | CreateProcess | fork + exec |
Flutter デスクトップは構造が特殊なため、専用の方式を使います。
ランチャー起動
│
▼
data/app.so.enc を読み込み
│
▼
復号して data/app.so に書き出し
│
▼
元の Flutter ランナー(_original.exe)を起動
│
▼
Flutter アプリが app.so を読み込んで動作
│
▼
アプリ終了を待機
│
▼
data/app.so を削除
保護済みバイナリには PAOZIPLAUNCHER というマーカー文字列が埋め込まれます。 再度保護しようとすると、このマーカーを検出してエラーになります。
$ paozip protect MyApp.protected.exe
Error: File is already encrypted: MyApp.protected.exe
これは意図的な安全設計です。二重保護は意味がなく、問題を起こす可能性があるため。
保護処理にかかる時間:
| 入力サイズ | 処理時間(目安) |
|---|---|
| ~100 KB | 1〜2 秒 |
| ~1 MB | 2〜3 秒 |
| ~5 MB | 3〜5 秒 |
| ~50 MB | 10〜15 秒 |
事前コンパイル済みテンプレートを使用するため、保護処理は高速です。
サイズ変化:
ペイロードは zlib 圧縮されますが、ランチャーテンプレート自体に約 120KB のオーバーヘッドがあります。 そのため、大きなバイナリ(数MB以上)は保護後に小さくなりますが、小さなバイナリ(100KB 以下)はランチャーのオーバーヘッドにより大きくなります。
| 言語 | 元サイズ | 保護後 | 備考 |
|---|---|---|---|
| Go | 2.3 MB | 1.4 MB | 38% 減(大きいバイナリは圧縮効果大) |
| Flutter (app.so) | 5.5 MB | 2.4 MB | 56% 減 |
| Rust | 158 KB | 108 KB | 32% 減 |
| C (小規模) | ~60 KB | ~150 KB | ランチャーオーバーヘッド(~120KB)により増加 |
起動時のオーバーヘッド: - 復号 + テンプファイル書き出しの時間(通常 0.1〜0.5 秒) - ユーザーが体感できるレベルではありません
起動時オーバーヘッド(実測値):
| 言語 | 起動時オーバーヘッド | 備考 |
|---|---|---|
| Java | +18% | JVM 起動時間が大きいため相対的に小さい |
| .NET | +65% | PowerShell 計測含む |
| C | +207% | 元の起動が非常に速い(数ms)ため相対値が大きい |
起動時オーバーヘッドは「復号 + プロセス起動」の合計です。元の起動時間が短いバイナリほど相対的なオーバーヘッドが大きく見えますが、絶対値としては数十〜数百ミリ秒程度です。
大規模アプリ(.NET MAUI等)の高速起動: - 保護済みバイナリは元のディレクトリに直接展開されるため、companion ファイル(DLL等)のコピーが不要 - .NET 10 MAUI アプリ(600+ ファイル / 280MB)でも、保護なし版とほぼ同じ速度で起動
サーバーアプリでの影響: - リクエスト処理のオーバーヘッドは 3.6% 以下(体感上の影響なし) - サーバーアプリは起動後に常駐するため、起動時のオーバーヘッドは初回のみ
メモリ使用量: - 保護前後で実行中のメモリ使用量はほぼ同等(増加なし)
長時間実行の安定性: - 30分連続実行 / 1000リクエスト処理でメモリリーク・ハンドルリークなし(検証済み)
以下の制限事項にご注意ください:
/usr/bin/* 等の macOS 付属システムバイナリは Platform Binary 保護により保護不可-o で異なるディレクトリを指定してください)保護済みアプリをインストーラー(Inno Setup、WiX 等)で Program Files に配布する場合、インストール先フォルダに書き込み権限が必要です。
PaoZip のランチャーは起動時に、復号したバイナリをアプリと同じフォルダに一時的に書き出します。Program Files は通常ユーザーに書き込み権限がないため、権限がないと起動が大幅に遅くなります(数百ファイルの一時コピーが発生するため)。
Inno Setup の場合の対処例:
[Dirs]
Name: "{app}"; Permissions: everyone-full
[Files]
Source: "publish\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs; Permissions: everyone-full
補足:
everyone-fullはセキュリティ上は推奨されませんが、PaoZip の起動メカニズム上必要です。保護済みバイナリは起動時にアプリフォルダへ一時ファイルを書き出し、終了時に自動削除します。書き込み権限がない場合、ランチャーは%TEMP%に全ファイルをコピーするフォールバック動作になり、ファイル数が多いアプリ(.NET MAUI 等)では起動に数十秒〜数分かかることがあります。
この問題は .NET に限らず、companion ファイル(DLL 等)を多数持つアプリ全般で発生します。Go や C/C++ の単体バイナリでは companion ファイルがないため影響しません。
また、保護時に生成される .org.exe(元のバイナリのバックアップ)は、インストーラーに含めないでください。同名のファイルがインストール先に存在すると、ランチャーの高速起動モードが使えなくなり、同様に起動が遅くなります。
保護に必要なランチャーテンプレートが見つからない場合に表示されます。
対処法:
- Templates/ フォルダが PaoZip Studio と同じ場所にあるか確認してください
- テンプレートファイル(launcher_*.exe)が含まれていることを確認してください
保護済みのバイナリをもう一度保護しようとしています。 元の(保護前の)バイナリを使ってください。
PaoZip Studio が認識できないファイル形式です。 対応形式: .NET アセンブリ、PE (.exe)、Mach-O、ELF、JAR、DLL、.so、.dylib。
Main-Class が MANIFEST.MF に記述されていない JAR(ライブラリ JAR)は、自動的にライブラリ保護モードで処理されます。 実行可能 JAR はランチャー方式、ライブラリ JAR はライブラリ暗号化方式で保護されます。
.NET 5+ の .exe(apphost)をドラッグ&ドロップすると、同名の .dll を自動検出して .NET 5+ として保護します。
.dll が見つからない場合は、ネイティブバイナリとして保護を試みます(ネイティブ保護にフォールスルー)。
意図した動作でない場合は、.exe と同じフォルダに同名の .dll があることを確認してください。
flutter_windows.dll や data/flutter_assets/ が同じフォルダにあることを確認してください。PaoZip で保護したバイナリは、実行時に暗号化されたペイロードを復号して起動する仕組みです。この動作パターンを一部のアンチウイルスソフトが疑わしいと判断する場合があります。
VirusTotal(72製品一斉スキャン)での検証結果:
| 結果 | 製品数 |
|---|---|
| 安全と判定(Undetected) | 66 / 72 |
| 誤検知(False Positive) | 6 / 72 |
安全と判定した主要製品(一部):
Windows Defender、Norton、ESET-NOD32、Kaspersky、Avast、AVG、BitDefender、McAfee (Fortinet)、Avira、DrWeb、Emsisoft、GData、ClamAV、Google、Baidu、Huorong 他
誤検知した製品(6社):
Arctic Wolf、Bkav Pro、CrowdStrike Falcon、DeepInstinct、Elastic、SecureAge — いずれも AI/機械学習ベースのヒューリスティック検出です。
誤検知された場合の対処法:
Gatekeeper による警告です。右クリック →「開く」→「開く」で起動できます。 または、システム設定 → プライバシーとセキュリティ →「このまま開く」をクリック。
Xcode Command Line Tools がインストールされていません。
xcode-select --install
保護後のバイナリに実行権限を付与してください。
chmod +x myapp.protected
保護処理が失敗しています。エラーメッセージを確認してください。 よくある原因: - 入力ファイルが存在しない - 出力先に書き込み権限がない - ランチャーテンプレートが見つからない(Windows)、またはコンパイラが見つからない(macOS: clang)
PaoZip Studio は 言語ごとのライセンス です。
| ライセンス | 保護できる言語 |
|---|---|
| .NET ライセンス | .NET Framework / .NET 5+ |
| Java ライセンス | Java JAR |
| Go ライセンス | Go バイナリ |
| C/C++ ライセンス | C / C++ バイナリ |
| Dart ライセンス | Dart CLI / Flutter Desktop |
| Rust ライセンス | Rust バイナリ |
| Swift ライセンス | Swift バイナリ |
体験版について: - すべての言語・機能を試せます(機能制限なし) - 回数制限があります - 体験版で保護したバイナリは製品版と同じ品質です
https://www.pao.ac/paozip/buy.html
PaoZip Studio の使用について、PaoZip Studio の使用者(以下「利用者様」と称します)と有限会社パオ・アット・オフィス(以下「弊社」と称します)は、以下の各項目についての内容に同意するものとします。
この使用許諾書は、利用者様が PaoZip Studio を使用する場合に同意しなければならない契約書です。
利用者様が PaoZip Studio を使用する時点で、本使用許諾書に同意されたものとします。同意されない場合は、PaoZip Studio を使用する事はできません。
利用者様が PaoZip Studio の製品版を使用して開発を行う場合には、1台の開発用コンピュータで PaoZip Studio を使用するにあたり、言語ごとに1ライセンスを購入する必要があります。
保護されたバイナリを配布・実行する環境にはライセンスは必要ありません。ランタイムライセンスフリーでございます。
PaoZip Studio の著作権は、いかなる場合においても弊社に帰属いたします。
PaoZip Studio の使用によって、直接的、あるいは、間接的に生じた、いかなる損害に対しても、弊社は補償賠償の責任を負わないものとします。
PaoZip Studio 及びその複製物を第三者に譲渡・貸与する事は出来ません。PaoZip Studio を開発ツールとして再販/再配布することを禁止します。なお、保護されたバイナリを配布することは問題ございません。
弊社は PaoZip Studio の仕様を予告無しに変更することがあります。その場合の利用者様に対する情報提供は、弊社 WEB サイトにて行う事とします。
PaoZip Studio は、ソースコードやバイナリの難読化(obfuscation)およびカジュアルコピー防止を目的としています。ILSpy 等の逆コンパイルツールによる直接的な解析を防ぎ、取引先やエンドユーザーにソースコードを直接見せないための保護手段として有効です。
ただし、リバースエンジニアリングの専門知識を持つ者に対する完全な保護を保証するものではありません。これは PHP Screw 等の同種の暗号化ツールと同様の特性であり、実行時に復号が必要なソフトウェア保護の一般的な制約です。
機密性の高い情報(API キー、パスワード等)は、暗号化されたバイナリ内に直接埋め込むのではなく、環境変数や外部の構成ファイル等で管理することを推奨します。
本使用許諾条件は利用者様が PaoZip Studio を使用した日より有効です。
PaoZip Studio の製品版をご利用頂ける場合は、言語ごとにライセンスを購入して頂く必要があります。
体験版について: すべての言語・機能を試せます(機能制限なし、回数制限あり)。体験版で保護したバイナリは製品版と同じ品質です。
PaoZip Studio で開発を行うパソコンの台数 × 使用する言語数
11,000円(税込)
バグフィックス等のバージョンアップは原則として無償とさせて頂きます。
11,000円 × ライセンス数 を下記口座へ銀行振込、または、郵便振替による送金をして下さい。
| 銀行名 | 支店名(コード) | 口座番号 | 名義 |
|---|---|---|---|
| 三菱UFJ銀行 | 新宿支店 (341) | 普通 3831891 | ユ)パオアットオフィス |
| PayPay銀行 | すずめ支店 (002) | 普通 6461359 | ユ)パオアットオフィス |
| 郵便口座番号 | 名義 |
|---|---|
| 00150-0-576845 | 有限会社 パオ・アット・オフィス |
※ 振込手数料は利用者様負担でお願い致します。
見積書/納品書/請求書/領収証の発行は可能でございます。製品サイトでの手続きにより発行いたします。
ご質問・ご要望・バグ報告など、お気軽にどうぞ。
有限会社 パオ・アット・オフィス
PaoZip Studio — あなたのコードを、あなたの知的財産を、守ります。
© 2001-2026 有限会社 パオ・アット・オフィス / https://www.pao.ac/