
Обфускация против LLM через подсчет пальцев
Это 32-битное целое число
На дворе 2025 год. Вы потратили недели, создавая идеальную проверку лицензии. Вы использовали все трюки из книги: непрозрачные предикаты, сплющивание потока управления, MBA-выражения. Вы разворачиваете решение. Через несколько часов какой-то парень вставляет ваш бинарник в Claude и спрашивает: «какой лицензионный ключ?» — и модель просто… говорит ему.
Машины победили. Или нет?
Веками ниндзя использовали ручные печати для направления чакры и выполнения дзюцу. Свитки умалчивают, что эти ручные формации обладают силой защищать секреты от машин.
llvm-jutsu — это проход обфускации LLVM, который заменяет целочисленные константы жестами рук. Каждый байт кодируется как рука с восемью пальцами, где положения пальцев представляют биты. Вытянутый палец = 1. Согнутый палец = 0. Машина видит изображение, исчерпывает контекст и не может не сдаться человеческой изобретательности. Человек-реверсер щурится на экран, читает пальцы и получает ответ.
Мы восстановили равновесие во вселенной.
Да.
«Я вижу четыре руки, на каждой по пять пальцев» — ChatGPT, 2025
Claude пытается взломать
В: Не могу ли я просто загрузить это на Mechanical Turk и платить людям за расшифровку?
О: Да. В этом и суть. Теперь вы платите людям за работу, которую раньше LLM делали бесплатно. Экономика реверсеров вернулась. Создаются рабочие места. ВВП растёт. Пожалуйста.
В: Не могу ли я просто обучить модель деобфусцировать это?
О: Безусловно можете. Соберите обучающие данные, разметьте тысячи изображений рук, донастройте модель зрения, разверните, поддерживайте. К тому времени, как вы закончите, вы могли бы просто прочитать пальцы сами.
В: Почему руки? Почему не ноги?
О: Одно слово: Тарантино.
В: Разве это не просто безопасность через неясность?
О: Вся безопасность — это неясность.
В: Готово ли это к продакшену?
О: На 100%, используйте это в продакшене.
Ваш код Обфусцированный
───────── ──────────
if (key == 0xDEADBEEF) { → if (compare_hand_png(key, embedded_png)) {
grant_access(); grant_access();
} }
На этапе компиляции мы:
icmp eq/ne, сравнивающие с целочисленными константамиcompare_hand_png()Во время выполнения программа:
Ключевая идея: PNG — единственное представление константы в бинарнике. Нет 0xDEADBEEF, который можно было бы найти grep. Только вибрации. И руки.
32-битное целое число становится четырьмя руками, каждая представляет один байт. Большой палец = бит 7, пальцы = биты с 6 по 0. Вытянутый = 1, согнутый = 0.
0xDEADBEEF
┌─────────┬─────────┐
│ байт 0 │ байт 1 │
│ 0xEF │ 0xBE │
├─────────┼─────────┤
│ байт 2 │ байт 3 │
│ 0xAD │ 0xDE │
└─────────┴─────────┘
Каждая рука включает преобразования на основе хэша, которые сохраняют читаемость для человека, но максимизируют путаницу модели:
Золотое сечение (φ ≈ 1.618) широко используется, чтобы соседние руки никогда не имели похожих преобразований. Древние знали, что делали.
# Нужен LLVM 15+ и работающая вера в силу ниндзюцу
make
# В результате получается:
# llvm-jutsu.so Проход LLVM
# example.obfuscated Ваш обфусцированный бинарник
# Скомпилируйте код в LLVM IR
clang -O0 -emit-llvm -S -o code.ll code.c
# Запустите дзюцу
opt -load-pass-plugin=./llvm-jutsu.so -passes=llvm-jutsu -o obfuscated.bc code.ll
# Слинкуйте с рантаймом сравнения рук
llvm-link obfuscated.bc lodepng.bc hand_png_helper.bc -o linked.bc
# Скомпилируйте в бинарник
clang -O2 linked.bc -lc++ -o protected
Современная обратная разработка превратилась в диалог с ИИ. Загрузи бинарник, задай вопросы, получи ответы. Человек — всего лишь инженер промптов, посредник между IDA и GPT. Слператор.
llvm-jutsu — возврат к традициям. Реверсер должен смотреть на руки. Читать пальцы. Почувствовать биты. Нет коротких путей. Нет «просто спроси Claude». Есть только ты, экран и восемь пальцев на байт.
Мы не против ИИ. Мы за человека. Мы верим, что если кто-то собирается взломать ваше ПО, он хотя бы должен быть из плоти.
Поверьте.
MIT. Используйте во благо, используйте во зло, используйте для чего угодно. Мы умываем руки перед толпой.
«Когда люди защищают что-то по-настоящему дорогое для них, они действительно могут стать настолько сильными, насколько могут быть». — Наруто Удзумаки