Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь


Распаковка ExeCryptor 2.3.9 (на примере PrevedSMS 5.1), часть 1




Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Распаковка ExeCryptor 2.3.9


Программа

PrevedSMS v5.1

Download

http://www.nsoft-s.com/

Описание

Программа для отправки SMS на мобильные телефоны, пейджеры и телефоны спутниковой связи через Internet.

Инструменты

OllyDbg 1.10 (доработанный для работы с ExeCryptor), plugin PhantOm v1.15, plugin Hide Debugger v1.2.4, plugin HideOD v0.16, plugin IsDebuggerPresent v1.4, plugin OdbgScript v1.65.1, HideToolz v2.1, PEiD v0.94, PE Tools v1.8.800.2006 RC7, Hex Workshop v4.23, Import REConstructor v1.6 F

Сложность

Для опытных crackers

Пакер/Компилятор

Распаковка ExeCryptor v2.2-2.3

Защита

Распаковка ExeCryptor v2.2-2.3

Цель

Распаковка

Cracker

vnekrilov

Туториал №




0. ВВЕДЕНИЕ


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


Абсолютно недавно появилась хорошая статья EvOlUtIoN, в которой прекрасно описан процесс поиска OEP, получение дампа памяти программы, и доработка полученного дампа, с целью обеспечения его работы на разных машинах. Автор этой статьи довольно хорошо проанализировал Entry Point программ, скомпилированных разными компиляторами, и предложил выполнять дампирование памяти программы, находясь недалеко от OEP. Он также предложил загрузчики, которые можно использовать для остановки программы недалеко от OEP, и которые устраняют анти-отладочные ловушки ExeCryptor. Однако предложенный им механизм доработки полученного дампа, с целью обеспечения его запуска на разных машинах, по моему мнению, является громоздким, поскольку он требует или наличие второго компьютера, на котором установлена другая операционная система, или использование Виртуальной машины, опять же с установленной другой операционной системой.


Причиной такой громоздкости, по моему мнению, является то, что EvOlUtIoN не проанализировал процесс получения ExeCryptor реальных адресов API. Это не позволило ему найти другой путь решения проблемы по обеспечению работы полученного дампа на разных машинах.


В данном туториале я постараюсь предложить второй, и более простой путь решения данной задачи. В качестве подопытного “кролика” я решил использовать программу PrevedSMS v5.1 (по предложению dgv_7), который и предложил написать мне туториал по распаковке последних версий ExeCryptor.


Как всегда, перед началом работы, анализируем программу в Peid, применив для этого опцию Deep Scan:


Распаковка ExeCryptor 2.3.9: статья 1


Программа упакована ExeCryptor 2.2.4.


А теперь посмотрим на эту программу в DiE v0.64:


Распаковка ExeCryptor 2.3.9: статья 1


Здесь мы видим, что программа скомпилирована на Borland Delphi, и упакована ExeCryptor v2.2.4 Strongbit/SoftComplete Development.


И, наконец, посмотрим на эту программу в RDG Packer Detector v0.65:




Распаковка ExeCryptor 2.3.9: статья 1


Этот анализатор более точно указывает компилятор программы - Borland Delphi v6.0 - v7.0. и версию ExeCryptor v2.2.x - v2.3.x.


1. Поиск OEP программы



Перед поиском OEP программы, нам надо определиться с анти-отладочными ловушками ExeCryptor, поскольку программа должна нормально запускаться в отладчике OllyDbg. В последнее время, для борьбы с анти-отладкой я использую всего два plugin: OllyAdvanced v1.26 beta 12, и PhantOm v1.15, разработанный нашими cracker’s Hellsp@wn&Archer. Хотя последний plugin прекрасно справляется со многими анти-отладочными ловушками, plugin OllyAdvanced v1.26 beta 12 имеет ряд опций (например, Break on TLS Callback), которых пока нет у второго plugin, и которые нужны при распаковке разных пакеров.


Запускаем отладчик OllyDbg, загружаем в него программу, нажимаем клавишу F9 (запуск программы), и видим:


Распаковка ExeCryptor 2.3.9: статья 1


Значит, сработала анти-отладочная ловушка, и программа закрылась.


Многие авторы по распаковке программ, в таких случаях рекомендуют изменить настройки отладчика OllyDbg, и выполнить остановку программы на SYSTEM BREAKPOINT:


Распаковка ExeCryptor 2.3.9: статья 1


Запускаем программу в отладчике, и она останавливается после срабатывания System breakpoint здесь:


Распаковка ExeCryptor 2.3.9: статья 1


