На протяжении недели я пытался хоть как то прикрутить к простейшей dll защиту импортов, но не нашел ни одного нормального туториала или хотябы обьяснения.
1. **Шифрование строк:**
A) Имена DLL и функций (типа kernel32.dll, GetProcAddress) шифруются XOR/RC4/AES
B) Ключ хранится в .rdata секции, не в .text
C) Дешифрация происходит при вызове, не при старте
2. **Runtime resolve:**
A) Вместо статического импорта — ищем модули через PEB (Process Environment Block)
B) Проходим по InMemoryOrderModuleList
C) Сравниваем имена модулей по хешу, а не строке
3. **Обход детекта:**
A) Не используем LoadLibrary/GetProcAddress — это триггер
B) Ищем базу модуля через PEB->Ldr
C) Парсим PE-заголовки вручную (DOS -> NT -> Export Directory)
4. **Сокрытие вызовов:**
A) Каждый API вызывается через обфусцированный wrapper
B) Используем syscall напрямую, не через ntdll.dll
C) Добавляем фейковые вызовы для маскировки
5. **Динамическая загрузка:**
A) API резолвится не при старте, а при первом использовании
B) Кешируем указатели в зашифрованной структуре
C) После использования — обнуляем кеш
6. **Защита от дампа:**
A) IAT таблица в .data шифруется при неактивности
B) При отладке — вставляет невалидные указатели
C) Использует self-modifying code для сегментов
7. **Anti-hook:**
A) Проверяет целостность resolved функций через CRC
B) Если найден hook — перезагружает DLL
C) Использует alternative syscall для обхода
8. **Техника вызова:**
A) Каждый вызов маскируется через trampoline
B) Используется разный стек для каждого вызова
C) Добавляются задержки для обхода behavioral анализа
Вместо фиксированных адресов в IAT — динамическое резолвинг через PEB + шифрование строк + syscall обход. Это делает статический анализ почти невозможным
1. Шифрование строк:
A) Имена DLL и функций (типа kernel32.dll, GetProcAddress) шифруются XOR/RC4/AES
B) Ключ хранится в .rdata секции, не в .text
C) Дешифрация происходит при вызове, не при старте
2. Runtime resolve:
A) Вместо статического импорта — ищем модули через PEB (Process Environment Block)
B) Проходим по InMemoryOrderModuleList
C) Сравниваем имена модулей по хешу, а не строке
3. Обход детекта:
A) Не используем LoadLibrary/GetProcAddress — это триггер
B) Ищем базу модуля через PEB->Ldr
C) Парсим PE-заголовки вручную (DOS -> NT -> Export Directory)
4. Сокрытие вызовов:
A) Каждый API вызывается через обфусцированный wrapper
B) Используем syscall напрямую, не через ntdll.dll
C) Добавляем фейковые вызовы для маскировки
5. Динамическая загрузка:
A) API резолвится не при старте, а при первом использовании
B) Кешируем указатели в зашифрованной структуре
C) После использования — обнуляем кеш
6. Защита от дампа:
A) IAT таблица в .data шифруется при неактивности
B) При отладке — вставляет невалидные указатели
C) Использует self-modifying code для сегментов
7. Anti-hook:
A) Проверяет целостность resolved функций через CRC
B) Если найден hook — перезагружает DLL
C) Использует alternative syscall для обхода
8. Техника вызова:
A) Каждый вызов маскируется через trampoline
B) Используется разный стек для каждого вызова
C) Добавляются задержки для обхода behavioral анализа
Вместо фиксированных адресов в IAT — динамическое резолвинг через PEB + шифрование строк + syscall обход. Это делает статический анализ почти невозможным