Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Obfusk8 — Obfusk8: C++17 ベースの軽量難読化ライブラリ / Windows バイナリ向け Header Only | Kitploit
ツール/GitHubGitHub/x86byte/obfusk8
エクスプロイトフレームワークリバースエンジニアリングシェルコード暗号化ペネトレーションテストレッドチーミングペイロード開発
GitHubx86byte/obfusk8

Obfusk8

Obfusk8: C++17 ベースの軽量難読化ライブラリ / Windows バイナリ向け Header Only

リポジトリを見る
79382233ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Obfusk8: C++17ベースの難読化ライブラリ

Obfusk8 は、アプリケーションの難読化を大幅に強化し、リバースエンジニアリングをはるかに困難にすることを目的とした、軽量なヘッダオンリーのC++17ライブラリです。これは、コードのロジックとデータを保護することを目的とした、コンパイル時および実行時の多様なテクニックを通じて実現されます。

banner


目次

  1. 主要な難読化戦略
  2. 依存関係
  3. 可視化
  4. エンジン分析と検出プロファイル
  5. 構造的およびフォレンジック的特徴
  6. 使用方法
  7. ビルド
  8. デモ
  9. コントリビューションとフィードバック

主要な難読化戦略

1. main 関数のラッピング(_main マクロ)

アプリケーションのエントリポイント(main)は、複雑で多層的な難読化エンジンに変換されます:

  • 仮想マシン(VM)実行(概念):実際の main_body コードが実行される前に、ミニVM(シミュレートされたCPU)が「暗号化された」命令のシーケンスを実行します。これにより、真のエントリポイントと初期操作が隠蔽されます。VMの状態(レジスタ、プログラムカウンタ、ディスパッチキー)は、ランタイムでランダム化された値で初期化されます。
  • 間接制御フロー平坦化(ICFF):_main マクロ内の重要なループ(プロローグとエピローグの両方)は、複雑なステートマシンに変換されます。制御フローは直接的なものではなく、高度に「暗号化された」状態変数によって決定されます。これらの状態変数のエンコード/デコードキーは動的であり、VM状態、ループカウンタ、コンパイル時ランダム性(__COUNTER__、__LINE__、__TIME__ など)、およびグローバルな不透明シードから導出されます。これにより、制御フローの静的解析が非常に困難になります。
    • 2つの異なるICFFエンジン(obf_icff_ns_dcff と obf_icff_ns_epd)が、異なる状態遷移ロジックとキー生成で使用され、解析をさらに複雑にします。
  • 偽の制御フロー(OBF_BOGUS_FLOW_* マクロ):多数の誤解を招くジャンプパターンと入り組んだ条件構造が _main 全体に注入されます。これらは、不透明述語(常にtrueまたはfalseに評価されるが、計算コストが高いか静的に判断することが難しい条件)と組み合わせた goto 文を使用します。これにより、逆アセンブラや逆コンパイラにとって迷路のような偽のパスが作成されます。
    • 多様で複雑な偽フローを生成するために、OBF_BOGUS_FLOW_LABYRINTH、OBF_BOGUS_FLOW_GRID、OBF_BOGUS_FLOW_SCRAMBLE、OBF_BOGUS_FLOW_WEAVER、OBF_BOGUS_FLOW_CASCADE、OBF_BOGUS_FLOW_CYCLONE が含まれます。
  • 解析対策&デバッグ対策のトリック(Runtime マクロ、SEH):
    • 強制例外&SEH:構造化例外処理(SEH)を使用して、強制例外を伴うパスを作成します。__except ブロックはプログラムの状態を変更できるため、デバッガが例外をスキップすると追跡が困難になります。
    • デバッガチェック(概念):Runtime マクロには、特定のVM状態またはタイミングによって条件が満たされた場合に __debugbreak() をトリガーしたり例外をスローしたりする可能性のある条件が含まれており、デバッグセッションを妨害するように設計されています。

2. 仮想ISAエンジン(obf_vm_engine)

_main マクロの難読化の核心コンポーネント:

  • カスタムミニCPUシミュレーション:揮発性レジスタ(r0、r1、r2)、プログラムカウンタ(pc)、ディスパッチキー(dispatch_key)を持つCPUをシミュレートします。カスタム「命令」(ハンドラ)を実行します。
  • 難読化された命令:VM命令ハンドラは、Mixed Boolean-Arithmetic(MBA)とビット演算を使用して高度に偽装された操作を実行します。ハンドラには、算術演算、ビット論理演算、キー改変、ジャンクシーケンス、条件付き更新、メモリシミュレーション、PC改変が含まれます。
  • 動的ディスパッチ:次のVM命令ハンドラの選択は、複数のディスパッチメカニズムを通じてランダム化されます:
    • レジスタベースのディスパッチ(reg_dispatch_idx)。
    • メモリテーブルベースのディスパッチ(スクランブルされた関数ポインタテーブル get_mem_dispatch_table)。
    • 混合ディスパッチ(mixed_dispatch_idx)。 dispatch_key は常に変更され、実行されるハンドラのシーケンスを非常に予測不能にします。
  • ハンドラテーブルの変異:VM命令ハンドラのテーブル(vm_handler_table)自体が、_main のプロローグとエピローグ内でランタイムに変異し、VMの動作をさらに不明瞭にします。