Это нам пока ничего не дает. Давайте посмотрим на наш файл в PE Editor, для чего будем использовать программу PE Tools v1.8.800.2006 RC7. Открываем файл в PE Editor, переходим на вкладку Directory Editor, нажимаем кнопку ‘…’ возле параметра TLS Directory, и видим следующее:


Распаковка ExeCryptor 2.3.9: статья 1


Дело заключается в том, что ExeCryptor, перед тем, как пройти на EP, выполняет код, с помощью которого он устанавливает ловушку, и не позволяет запустить программу в отладчике. Давайте в окне dump отладчика перейдем на Address of callback (00B8113C):


Распаковка ExeCryptor 2.3.9: статья 1


Здесь мы видим адрес 00DDC9CD, с которого начинает свою работу пакер ExeCryptor:


Распаковка ExeCryptor 2.3.9: статья 1


Устанавливаем на этот адрес BPM on Access, и нажимаем клавишу F9 (Run). Через пару секунд мы останавливаемся на BPM:


Распаковка ExeCryptor 2.3.9: статья 1


Распаковка ExeCryptor 2.3.9: статья 1


А строка состояния отладчика сообщает нам, что программа остановлена на TLS Callback. Однако, при нажатии на клавишу F9, программа закрывается. Почему? Если мы перейдем на вкладку BreakPoint, нажав кнопку ‘B’, то увидим следующее:


Распаковка ExeCryptor 2.3.9: статья 1


Откуда здесь взялась BreakPoint?. Дело в том, что отладчик, чтобы остановить программу на Entry Point, устанавливает свою временную BreakPoint на адресе, который он читает в PE-заголовке:


Распаковка ExeCryptor 2.3.9: статья 1


009DC9C1 + 00400000 (ImageBase) = 00DDC9C1



Именно на этот адрес OllyDbg установил временную (one-shot) BreakPoint. А, как мы знаем, при установке BreakPoint, отладчик заменяет первый байт E8, который находится по этому адресу, байтом CC, который является инструкцией прерывания int 3. Естественно, что при этом меняется CRC этой области кода, и пакер закрывает программу, не доходя до Entry Point программы. Давайте уберем эту BreakPoint, после чего нажимаем клавишу F9, но программа не запускается; она просто зависает. Если мы посмотрим на вкладку “Thread” отладчика, то там видим следующее:


Распаковка ExeCryptor 2.3.9: статья 1


Помимо основного потока 00000430, ExeCryptor создает еще целый ряд потоков защиты, которые не позволяют нам запустить программу.


Для дальнейшей работы, нам необходимо запустить программу в отладчике. Если мы этого не сделаем, то не сможем пройти на OEP, восстановить таблицу IAT, и сделать дамп памяти программы. На форуме CRACKL@B PE_Kill написал о том, что ExeCryptor, начиная с версии 2.3.9, использует ошибку в отладчике OllyDbg, в результате чего, программа не запускается под отладчиком. Он также написал, что эта ошибка устраняется правкой одного байта, но, к сожалению, не сообщил, по какому адресу в отладчике нужно откорректировать этот байт. Применение plugin Phantom v1.15 тоже не помогает, поскольку пакер обнаруживает отладчик:


Распаковка ExeCryptor 2.3.9: статья 1


На форуме CRACKL@B bronco предложил использовать отладчик OllyDbg, специально доработанный для работы с программами, упакованными ExeCryptor. Этот отладчик можно скачать с сайта http://team-x.ru/guru-exe/Tools/Debuggers/OllyDbg/OllyDbg%20v1.10%20Bronco.rar . Этот отладчик также содержит все настроенные plugins, необходимые для работы с программами, упакованными пакером ExeCryptor.


Для запуска программы в отладчике, он предлагает применить следующие настройки plugins:


Hide Debugger:



Распаковка ExeCryptor 2.3.9: статья 1


HideOD:


Распаковка ExeCryptor 2.3.9: статья 1


IsDebuggerPresent:




Распаковка ExeCryptor 2.3.9: статья 1


PhantOm:


Распаковка ExeCryptor 2.3.9: статья 1


OllyAdvanced:





Распаковка ExeCryptor 2.3.9: статья 1

Распаковка ExeCryptor 2.3.9: статья 1




Распаковка ExeCryptor 2.3.9: статья 1

Распаковка ExeCryptor 2.3.9: статья 1




Распаковка ExeCryptor 2.3.9: статья 1


После настройки plugin, скрываем отладчик с помощью утилите Hide Toolz:


Распаковка ExeCryptor 2.3.9: статья 1


Загружаем программу в отладчик, и нажимаем клавишу F9, для ее запуска. Программа останавливается на TLS Callback. Переходим на адрес Entry Point программы - 00DDC9C1, на котором устанавливаем Hardware BreakPoint on execute, и удаляем One-shot BreakPoint с адреса 00DDC9C1:



