

obfus.h は、Cアプリケーションをコンパイル時に難読化するためのマクロオンリーのライブラリで、特に Tiny C (tcc) 向けに設計されています(ここからダウンロードできます -> Tiny-C-Compiler/releases)。Windows x86 および x64 プラットフォーム向けに調整されており、ほぼすべてのバージョンのコンパイラをサポートしています。Cプログラムにとって非常に信頼性の高いアーマーです!
obfus.h をプロジェクトに統合するのは簡単なプロセスです。コードに次の行を追加するだけです:
#include "obfus.h"
これにより、コンパイル中にコードが自動的に難読化され、知的財産の保護と機密性が保証されます。
保護設定に利用可能なオプション:
// Advanced code protection (see the "Virtualization" part of the documentation!) #define VIRT 1 // Allows you to use the functions of a math VM // Additional options #define CFLOW_V2 1 // More powerful Control Flow obfuscation (slowly!) #define ANTIDEBUG_V2 1 // Use better dynamic anti-debugging protection #define FAKE_SIGNS 1 // Adds fake signatures of various protectors or packers // Disabling default features #define NO_OBF 1 // Don't obfuscate (for debugging) #define NO_CFLOW 1 // Don't use Control-Flow obfuscation #define NO_ANTIDEBUG 1 // Don't build in debugging protectionまたはコンパイラ引数で使用する場合:
tcc "app.c" -w -D NO_CFLOW -D ANTIDEBUG_V2 -D FAKE_SIGNS -D VIRT
[!WARNING] 難読化を有効にしてアプリケーションをコンパイルするときは、警告を抑制するために
-w引数を使用してください。そうしないと、コンソールに、最終結果には影響しない数多くの威圧的なログが表示されます。それらを心配する必要はありません。
🔐 デバッグ保護は、多くの基本的なMSVCRT関数への呼び出しによってトリガーされます。
コードの重要な場所では、ANTI_DEBUG; 構文を使用できます。例:
ANTI_DEBUG;
if (!licenseExpired()) {
// ...
}
HIDE_STRING(str) は文字列を変異させて難読化し、視覚的に隠すことで、ソースコード内での発見やパッチ適用を大幅に困難にします。この方法で宣言された文字列は、一度にロードされるのではなく mov 命令を通じてスタック上に組み立てられます。この手法により、文字列が静的に宣言されることはなく、実行時に構築されるため、静的解析の影響を受けにくくなります。ただし、この機能は関数呼び出しを伴うため、静的フィールドの宣言時に隠すために使用することはできないことに注意してください。
[!IMPORTANT] 一部の逆コンパイラは、静的最適化によりそれらを明らかにする可能性があります。逆アセンブラ出力では、コードは複雑で厄介に見えるため、単純な解析は妨げられますが、意図的なリバースエンジニアリングの試みを完全に防ぐことはできないかもしれません。
標準ライブラリの printf 関数を、メッセージの静的隠蔽とスタック上での復号化とともに呼び出す例:
char *hidden_message = HIDE_STRING("Hello, world!");
// ...
printf(hidden_message);
これは、特定の計算がコマンドに応じて組み込み仮想マシンを介して実行される保護技術です。数学演算の解析を非常に困難にします! VIRT オプションを有効にした場合にのみ機能します。そうでない場合、仮想マシンコマンドはすべて通常の数学演算子に置き換えられます。
[!WARNING] 重要な場所での仮想化は最適化に影響を与える可能性があります。本当に必要な領域でのみ注意して使用してください
仮想マシンは、一部の基本的な
double比較演算をサポートしていません。
仮想マシン呼び出しを使用する論理演算子を使用して、コードの理解をさらに複雑にすることができます:
| 演算子 | 説明 |
|---|---|
VM_IF | if の代わりに使用します |
これは if/else の完全な置き換えではなく、標準の演算子を複雑にするだけです。
仮想化の簡単な使用例:
// ...
#define VIRT 1
// ...
// if ((2 + 2) == 4) { ... }
VM_IF (VM_EQU(VM_ADD(2, 2), 4)) {
printf("2 + 2 == 4!");
}
// if (condition1) { ... }
// else if (condition2) { ... }
// else { ... }
VM_IF (condition1) {
// if
} VM_ELSE_IF (condition2) {
// else if
} VM_ELSE {
// else
}
仮想マシンのすべての関数の使用例は、ファイル tests/virtualmachine.c にあります。
熟練したリバーサーに対する高度な保護が必要な場合は、CFLOW_V2 と ANTIDEBUG_V2 オプションを使用してください。
// Let's obfuscate your code!
#include <stdio.h>
#define VIRT 1 // [+] Use math virtual machine
#define CFLOW_V2 1 // [+] ControlFlow v2
#define FAKE_SIGNS 1 // [+] Fake signatures
#define ANTIDEBUG_V2 1 // [+] AntiDebug v2
#define NO_OBF 0 // [-] Don't obfuscate (disable all)
#define NO_CFLOW 0 // [-] Disable ControlFlow
#define NO_ANTIDEBUG 0 // [-] Disable AntiDebug
#include "obfus.h"
void main() {
char *out = malloc(256);
strcpy(out, HIDE_STRING("Hello, world!\n"));
if (out) {
printf(out);
} else {
printf("Error!\n");
}
free(out);
int result = VM_ADD(5, 7); // 5 + 7
VM_IF (VM_EQU(result, 12)) { // (5 + 7) == 12
printf("5 + 7 == 12");
}
}
最新バージョンの Tiny C(0.9.27)の使用をお勧めします。残念ながら、一部のバージョンのコンパイラは完全な難読化に必要な機能をサポートしていません。Visual C、GCC、Clang はサポートされておらず、サポートされる見込みもありません。
Windows用の特別なスクリプトを使用すると、公式リポジトリからパッケージをダウンロードして obfus.h の最新バージョンを取得できます。これは、git を使用せずにセキュリティ更新を自動化する必要がある場合に便利です。
たとえば、プロジェクトのビルド前に使用できます:
+ C:\...> call obfh-update C:\...> tcc app.c -wスクリプトは、カレントディレクトリ内の obfus.h ファイルの内容を更新します(指定された設定に応じて)
obfus.h を使用して保護されたプログラムのコード(およびその元の本来のロジック)は、ほぼ復元(難読化解除)不可能です。ただし、この難読化ツールを使用しても、すべての種類の脅威に対する完全な保護は保証されません。内部プログラムのセキュリティシステムを開発し、維持することが重要です。
難読化後の図式的なコードの見え方:
リバーサーが逆コンパイラを使用しようとした場合、次のようなものが表示されます:
HIDE_STRING機能で隠された文字列はすべて、逆アセンブラ(x86-64アーキテクチャ)では次のように見えます:; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; PROTECTED STRING: ; ORIGINAL STRING: ; mov eax, 48h lea rax, aHelloWorld ; mov [rbp-0Fh], al mov r11, rax ; mov eax, 65h ; . . . ; mov [rbp-0Eh], al ; mov eax, 6Ch ; mov [rbp-0Dh], al ; mov eax, 6Ch ; mov [rbp-0Ch], al ; mov eax, 6Fh ; mov [rbp-0Bh], al ; mov eax, 2Ch ; ; etc . . . ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
このプロジェクトの開発を手伝ってくれたすべての人に感謝します。感謝しています! ❤️
そして、このプロジェクトに注目してくれたあなたに感謝します 🤝!
| 関数 | 型 | 演算子 | 説明 | 例 |
|---|
VM_ADD | long | + | 2つの数値を加算します | VM_ADD(5, 3) = 8 |
VM_SUB | long | - | 2つの数値を減算します | VM_SUB(5, 3) = 2 |
VM_MUL | long | * | 2つの数値を乗算します | VM_MUL(5, 3) = 15 |
VM_DIV | long | / | 2つの数値を除算します | VM_DIV(6, 3) = 2 |
VM_MOD | long | % | 2つの数値の剰余を計算します | VM_MOD(5, 3) = 2 |
VM_EQU | BOOL | == | 2つの数値が等しいかどうかをチェックします | VM_EQU(5, 5) = true |
VM_NEQ | BOOL | != | 2つの数値が等しくないかどうかをチェックします | VM_NEQ(5, 3) = true |
VM_LSS | BOOL | < | 最初の数値が2番目の数値より小さいかどうかをチェックします | VM_LSS(3, 5) = true |
VM_GTR | BOOL | > | 最初の数値が2番目の数値より大きいかどうかをチェックします | VM_GTR(5, 3) = true |
VM_LEQ | BOOL | <= | 最初の数値が2番目の数値以下かどうかをチェックします | VM_LEQ(3, 5) = true |
VM_GEQ | BOOL | >= | 最初の数値が2番目の数値以上かどうかをチェックします | VM_GEQ(5, 3) = true |
VM_ADD_DBL | long double | + | 2つのdouble数値を加算します | VM_ADD_DBL(5.5, 3.2) = ≈8.7 |
VM_SUB_DBL | long double | - | 2つのdouble数値を減算します | VM_SUB_DBL(5.5, 3.2) = ≈2.3 |
VM_MUL_DBL | long double | * | 2つのdouble数値を乗算します | VM_MUL_DBL(5.5, 3.2) = ≈17.6 |
VM_DIV_DBL | long double | / | 2つのdouble数値を除算します | VM_DIV_DBL(6.0, 3.0) = ≈2.0 |
VM_LSS_DBL | BOOL | < | 最初のdouble数値が2番目のdouble数値より小さいかどうかをチェックします | VM_LSS_DBL(3.5, 5.2) = true |
VM_GTR_DBL | BOOL | > | 最初のdouble数値が2番目のdouble数値より大きいかどうかをチェックします | VM_GTR_DBL(5.5, 3.2) = true |
VM_ELSE_IF | else if の代わりに使用します |
VM_ELSE | else の代わりに使用します |