Skip to content

Latest commit

 

History

History
76 lines (61 loc) · 7.52 KB

File metadata and controls

76 lines (61 loc) · 7.52 KB

Языки: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية

← Компилятор dyncode

Компилятор dyncode — отслеживание прогресса

Этап 0 — macOS arm64 MVP (завершён)

  • Скелет каталогов и CMake (библиотека nevercDynCode)
  • ZeroRelocPass: двухфазный (Prep + Stackify), автоматический перенос изменяемых глобалов на стек
  • Data2TextPass: двухфазный (массивы констант → хранение блоками на стеке; разделение векторных констант после SROA; ConstantFP → битовые шаблоны через volatile-загрузку)
  • SyscallStubPass: табличный белый список для Darwin BSD / Linux arm64 / Linux x86_64 / Android syscall
  • AllBlrPass: опциональная агрессивная замена прямых вызовов на косвенные
  • DynCodeExtractor: Mach-O .o → плоский .bin с патчами внутрисекционных релокаций
  • CLI-опции через сгенерированный neverc/include/neverc/Invoke/Options.td.h: -fdyncode, -fdyncode-all-blr, -mdyncode-syscall, -fdyncode-keep-obj=, -fdyncode-entry=
  • PIC по умолчанию на всех платформах (isPICDefault() возвращает true повсеместно)
  • Обобщённый рекурсивный перенос на стек (таблицы указателей на функции, таблицы строковых указателей, вложенные таблицы структур, инициализаторы ConstantExpr GEP/BitCast)
  • IndirectBrPass: GCC computed-goto (&&label) → switch, включая разделение таблиц мульти-диспатч-сайтов
  • Инлайнинг SIMD-векторных констант (inlineVectorConstants)
  • Автоматическое понижение _Thread_local до static
  • Нативный загрузчик macOS arm64 (MAP_JIT + i-cache flush)

Тесты: 108/108 dyncode-ассертов пройдено. Размеры бинарников: add 8B, fib 64B, hello 64B, big_const 632B.

Этап 1 — Linux / Android / Windows кроссплатформенность (завершён)

  • Абстракция TargetDesc: табличные различия платформ
  • Кроссплатформенная семантика -mdyncode-syscall (заменяет -mdyncode-libsystem только для Darwin)
  • Таблицы номеров syscall Linux / Android (Darwin BSD 100+, Linux arm64 130+, Linux x86_64 150+)
  • DynCodeExtractor рефакторирован в MachOExtractor / ELFExtractor / COFFExtractor
  • ELF-экстрактор (arm64: R_AARCH64_CALL26/JUMP26/ADR_PREL_PG_HI21/и т.д.; x86_64: R_X86_64_PC32/PLT32)
  • COFF-экстрактор (arm64: IMAGE_REL_ARM64_BRANCH26/и т.д.; x86_64: IMAGE_REL_AMD64_REL32/и т.д.)
  • Проход импорта PEB Windows (WinPEBImportPass) с реальным PEB-walk-резолвером
  • Мульти-DLL белый список Win32 API (~210 API в kernel32/ntdll/user32/ws2_32/advapi32/shell32)
  • MemIntrinPass: memcpy/memset/memmove/memcmp/bcmp/bzero/memchr + strlen/strcpy/strcmp/и т.д. → инлайн-хелперы на основе байтовых циклов
  • CompilerRtPass: деление/остаток __int128 → инлайн-хелперы длинного деления
  • Поддержка фронтенда Windows aarch64-pc-windows-msvc
  • MIRPrepPass: кроссплатформенное удаление псевдо-инструкций (CFI/EH/XRay/StackMap/SEH/FENTRY/и т.д.)
  • MIR + хуки обфускации на уровне байтов (11 хуков на уровнях IR/MIR/байтового потока)
  • Автоматическое понижение AArch64 не-Darwin long double до binary64
  • Шим-заголовки dyncode: <windows.h>, <unistd.h>, <fcntl.h>, <sys/stat.h>, <sys/mman.h>, <string.h>, <stdlib.h>
  • Слой совместимости Windows POSIX (13 мостов POSIX→Win32: write→WriteFile, mmap→VirtualAlloc и т.д.)
  • Автоисправление неявных объявлений K&R (50+ канонических POSIX-сигнатур)
  • Табличная очистка (жёсткое кодирование архитектурных ветвей → ноль)
  • KernelImportPass: автоматическая перезапись callsite ring-0 с поддержкой резолвера
  • Табличная диагностика имён хелперов ядра (KernelHelperNames.def)
  • <neverc/dyncode/kernel.h> для конвенций точки входа ring-0
  • Принудительное смещение точки входа на ноль (placeEntryFirst)
  • Конвейер финализации: SDK перезаписи плохих байтов + SDK кодировщика charset + ограничения размера
  • Внедеревный C-плагин API (NevercPluginAPI.h): 11 точек подключения dyncode (NEVERC_INTERPOSE_SC_*)
  • Инъекция -mno-implicit-float для x86_64 (предотвращает вынос SSE-констант бэкенда в пул)
  • Кроссплатформенные загрузчики (macOS/Linux/Windows)

Тесты: 743+ dyncode-ассертов, все пройдены на 8 тройках. Полный набор тестов NeverC: 1000+ тестов пройдено.

Этап 2 — печатный / буквенно-цифровой кодировщик (запланирован)

  • ARM64 кодировщик печатного dyncode (поднабор инструкций 0x20–0x7e)
  • x86_64 буквенно-цифровой кодировщик
  • Генерация самодекодирующего стаба (decoder stub)
  • Статистика размера / энтропии после кодирования

Этап 3 — полиморфизм / самомодификация (запланирован)

  • Полиморфный движок: один и тот же исходный код → разные эквивалентные байтовые последовательности при каждой компиляции
  • Самомодифицирующийся код: расшифровка / декомпрессия тела полезной нагрузки во время выполнения
  • Антидетектирование: избегание известных шаблонов сигнатур dyncode

Будущие расширения

  • iOS arm64 (подпись кода + сценарии JIT-джейлбрейка)
  • Cortex-M / Thumb
  • RISC-V 64