Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
obfus.h — Макро-заголовок для обфускации C на этапе компиляции (tcc, win x86/x64) | Kitploit
Инструменты/GitHubGitHub/dosx-dev/obfus.h
Оборонительные ИнструментыАнализ КодаОбратная инженерияВиртуализация для безопасностиАнализ Бинарных Файлов
GitHubdosx-dev/obfus.h

obfus.h

Макро-заголовок для обфускации C на этапе компиляции (tcc, win x86/x64)

Репозиторий
1.7k15015 дней назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Сайт

obfus.h

obfus.h — это библиотека только на макросах для обфускации C-приложений во время компиляции, предназначенная специально для Tiny C (tcc) (скачать можно здесь -> Tiny-C-Compiler/releases). Она ориентирована на платформы Windows x86 и x64 и поддерживает почти все версии компилятора. Очень надёжная броня для ваших C-программ!

Какие возможности она предоставляет?...

  • 🔍 Обфускация вызовов функций: Запутывает вызовы функций, делая ваш код менее читаемым для посторонних глаз.
  • 🛡️ Методы анти-отладки: Встроенные механизмы для предотвращения анализа кода во время выполнения.
  • 🔄 Мутация контрольного потока кода: Превращает код в спагетти, затрудняя разбор условий и циклов.
  • 🧶 Скрытие строк: Скрывает указанные строки в файле и динамически собирает их при выполнении.
  • 🚫 Методы анти-декомпиляции: Делает многие популярные декомпиляторы бесполезными, визуально ломая их вывод.
  • 😈 Добавление фейковых сигнатур: Может добавлять фейковые сигнатуры различных упаковщиков и протекторов, чтобы запутать реверс-инженеров.
  • 🧠 Виртуализация: Делает математические операции очень сложными для понимания с помощью команд виртуальной машины.

👾 Использование

Интеграция obfus.h в ваш проект — простой процесс. Просто добавьте следующую строку в ваш код:

root@kitploit:~
#include "obfus.h"

Это автоматически обфусцирует ваш код во время компиляции, обеспечивая защиту и конфиденциальность вашей интеллектуальной собственности.

Доступные опции для настройки защиты:

root@kitploit:~
// 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

или используйте их с аргументами компилятора:

root@kitploit:~
tcc "app.c" -w  -D NO_CFLOW  -D ANTIDEBUG_V2  -D FAKE_SIGNS  -D VIRT

[!WARNING] При компиляции приложения с обфускацией используйте аргумент -w для подавления предупреждений. В противном случае в консоли появится множество устрашающих логов, которые никак не влияют на конечный результат. Не стоит их пугаться.

🔐 Защита от отладки активируется вызовами многих базовых функций MSVCRT. В критических местах кода вы можете использовать конструкцию ANTI_DEBUG;. Например:

root@kitploit:~
ANTI_DEBUG;
if (!licenseExpired()) {
	// ...
}

🧶 Скрытие строк

Макрос HIDE_STRING(str) обфусцирует и визуально скрывает строки, мутируя их, что значительно усложняет их поиск и патчинг в исходном коде. При таком объявлении строки собираются на стеке через инструкции mov, а не загружаются целиком. Этот метод гарантирует, что строки не объявляются статически, а создаются во время выполнения, что делает их менее уязвимыми для статического анализа. Однако важно отметить, что эту возможность нельзя использовать для скрытия статических полей при их объявлении, так как она включает вызов функции.

[!IMPORTANT] Некоторые декомпиляторы всё же могут раскрыть их из-за статических оптимизаций. В выводе дизассемблера код будет выглядеть сложным и громоздким, что может отпугнуть поверхностный анализ, но не всегда полностью предотвратит целеустремлённые попытки реверс-инжиниринга.

Пример вызова функции printf из стандартной библиотеки со статическим скрытием сообщения и его расшифровкой на стеке:

root@kitploit:~
char *hidden_message = HIDE_STRING("Hello, world!");
// ...
printf(hidden_message);

👺 Виртуализация

Это техника защиты, при которой некоторые вычисления выполняются через встроенную виртуальную машину по команде. Делает анализ математических операций очень сложным! Работает только при включённой опции VIRT (и только!). В противном случае все команды виртуальной машины будут заменены обычными математическими операторами.

[!WARNING] Виртуализация в критических местах может повлиять на оптимизацию. Используйте с осторожностью только там, где это действительно необходимо

