On Mon, 16 Oct 2006 15:52:31 +0300, Alexey Popov wrote:

   1. Нужно прорваться через загрузчик.

А зачем? Аттачимся с процессу уже в работе. Вариант
с драйверами пока не рассмативаем.

  Даже если вариант с драйвером не рассматривать.
  Аттач к процессу во время работы даст еще меньше, так как
  нужные куски создания кода VM будут уже зашифрованы, а
  прорываться через полученные в результате мутирующие VM еще
  сложнее.

   2. Определить, где же находиться код DLL. Поиск по сигнатурам скорее
всего ничего не даст...

Поиск по сигнатурам - это только один из методов.  Не верю что он
может не работать. Например, dll всегда использует какие до константные
данные, строки и прочее.

  Тот же поиск, но по сигнатурам данных.
  Данные лежат в сегменте данных...
  Протектор мало того, что приводит их в нечитабельный вид,
  так его загрузчик еще и размазывает все это добро по памяти.
  В результате возвращаемся к п.1

Проблема в том, что код не просто замусоривается, но еще и крадется...

Красть байты реально очень трудно ибо надо быть уверенным
что прога будет работать корректно. Обычно из ОЕП крадут.
В других случаях надо мощно анализировать код, чтобы быть
уверенным что прога не слетит.

  Реально они крадутся. Например в исходном было так:
  FF1518D35500 call DWORD PTR DS:[EDI] ; kernel32.getstdhandle
  83C8FF       or  EAX, FFFFFFFF
  E95C0F0000   jmp 00F905000
  83C0F5       add EAX, F0

  в расшифрованном дампе:
E8F346D000 call 00568451 ; А это вызов kernel32.getstdhandle посредством VM
  10A574DF0D11 adc BYTE PRT SS:[EBP+74DF0D11]
  33EF         xor EBP,EDI
  CC           int 3
  83C0F5       add EDX, F0

  Как видишь, байт-длинна команд совпадает.
  Но реально командны другие...
  А все потому, что or EAX, FFFFFFFF и JMP
  протектор выполнил где-то в недрах функции 00568451. А недра у
  нее мутируют. К тому же RET из нее вышел на десяток байт позже.

Причём без потерь в производительности.
Такое конечно возможно в принципе, но для
этого минимум нужна перелинковка всего приложения.
Ну и в крайнем случае степень полиморфизма
замусоривания крайне низкая.
     Вот эту мысль я не понял вообще...

Мысль в том, что без цепочки:
декомпиция->защита->компиляция->линковка
замылить код большой и жирной функции нереально.

  Вполне реально. Взлом на оборот...
  Особенно если протектор заточен под определенный компилятор :-)
  А они заточены :-)

   Хм. А как еще можно исследовать защиту? Сразу на реальном
   приложении - так это сильно много времени уйдет...

Метод взлома использует не снятие защиты а уязвимые места
конкретного хорошо известного приложения.

  Попасть в эти уязвимые места трудно. Проще снять защиту.

--
WBR, Jerry

Ответить