
TinyLoad v7.3
Паковщик и криптер с открытым исходным кодом для Windows x64 PE. Сжимает и шифрует исполняемые файлы с помощью пользовательской виртуальной машины, помещая их в самораспаковывающуюся заглушку.
TinyLoad v7.3 - упаковщик PE для Windows
TinyLoad — это криптор/упаковщик PE для исполняемых файлов x64. Он упаковывает входной exe с несколькими уровнями защиты, чтобы предотвратить реверс-инжиниринг. Это один-единственный файл .cpp без внешних зависимостей.
как это работает
TinyLoad дописывает вашу полезную нагрузку в свою собственную копию. Когда упакованный exe запускается, он извлекает полезную нагрузку, расшифровывает её и выполняет напрямую в памяти, ни разу не записывая оригинал на диск. Каждый раз, когда вы что-то упаковываете, опкоды VM случайным образом изменяются и помещаются в 4 подтаблицы с независимыми ключами, поэтому двух одинаковых сборок не бывает.
загрузка
Возьмите готовый бинарник из releases или соберите его самостоятельно.
сборка из исходников
Вам понадобится MinGW (g++). Просто запустите:
g++ -o TinyLoad.exe TinyLoad.cpp -static -O2 -s
или используйте build.bat.
использование
TinyLoad.exe --i <input> [--o <output>] [--vm] [--c] [--veh]
| флаг | что делает |
|---|---|
--i <file> | входной exe для упаковки |
--o <file> | путь к выходному файлу (по умолчанию: input_packed.exe) |
--vm | VM-шифрование |
--c | сжатие LZ77 |
--veh | расшифровка по page fault через VEH |
--noconsole | GUI-подсистема |
Вам нужен как минимум один из --vm, --c или --veh.
примеры
изображения DIE
сжатие
Кастомное сжатие LZ77 с сопоставлением по хеш-цепочкам и скользящим окном 64 КБ. Сначала выполняется сжатие, затем поверх него накладывается VM-шифрование, так что любые закономерности в сжатых данных тоже скрываются.
VM-шифрование
Кастомная виртуальная машина с 28 опкодами, работающая внутри стаба. Опкоды случайным образом распределяются по 4 подтаблицам по 8 штук, и каждая подтаблица XOR-зашифрована своим ключом, полученным из данных полезной нагрузки. Взлом одной подтаблицы раскрывает максимум 8 из 28 опкодов. Сам шифр — это 128-битный потоковый шифр с перемешиванием ключа через rotl и rotr, выполняемый целиком внутри интерпретатора VM. Полезная нагрузка шифруется с помощью XXTEA.
расшифровка по page fault через VEH
При включённом --veh все страницы секций PE отображаются как PAGE_NOACCESS. Когда программа пытается обратиться к странице, возникает исключение; векторизованный обработчик исключений расшифровывает только эту одну страницу и устанавливает корректную защиту. В фоне работает поток-сторож (watchdog), который повторно шифрует любую страницу, к которой не было обращений в течение 200 мс. В любой момент времени большая часть вашей программы остаётся зашифрованной в памяти, поэтому дампы памяти захватывают только то, к чему недавно обращались.
защита от дампа
4 наиболее критичных API (GetModuleHandleA, GetProcAddress, ExitProcess, VirtualAlloc) перенаправляются через функции-обёртки внутри стаба. После загрузки полезной нагрузки весь каталог импорта зануляется, чтобы дампы памяти не могли восстановить таблицу импорта.
Граф:
лицензия
MIT
примечания
- Многие функции не попали в readme — можете почитать код самостоятельно или заглянуть в changelog.md
- это работает с большинством протестированных файлов; если что-то сломается на вашем, откройте issue, и я разберусь
- предложения и идеи функций тоже можно оформлять через issues
- если пользуетесь им — звёздочка очень помогает <3
- следите за обновлениями в блоге: https://iamsopotatoe-coder.github.io/TinyLoad/#blog
- да, антивирусы помечают упаковщики, это ожидаемо (сейчас 9 детектов на VirusTotal — любой файл, который вы упакуете, получит 9 детектов, содержимое не важно)
- пожалуйста, не упаковывайте с его помощью вредоносное ПО — он создан для легитимных целей