Виртуальная машина не поддерживает некоторые базовые операции сравнения с double.

Вы можете использовать логические операторы, которые задействуют вызовы виртуальной машины, чтобы ещё сильнее запутать понимание вашего кода:

OperatorDescription
VM_IF

Это не полная замена if/else, а лишь усложнение стандартных операторов.

Простой пример использования виртуализации:

root@kitploit:~
// ...
#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.

root@kitploit:~
// 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 не поддерживаются и вряд ли будут поддерживаться.

🌐 Обновление obfus.h

Вы можете использовать специальный скрипт для Windows, чтобы получить последние версии obfus.h, загрузив пакет из официального репозитория. Это полезно, если вам нужно автоматизировать обновления безопасности без использования git.

Например, вы можете использовать его перед сборкой проекта:

root@kitploit:~
+ C:\...> call obfh-update
  C:\...> tcc app.c -w

Скрипт обновит содержимое файла obfus.h в текущем каталоге (согласно указанной конфигурации)

🦎 Аудит безопасности и сообщество

  • Defeating a Heavily Obfuscated Binary - Black-box анализ внутренних механизмов защиты obfus.h и его деобфускация. Все уязвимости на данный момент исправлены.
  • ObfusHunter - Утилита для сканирования файлов, защищённых obfus.h

📖 Итог

Код программы (и её исходная логика), защищённый с помощью obfus.h , почти невозможно восстановить (деобфусцировать). Однако использование этого обфускатора не гарантирует полной защиты от всех типов угроз. Важно разрабатывать и поддерживать внутренние системы безопасности программы.

Как будет выглядеть код после обфускации:

Реверсер увидит примерно это, если попытается использовать декомпилятор:

Вот как все скрытые строки через функцию HIDE_STRING выглядят в дизассемблере (архитектура x86-64):

root@kitploit:~
  ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  ; 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 . . .                                                     ;
  ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

🌈 Особая благодарность

Спасибо всем, кто помогал в разработке этого проекта. Я ценю это! ❤️

  • 👨🏼‍💻 @horsicq (за помощь с кодом и советы)
  • 🐺 @ac3ss0r (за классные идеи и их решения)

И спасибо вам 🤝 за то, что обратили внимание на этот проект!

Скачать инструмент
FunctionTypeOpDescriptionExample
VM_ADDlong+Складывает два числаVM_ADD(5, 3) = 8
VM_SUBlong-Вычитает два числаVM_SUB(5, 3) = 2
VM_MULlong*Умножает два числаVM_MUL(5, 3) = 15
VM_DIVlong/Делит два числаVM_DIV(6, 3) = 2
VM_MODlong%Вычисляет остаток от деления двух чиселVM_MOD(5, 3) = 2
VM_EQUBOOL==Проверяет, равны ли два числаVM_EQU(5, 5) = true
VM_NEQBOOL!=Проверяет, не равны ли два числаVM_NEQ(5, 3) = true
VM_LSSBOOL<Проверяет, меньше ли первое число второгоVM_LSS(3, 5) = true
VM_GTRBOOL>Проверяет, больше ли первое число второгоVM_GTR(5, 3) = true
VM_LEQBOOL<=Проверяет, меньше или равно ли первое число второмуVM_LEQ(3, 5) = true
VM_GEQBOOL>=Проверяет, больше или равно ли первое число второмуVM_GEQ(5, 3) = true
VM_ADD_DBLlong double+Складывает два числа типа doubleVM_ADD_DBL(5.5, 3.2) = ≈8.7
VM_SUB_DBLlong double-Вычитает два числа типа doubleVM_SUB_DBL(5.5, 3.2) = ≈2.3
VM_MUL_DBLlong double*Умножает два числа типа doubleVM_MUL_DBL(5.5, 3.2) = ≈17.6
VM_DIV_DBLlong double/Делит два числа типа doubleVM_DIV_DBL(6.0, 3.0) = ≈2.0
VM_LSS_DBLBOOL<Проверяет, меньше ли первое число double второго числа doubleVM_LSS_DBL(3.5, 5.2) = true
VM_GTR_DBLBOOL>Проверяет, больше ли первое число double второго числа doubleVM_GTR_DBL(5.5, 3.2) = true
Используйте вместо if
VM_ELSE_IFИспользуйте вместо else if
VM_ELSEИспользуйте вместо else