Упакованная и зашифрованная секция в задаче реверсирования x86, не нарушая эвристику энтропии

ЗАДАЧА:

Я создаю набор задач по реверс-инжинирингу сборки x86, которых у меня уже двадцать или около того. Они просто для развлечения / образования.

Текущая задача - одна из более продвинутых, и включает в себя некоторые хитрости, которые заставляют выглядеть так, как будто EP находится в обычной программе, но на самом деле он упакован в другом разделе PE.

Вот основная схема:

  • Начинается как обычное приложение MSVC++.
  • Вставляется хитрый вызов кучи антиотладочных трюков.
  • Если они проходят, то DWORD в памяти устанавливается в 1.
  • Позже в потоке программы проверяется, что это значение равно 1, и если это срабатывает, то расшифровывается небольшая таблица вызовов. Если это не удается, программа отправляет их в погоню за дикими гусями фальшивых антиотладочных трюков и в конце концов просто терпит крах.
  • Таблица вызовов указывает на настоящие процедуры расшифровки, которые расшифровывают реальный участок программного кода.
  • Вызываются процедуры расшифровки, и они расшифровывают, используя базовый зацикленный xor (C^k^n, где C - шифротекст, k - 32-битный ключ и n - текущее смещение данных)
  • VirtualProtect используется для переключения флагов защиты секции с RW на RX.
  • Поток управления перенаправляется на OEP, программа выполняется.

Идея в том, что поскольку они думают, что находятся в нормальном потоке программы, это заставляет их пропустить вызов антиотладки и последующие проверки. В любом случае, все работает нормально.

ПРОБЛЕМА:

Текущая проблема заключается в том, что OllyDbg и несколько других инструментов смотрят на упакованную секцию и видят, что она имеет высокую энтропию, и выдают предупреждение, что она упакована. Указатель секции кода в заголовке PE установлен правильно, так что это не связано с наличием внешнего кода EP - это чисто энтропийный анализ.

ВОПРОС:

Есть ли метод шифрования, который я могу использовать, сохраняя низкую энтропию, но при этом легко реализуемый в x86 asm? Я не хочу использовать простой xor, так как это слишком просто, но я также не хочу, чтобы он поймал его как упакованный и выдал игру.

Я думал о чем-то вроде шаффлера (как-то создавать поток ключей и использовать его для обмена 4-байтовыми блоками кода), но я не уверен, что это сработает или даже будет просто.

У кого-нибудь есть идеи?

5
задан Polynomial 29 October 2011 в 09:06
поделиться