3. コンパイル時文字列暗号化(AES8.hpp の OBFUSCATE_STRING)

  • 隠された文字列:変更されたAES暗号を使用して、すべての文字列リテラルをコンパイル時に暗号化します。
  • 動的キー:暗号化キーは文字列インスタンスごとに一意であり、文字列コンテンツ、ファイル位置(__FILE__、__LINE__)、ビルド時刻(__DATE__、__TIME__)から導出されます。
  • ジャストインタイム復号:文字列は、実行時にアクセスされたときだけスタック上で復号され、メモリ内の平文の寿命を最小限に抑えます。
  • (オプション)デコイPEセクション:一般的なパッカーシグネチャを模倣するように設計されたカスタムPEセクションに暗号化文字列を格納でき、アナリストを誤誘導する可能性があります(AES8.hpp のMSVC固有機能)。

4. ステルスなWindows API呼び出し(Resolve8.hpp の STEALTH_API_OBFSTR / STEALTH_API_OBF)

  • IATの不明瞭化:インポートアドレステーブル(IAT)にWindows APIの直接で識別しやすいエントリを残しません。
  • PEBベースの解決:実行時にProcess Environment Block(PEB)データ構造を直接解析することにより、ロードされたDLLのベースアドレスとAPI関数のアドレスを動的に見つけます。これにより、標準の GetModuleHandle と GetProcAddress がこのメカニズムによってまだ解決されていない場合、それらをバイパスして初期解決を行います。
  • ハッシュ化された名前:DLL名とAPI名のルックアップにコンパイル時ハッシュ(カスタムアルゴリズム CT_HASH)を使用します。これにより、これらのマクロを使用する際に、バイナリのインポート関連データや文字列テーブルに平文のDLL名とAPI名が出現するのを防ぎます。

5. 間接システムコールエンジン(K8_SYSCALL)

Obfusk8は現在、ユーザーモードフック(EDR/AV)と静的解析チェックをバイパスするための最先端のIndirect Syscallメカニズムを統合しています。

  • 「The Sorting Hat」方式の解決:しばしばフックまたは監視されている ntdll.dll の .text セクションを読み取る代わりに、エンジンはエクスポートディレクトリを解析します。Zw で始まる関数をフィルタリングし、メモリアドレス順にソートして、そのインデックスに基づいてシステムコール番号(SSN)を推定します。これにより、実行可能コードに一切触れることなくSSNを解決できます。
  • ラテラルガジェット実行:エンジンは自身のバイナリ内に syscall (0F 05) 命令を含みません。代わりに、実行時に ntdll.dll メモリ内の有効な syscall; ret ガジェットを特定します。 クリーンなコールスタック:ntdllガジェットにジャンプするカスタムサンクが割り当てられます。OSカーネルとセキュリティセンサーにとって、システムコールは ntdll.dll から正当に発信されているように見え、クリーンなコールスタックが維持されます。
  • 使用方法: NtOpenProcess の代わりに K8_SYSCALL("ZwOpenProcess", ...) を単に使用してください。

6. メソッドベースの難読化(OBF_METHOD)

Obfusk8は現在、メソッドベースの難読化を通じて、バイナリのセキュリティを細かく制御できます。プロジェクト全体を難読化する(パフォーマンスに影響を与える可能性がある)代わりに、特定の価値の高い関数やクラスメソッドを選択的に保護できるようになりました。


使用方法

  1. パスをインクルードする
    メソッド難読化ロジックをプロジェクトに含めるようにしてください: ```cpp #include "../transform/PASSES/obf_cmethods.cxx"
  2. マクロ構文
    OBF_METHOD マクロを使用してメソッドを定義します: ```cpp OBF_METHOD(ret_type, func_name, params, method_body)
  • ret_type: 関数の戻り値の型(例:bool, int, void*)。
  • func_name: メソッドの名前。
  • params: 関数のパラメータ(括弧で囲む必要があります)。
  • method_body: { } で囲まれた関数の実際のロジック。

