CCGT 文字列パッカー(Post-build string encryptor)

Security

概要

CCGT(Post-build string encryptor)は、Windows x64 向けに設計されたビルド後文字列保護ツールです。完成した実行ファイルを走査して「保護対象の文字列」を抽出・暗号化し、その復号に必要な情報を専用の PE セクション(.ccgtr)へコンパクトに埋め込みます。ランタイムはヘッダオンリーの軽量コンポーネント(ccgt_runtime.h)で、プログラムが文字列を使用する直前にメモリ上で復号を行い平文に戻します。この手法により、実行ファイル中に平文が残る時間や静的解析による露出を低減し、機密情報(API キー、パスワード、識別子など)の漏洩リスクを下げることを狙っています。

GitHub

リポジトリの統計情報

  • スター数: 2
  • フォーク数: 0
  • ウォッチャー数: 2
  • コミット数: 2
  • ファイル数: 9
  • メインの言語: C++

主な特徴

  • ビルド後にバイナリを直接処理し、実行ファイル中の平文文字列を暗号化するポストビルド方式
  • 暗号化メタデータを専用の PE セクション(.ccgtr)に格納して復号情報を管理
  • ランタイムはヘッダオンリー(ccgt_runtime.h)、導入が比較的容易
  • Windows x64 をターゲットに設計されている(プラットフォーム限定)

技術的なポイント

CCGT の大きな技術的ポイントは「ビルド後にバイナリを書き換える」ことでランタイム露出を低減する点です。具体的には、コンパイル・リンク済みの実行ファイルを解析して静的に埋め込まれた文字列(例えば .rdata/.data 内のリテラル)や明示的に検出した領域を検出し、それらを暗号化。復号に必要なオフセットや長さ、復号方法を示すコンパクトなメタデータテーブルを新規 PE セクション(.ccgtr)へ追加します。実行時はヘッダオンリーのランタイムがこのテーブルを読んで該当メモリ領域を復号し、プログラムのコードがその文字列を使う直前に平文を復元します。

こうしたポストビルド方式は導入の手軽さが利点です。ビルドプロセスを大きく変えずにバイナリを後処理でき、既存のコードベースへ影響を少なく適用できます。一方で注意点もあります。PE 書き換えはリロケーションやセクションヘッダの更新を伴い、署名済みバイナリでは署名を無効化します。さらに、復号鍵やアルゴリズムをどこに置くかがセキュリティ上の重要事項で、完全な秘密保持は難しい(ランタイムに鍵が埋め込まれれば逆アセンブルで取得される可能性がある)ため、運用上は鍵の難読化や外部キー管理など追加対策が望まれます。加えて、メモリ上で復号された文字列は実行時に平文として存在するため、実行中のメモリダンプやデバッガからのリークに対するリスクは残ります。

設計面では「軽量のヘッダオンリーランタイム」という選択が目を引きます。ヘッダオンリーであればプロジェクトへの組み込みが容易で、初期化タイミングを静的コンストラクタや明示的な初期化関数で制御できます。実装上、復号処理は起動時に一括で行うか、必要時に遅延復号するかを選べます。遅延復号はメモリ露出時間を短くする利点がありますが、コード側で復号タイミングを確実に管理する必要があります。

最後に、CCGT は「難読化」や「アンチリバース」機能の代替ではなく、静的解析や文字列スキャンによる情報露出を低減するための補助ツールである点を理解しておくべきです。完全な保護を求める場合は、実行時の監視、分割鍵管理、ハードウェアセキュリティモジュール(HSM)や OS レベルのプロテクションなどと組み合わせることが推奨されます。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • CCGT.slnx: file
  • CCGT.vcxproj: file
  • CCGT.vcxproj.filters: file
  • LICENSE: file

…他 4 ファイル

(実際のリポジトリにはヘッダファイル(ccgt_runtime.h)や実行ファイル操作を行う実装ファイル、README などが含まれています)

まとめ

ポストビルドで手軽に文字列露出を低減できる実用的なツールで、導入・拡張性が魅力です。

リポジトリ情報:

READMEの抜粋:

CCGT (Post-build string encryptor)

CCGT is a post-build string protection tool for Windows x64 Binaries.

It scans a compiled executable for eligible strings, encrypts them & writes a compact metadata table into a dedicated PE section (.ccgtr). At runtime, a lightweight header-only runtime (ccgt_runtime.h) decrypts those protected regions back into plaintext before the program’s code uses them.

This approach is designed to reduce the exposure of sensitive strings in static an…