Общие аспекты паковки/распаковки программ

Перейти на главную страницу, индексную страницу.


Прелюдия .....

Сейчас появилось огромное количество статей по анпаку. Я попытался дать общее представление об этом процессе. Статья теоритическая.

Назначение

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

Во-первых, запакованный файл в большинстве случаев нельзя дизассемблировать, так как в теле файла присутствуют секции с запакованными данными , а собсственно код распаковщика многие дизассемблеры не в состоянии принять за что-то значимое. [Примером такого инструмента является win32dasm, и в некоторых случаях IDA]. Вследствие этого затрудняется нахождение нужного джампа , etc ....

Во-вторых, пакованные программы труднее патчить, чем незапакованные. Так как в некоторых паковщиках присутствует проверки на валидность длины, контрольной суммы файла, тд .... Но все же возможность патча файла, с дальнейшей его работоспособностью, возможна . Тонкости - ниже ...

В-третьих, программисты начали добавлять функции определения как конкретного отладчика, так и функции определения самого факта отладки, а также определение мониторинга реестра, обращений к файлам [файловые мониторы и мониторы реестра такие, как FileMon, RegMon ].

Принцип работы паковщиков

Общий принцип работы и3ложен в таблице ....

      ___________________________________________
     I                                           		           I
     I  Начало выполнения кода упаковщика [EP]*      I
     I___________________________________________I_
       I                                                                     I--_
       I    Вы3ов[a] ф-ций 3ащиты от отладки ,              I   |
       I     проверка контрольной суммы , etc                I   \
       I            ["код протекции"]                                I    > Непосредственное выполнение кода ,
       I___________________________________________I    > который "cуществует" в файле ..
       I                                                                     I    |
       I    Распаковка кода программы в память             I  _/
      _I___________________________________________I--
     I                                                                     I--_
     I      Прыжок на распакованный в памяти               I   \ Начало выполнение распакованного кода ,
     I           код программы [OEP]**                           I  _/ те непосредственно кода программы
     I___________________________________________I--

Некоторые паковщики выполняют "код протекции" после распаковки, а некоторые вообще не предоставляют данной возможности.

Ручной или автоматический анпак ? Патчим пакованную прогу

Cуществует множество как паковщиков, так и распаковщиков. Но не к каждому представителю первого типа можно найти программу - анпакер [или скрипт для ProcDumpa]. Поэтому многие исследователи используют так называемую "ручную" распаковку. Суть этого действа такова ....

0) Меняем 3начение свойства секций на E0000020, загружаем прогу при помощи S-I loader'a.

1) Трассируем программу [этот процесс 3анимает довольно много времени, если правильно не пользоваться    брейкпоинтами и не пропускать длительные циклы]

2) В результате трассировки мы найдем OEP .

3) Теперь мы зацикливаем программу.

[В сайсе это будет выглядеть следующим образом: дойдя, но не выполняя прыжок на OEP, набираем a eip;начинаем изменение кода в памяти с позиции eip, те со следующей инструкции jmp eip; делаем бесконечный цикл ; конец изменения кода]

4) ProcDump'om или любым другим дампером делаем дамп нашей 3адачи[подопытная программа] + сохраняем его на диск .

5) Теперь тем же ProcDump'om надо исправить EP в нашем дампе. Значение надо Заменять на следующее :
Значение = OEP - Image Base.

Все теперь наша программа распакована - мы можем продолжать исследование.
3десь не описана процедура восстановления импорта, так для каждого пакера она разная. Теперь рассмотрим ситуацию, когда мы знаем байты для патча, и нам надо произвести их замену.
Делать мы это будем так :
  • Находим OEP См. выше .
  • 3аменяем прыжок на OEP прыжком на наш участок кода , который мы вписываем в свободное место на диске в файле любым hex-редактором .
  • Выполнение наших инструкций . Те перезапись байтов [опкодов] в оперативной памяти .
  • Последней командой нашего блока должна быть команда jmp
Патч готов ! Для новичков в области распаковки/патча это может показаться немного сложным, но по сути это довольно легко, главное - упорство -] .


Начало распаковщика часто собровождается коммандой "pusha" , конец - "popa" , прыжок на OEP -
   jmp 
   или
   mov eax,[OEP]
   ret
*EP [entry point] - начало выполнение кода программы
**OEP[original entry point] - термин , придуманный специально для пакованных прог , адрес , с которого начинается выполнение распакованного в памяти кода собственно проги[не распаковщика!]
ProcDump - 3aмечательная утилита [сочетает в себе ф-ции PE-editora,анпакера и некоторых других]

Если вам что-то непонятно или у вас возникли денежные предложения - пишите by Dr_Net //TSRh //UOFG mail : dr_net@uofg.cc

Перепечатано с разрешения www.uofg.com.ua



Материалы находятся на сайте http://cracklab.narod.ru/doc/






Hosted by uCoz