例:標準メソッド vs 難読化メソッド

この例では、PrintStatus は通常の読み取り可能な関数です。Obfusk8_PrintStatus は Obfusk8 によって保護されています。```cpp #include "../Instrumentation/materialization/state/Obfusk8Core.hpp" #include "../Instrumentation/materialization/transform/K8_UTILS/k8_utils.hpp" // for the printf_, u can change the printf_ with anything else...

class Obfusk8_C { public: // standard method which is visible to reverse engineers void PrintStatus(void) { printf_("method\n"); }

// Obfuscated method protected by Obfusk8
OBF_METHOD_(void, Obfusk8_PrintStatus, (void),
{
    printf_("same method but Obfuscated\n");
})

};

_main({ Obfusk8_C *pp = new Obfusk8_C; pp->PrintStatus(); pp->Obfusk8_PrintStatus(); delete pp; })

*完全な例はこちらで確認できます:[obfusk8_methods.cpp](https://github.com/x86byte/Obfusk8/blob/main/Obfusk8/EXAMPLES/obfusk8_methods.cpp)*

---
### 6. 組み込みステルス機能を備えたAPI抽象化クラス
Obfusk8は、一般的なWindows APIセットをカプセル化するヘルパークラスを提供します。これらのクラスは、構築時にステルスAPI解決メカニズム(`STEALTH_API_OBFSTR`)を自動的に使用し、明らかな静的インポート痕跡を残さずに基盤となるWindows関数を解決します。

   - **`K8_ProcessManipulationAPIs::ProcessAPI` (`k8_ProcessManipulationAPIs.hpp`)**:
     *   `OpenProcess`、`TerminateProcess`、`CreateRemoteThread`、`VirtualAllocEx`、`WriteProcessMemory`、`ReadProcessMemory`、`GetProcAddress`、`GetModuleHandleA`、`NtQueryInformationProcess`、`SuspendThread`、`GetCurrentProcessId` など、プロセス操作のためのWindows APIへの便利なアクセスを提供します。
     *   **自動ステルス解決**: `kernel32.dll` と `ntdll.dll` から必要な関数をステルスに解決します。
     *   静的解析のフットプリントを減らしてプロセス関連の操作を簡素化します。`NtQueryInformationProcess` で使用する `PROCESSINFOCLASS` 列挙型を含みます。

   - **`k8_CryptographyAPIs::CryptographyAPI` (`k8_CryptographyAPIs.hpp`)**:
     *   一般的なWindows Cryptography API(CAPI/CNG)関数のラッパーを提供します。(機能はこのファイルの実際の実装に依存します。提供されたスニペットは重複していました。`CryptAcquireContextA`、`CryptCreateHash` などの一般的なCAPI関数を想定しています。)
     *   **自動ステルス解決**: 主に `advapi32.dll`(コア関数には `kernel32.dll`)から必要な関数をステルスに解決します。
     *   暗号化APIの使用の露出を最小限に抑えながら、暗号操作を容易にします。

   - **`k8_NetworkingAPIs::NetworkingAPI` (`k8_NetworkingAPIs.hpp`)**:
     *   `wininet.dll`(例:`InternetOpenA`、`HttpOpenRequestA`、`FtpPutFileA`)、`urlmon.dll`(例:`URLDownloadToFileA`)、`ws2_32.dll`(例:`socket`、`connect`、`WSAStartup`)、`shell32.dll`(例:`ShellExecuteA`)、`dnsapi.dll`(例:`DnsQuery_A`)、`mpr.dll`(例:`WNetOpenEnumA`)など、幅広いネットワーク関数への簡単なアクセスを提供します。
     *   **自動ステルス解決**: コンストラクタで `STEALTH_API_OBFSTR` と `OBFUSCATE_STRING` を使用して、それぞれのDLL(`LoadLibraryA`/`GetLastError` には `kernel32.dll`)から必要なすべての関数を、明らかなインポート痕跡を残さずに解決します。
     *   難読化されたネットワークリクエストの作成やその他のネットワーク関連タスクを簡素化します。

   - **`RegistryAPIs::RegistryAPI` (`k8_RegistryAPIs.hpp`)**:
     *   `RegSetValueExA`、`RegCreateKeyExA`、`RegOpenKeyExA`、`RegQueryValueExA`、`RegCloseKey` など、一般的に使用されるWindowsレジストリ関数をラップします。
     *   **自動ステルス解決**: 構築中に `advapi32.dll`(および `kernel32.dll`)から関数をステルスに解決します。
     *   追跡されにくいAPI呼び出しでレジストリ操作を実行するのに役立ちます。
ツールをダウンロード