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

main 関数のラッピング(_main マクロ)アプリケーションのエントリポイント(main)は、複雑で多層的な難読化エンジンに変換されます:
main_body コードが実行される前に、ミニVM(シミュレートされたCPU)が「暗号化された」命令のシーケンスを実行します。これにより、真のエントリポイントと初期操作が隠蔽されます。VMの状態(レジスタ、プログラムカウンタ、ディスパッチキー)は、ランタイムでランダム化された値で初期化されます。_main マクロ内の重要なループ(プロローグとエピローグの両方)は、複雑なステートマシンに変換されます。制御フローは直接的なものではなく、高度に「暗号化された」状態変数によって決定されます。これらの状態変数のエンコード/デコードキーは動的であり、VM状態、ループカウンタ、コンパイル時ランダム性(__COUNTER__、__LINE__、__TIME__ など)、およびグローバルな不透明シードから導出されます。これにより、制御フローの静的解析が非常に困難になります。
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):
__except ブロックはプログラムの状態を変更できるため、デバッガが例外をスキップすると追跡が困難になります。Runtime マクロには、特定のVM状態またはタイミングによって条件が満たされた場合に __debugbreak() をトリガーしたり例外をスローしたりする可能性のある条件が含まれており、デバッグセッションを妨害するように設計されています。obf_vm_engine)_main マクロの難読化の核心コンポーネント:
r0、r1、r2)、プログラムカウンタ(pc)、ディスパッチキー(dispatch_key)を持つCPUをシミュレートします。カスタム「命令」(ハンドラ)を実行します。reg_dispatch_idx)。get_mem_dispatch_table)。mixed_dispatch_idx)。
dispatch_key は常に変更され、実行されるハンドラのシーケンスを非常に予測不能にします。vm_handler_table)自体が、_main のプロローグとエピローグ内でランタイムに変異し、VMの動作をさらに不明瞭にします。AES8.hpp の OBFUSCATE_STRING)__FILE__、__LINE__)、ビルド時刻(__DATE__、__TIME__)から導出されます。AES8.hpp のMSVC固有機能)。Resolve8.hpp の STEALTH_API_OBFSTR / STEALTH_API_OBF)GetModuleHandle と GetProcAddress がこのメカニズムによってまだ解決されていない場合、それらをバイパスして初期解決を行います。CT_HASH)を使用します。これにより、これらのマクロを使用する際に、バイナリのインポート関連データや文字列テーブルに平文のDLL名とAPI名が出現するのを防ぎます。K8_SYSCALL)Obfusk8は現在、ユーザーモードフック(EDR/AV)と静的解析チェックをバイパスするための最先端のIndirect Syscallメカニズムを統合しています。
NtOpenProcess の代わりに K8_SYSCALL("ZwOpenProcess", ...) を単に使用してください。OBF_METHOD)Obfusk8は現在、メソッドベースの難読化を通じて、バイナリのセキュリティを細かく制御できます。プロジェクト全体を難読化する(パフォーマンスに影響を与える可能性がある)代わりに、特定の価値の高い関数やクラスメソッドを選択的に保護できるようになりました。
OBF_METHOD マクロを使用してメソッドを定義します: ```cpp
OBF_METHOD(ret_type, func_name, params, method_body)
ret_type: 関数の戻り値の型(例:bool, int, void*)。func_name: メソッドの名前。params: 関数のパラメータ(括弧で囲む必要があります)。method_body: { } で囲まれた関数の実際のロジック。この例では、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呼び出しでレジストリ操作を実行するのに役立ちます。