ЗАДАЧА:
Я создаю набор задач обратного инжиниринга сборки x86, из которых я уже выполнил двадцать или около того.Они просто для развлечения / образования.
Текущая задача - одна из наиболее продвинутых и включает в себя некоторые хитрости, из-за которых создается впечатление, что EP на самом деле входит в обычную программу, но на самом деле он упакован вдругой раздел PE.
Вот основной поток:
- Запускается, как если бы это было обычное приложение MSVC ++.
- Внедрил скрытый вызов в группутрюков анти-отладчика.
- Если они проходят, DWORD в памяти устанавливается на 1.
- Позже в потоке программы он проверяет, что это значение равно 1, и если это работаетрасшифровывает небольшую таблицу вызовов.Если происходит сбой, он отправляет их в погоню за ложными уловками, препятствующими отладке, и в конечном итоге просто падает.
- Таблица вызовов указывает на реальные процедуры дешифрования, которые дешифруют секцию действительного кода программы.
- Вызываются процедуры дешифрования, и они дешифруются с использованием базового зацикленного xor (C ^ k ^ n, где C - это зашифрованный текст, k - это 32-битный ключ, а n - текущее смещение данных)
- VirtualProtectиспользуется для переключения флагов защиты раздела с RW на RX.
- Поток управления перенаправлен на OEP, программа запускается.
Идея состоит в том, что, поскольку они думают, что они в нормепрограммный поток, он заставляет их пропустить анти-отладочный вызов и последующие проверки.В любом случае, все работает нормально.
ПРОБЛЕМА:
В настоящее время проблема заключается в том, что OllyDbg и несколько других инструментов смотрят на упакованный раздел и видят, что он имеет высокую энтропиюи выбросить предупреждение, что оно упаковано.Указатель на секцию кода в заголовке PE установлен правильно, поэтому он не получает этого от наличия внешнего кода EP - это чисто энтропийный анализ.
ВОПРОС:
Есть ли способ шифрования, который я могу использовать, который сохраняет низкую энтропию, но все еще прост в реализации в asm x86?Я не хочу использовать простой xor, так как это слишком просто, но я также не хочу, чтобы он поймал его как упакованный и выдал игру.
Я думал о чем-то вроде шаффлера (как-тосоздать ключевой поток и использовать его для обмена 4-байтовыми блоками кода), но я не уверен, что это сработает или даже будет простым.
У кого-нибудь есть идеи?