Распаковка ExeCryptor 2.3.9: статья 1



Для создания потока защиты, ExeCryptor использует API CreateThread, и, для проверки активности созданного потока защиты, он также использует вторую API WaitForSingleObject. Эти API работают в паре. Сначала API CreateThread создает поток защиты, а затем вторая API WaitForSingleObject проверяет, не подавили ли мы поток защиты, созданный первой API. Давайте посмотрим, как работают эти API в нашей программе, и попытаемся все-таки запустить программу в отладчике.




Перезагружаем программу в отладчике, и программа останавливается на Системной BreakPoint. Нажимаем клавишу F9, и останавливаемся на TLS Callback. Теперь нам надо пройти на Entry Point отладчика, для чего, удаляем One-shot BreakPoint с адреса 00DDC9C1, и устанавливаем на этом адресе Hardware BreakPoint on execute:


Распаковка ExeCryptor 2.3.9: статья 1


Нажимаем клавишу F9, и программа останавливается на Entry Point отладчика:


Распаковка ExeCryptor 2.3.9: статья 1


Распаковка ExeCryptor 2.3.9: статья 1


Зачем нам нужно остановиться на Entry Point пакера? Дело заключается в том, что, при проходе на Entry Point, пакер генерирует создание двух потоков защиты, которые нам нужно подавить. Иначе, мы не сможем запустить программу в отладчике:


Распаковка ExeCryptor 2.3.9: статья 1


Удаляем установленную Hardware BreakPoint on execute (хотя ее можно и не удалять, поскольку ExeCryptor не детектирует установку Hardware BreakPoint на свой код), и нажимаем клавишу F9. Пакер генерирует огромное множество исключений и потоков защиты, и, наконец, появляется заставка с предложением зарегистрировать программу:


Распаковка ExeCryptor 2.3.9: статья 1


Теперь нам надо найти OEP.


EvOlUtIoN, в своей работе по ручной распаковке ExeCryptor, привел стандартные Entry Point для программ, скомпилированных разными компиляторами. Он предлагает делать дамп памяти программ, остановленных не на самой OEP, а на коде, который находится недалеко от OEP, поскольку ExeCryptor виртуализирует код в области Entry Point программы. Им даны прекрасные рекомендации, какие использовать процедуры для остановки программ, скомпилированных разными компиляторами, а также приведен стандартный код этих процедур. Можно сказать, что EvOlUtIoN проделал прекрасную работу, и стандартный код Entry Point разных программ должен находиться на рабочем столе каждого cracker’s, который занимается распаковкой программ. Рекомендации EvOlUtIoN помогут быстро найти OEP не только в программах, упакованных ExeCryptor, но и в программах, упакованными другими пакерами, использующими виртуальные машины для эмуляции кода OEP.


Поэтому, для поиска OEP, мы воспользуемся рекомендациями EvOlUtIoN.


Запускаем, без отладчика, подопытную программу PrevedSMS v5.1. Запускаем PE Tools v1.5 RC7, и настраиваем в нем опции раздела Task Viewer вкладки Preferences, установив флажки, как показано на рисунке:


Распаковка ExeCryptor 2.3.9: статья 1


Теперь выбираем наш процесс в окне задач, щелкаем по нему правой кнопкой мыши, и выбираем команду Dump Full…:


Распаковка ExeCryptor 2.3.9: статья 1


Сохраняем полученный дамп памяти программы с именем, предложенным утилитой PE Tools v1.5 RC7 - Dumped.exe.



Закрываем программу и утилиту PE Tools v1.5 RC7, и открываем полученный дамп в отладчике OllyDbg:


Распаковка ExeCryptor 2.3.9: статья 1


Ранее, с помощью анализатора файлов RDG Packer Detector v0.65, мы определили, что программа скомпилирована компилятором Delphi v6.0 - v7.0. Давайте, в статье EvOlUtIoN, посмотрим код Entry Point для программ, скомпилированных этим компилятором. Для всех программ Delphi имеется одна и та же стандартная OEP:


  PUSH 	EBP	← OEP  
  MOV 	EBP,ESP
  ADD 	ESP,-10
  MOV 	EAX,address	← Это - первая инструкция при запуске программы.   
  CALL 	Sysinit::initexe Procedure ← Это - первая процедура ЛЮБОЙ программы Delphi  
  MOV 	EAX,DWORD PTR DS:[dword]
  MOV 	EAX,DWORD PTR DS:[EAX]  
  CALL 	procedure1
  MOV 	ECX,DWORD PTR DS:[dword]  
  MOV 	EAX,DWORD PTR DS:[dword]  
  MOV 	EAX,DWORD PTR DS:[EAX]  
  MOV 	EDX,DWORD PTR DS:[dword]  
  CALL 	procedure2
  MOV 	EAX,DWORD PTR DS:[dword]  
  MOV 	EAX,DWORD PTR DS:[EAX]  
  CALL 	procedure3  
  CALL 	procedure4
  


Процедура CALL Sysinit::initexe для программ Delphi v6.0 - v7.0 выглядит следующим образом:


  PUSH 	EBX
  MOV 	EBX,EAX  
  XOR 	EAX,EAX
  MOV 	DWORD PTR DS:[dword1],EAX  
  PUSH 	0
  CALL 	GetModuleHandleA ← Этот CALL GetModuleHandleA - очень важен
  MOV 	DWORD PTR DS:[dword2],EAX  
  MOV 	EAX,DWORD PTR DS:[dword3]  
  MOV 	DWORD PTR DS:[dword4],EAX  
  XOR 	EAX,EAX
  MOV 	DWORD PTR DS:[dword5],EAX  
  XOR 	EAX,EAX
  MOV 	DWORD PTR DS:[dword6],EAX
  CALL 	procedure1
  MOV 	EDX,dword7
  MOV 	EAX,EBX
  CALL 	procedure2
  POP 	EBX
  RETN
  


Поэтому, нам надо, в нашем дампе, найти код процедуры CALL Sysinit::initexe. Поиск этой процедуры мы будем делать по вызову API GetModuleHandleA. Переходим в секцию кода нашего дампа, нажав клавиши Ctrl+G, и вводим в появившееся диалоговое окно начало секции кода 00401000. Сначала нам нужно выполнить анализ кода, для чего нажимаем клавиши Ctrl+A. После завершения анализа, щелкаем правой кнопкой мыши, и выбираем команду поиска всех вызовов внутри модуля:


Распаковка ExeCryptor 2.3.9: статья 1


В появившемся окне ссылок выбираем сортировку команд по назначению:


Распаковка ExeCryptor 2.3.9: статья 1


И ищем инструкции вызова API GetModuleHandleA:



Распаковка ExeCryptor 2.3.9: статья 1


Мы видим 12 вызовов API GetModuleHandleA. В процедуру CALL Sysinit::initexe может входить или CALL 0040744C, или CALL 00407938. Проверяем код подпрограмм, где находятся эти инструкции CALL, и на первой подпрограмме мы видим следующий код:


Распаковка ExeCryptor 2.3.9: статья 1


Этот код аналогичен коду, который привел в своей статье EvOlUtIoN. Итак, теперь мы знаем, что процедура Sysinit::initexe находится по адресу 00407510. В оригинальной упакованной программе нам надо пройти на этот адрес, восстановить таблицу IAT, и можно дампировать память программы. Не правда ли, что такой подход значительно упрощает поиск OEP?


Закрываем дамп в отладчике, и удаляем его. Он нам больше не понадобится.


И, теперь, опять открываем упакованную программу в отладчике. Проходим на Entry Point пакера, как это делали мы выше. Когда программа остановлена на Entry Point пакера, секция кода уже распакована, поэтому мы проходим на адрес 00407510, и устанавливаем на нем Hardware BreakPoint on execute:


Распаковка ExeCryptor 2.3.9: статья 1


Нажимаем клавишу F9, для запуска программы, и, программа сначала показывает заставку, а когда мы нажимаем кнопку “Evaluate”, программа останавливается на Hardware BreakPoint on execute:


Распаковка ExeCryptor 2.3.9: статья 1


Давайте этот адрес мы назовем Works OEP (WOEP) - рабочей OEP, поскольку в этой точен мы сможем восстановить таблицу IAT, и выполнить дамп памяти программы.


Давайте запишем в данной точке два значения, которые нам понадобятся при восстановлении Entry Point программы - регистра EAX и адреса возврата из данного CALL:


Распаковка ExeCryptor 2.3.9: статья 1


Значение регистра EAX = 006161AC.


Распаковка ExeCryptor 2.3.9: статья 1


Адрес возврата из данной подпрограммы - 006168D9.


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


На этом мы закончили рассмотрение первой части туториала по распаковке программы, запакованной ExeCryptor. Во 2-й части мы рассмотрим восстановление таблицы IAT, и получение рабочего дампа памяти программы


До встречи во 2-й части туториала.


vnekrilov



Скачать статью "Распаковка ExeCryptor 2.3.9 (на примере PrevedSMS 5.1), часть 1" в авторском оформление + файлы.
пароль архива на картинке



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS