скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Исследование Offline Explorer 2.2.807



Автор: Wersion (Abetkin Veaceslav)

Не ошибитесь версией!

Tools:

  • TRW 2000/Softice-сами думайте как делать в нём то же самое;
  • RESHACKER/ЛЮБОЙ РЕДАКТОР РЕСУРСОВ;
  • WIN32 DASM;
  • PROCDUMP 32;
  • HIEW 6.55/any other Hex Editor;
  • Extreme Loader Generator v0.3/что-нибудь подобное;
  • Import Reconstructor/Revirgin/руки и голова;

Если вы желаете только получить взломанную версию программы – вон отсюда(крестик в правом верхнем углу экрана, 1 раз щёлкнуть левой кнопкой мыши); Всё написанное предназначено только для образовательных целей. Написанное потому, что на пиратских сайтах давным-давно есть крэки к этой замечательной программе L, потому, что это 10-я взломанная мной программа.

Ну что, начнём. Запускаем oesetup.exe, создает ярлык на Desktop’е. Щёлкаем, смотрим. Какая большая, красивая программа. Есть Nag, 30-day limitation, ограничений функциональности не заметил.

Смотрим размер файла – маловат, 831 kb. Кажется, запаковали. Суём в Reshacker\Restorator – всё corrupted. Точно.сжато. Лезем в ProcDump, выбираем PE editor->наш файл.

Имена секций не снесли, значит, скорее всего, только запаковали. Смотрим дальше. Привлекла меня секция .daat. Не видел, чтобы при компиляции делали такие секции. Это секция распаковщика. Ставим ей E0000020 в Section Characteristics. (Мера, в основном, для Softice’a), почему – читай формат PE, таблицу Dr.Golova. Запускаем TRW 2000, Load->цель. И F5/X-выход в Windows. Зачем трассировать весь распаковщик?

Итак, программа запущена, перед нами Nag. Мне понравилось слово ‘evaluation’ на нём. Поищем его в памяти. Ctrl-n/m, активизируем TRW 2000. Команда s 30:0 ffffffff ‘evaluation’. Нам говорят:


59412d in OE!CODE+19312D. F5/X . Закрываем OE.exe; снова Load->цель.

Cтавим брейкпоинт на этот адрес в памяти:


bpm 59412d w .

Нажимаем F5/X. вываливаемся в TRW 2000 на инструкции


REP MOVSD
{****}
REP MOVSB
POP ESI
{****}
CALL XXXXXXXX
{*********}
JNZ XXXXXXXX

пройдите их всех по F10 до JNZ т.к. ХХХХХХХХ, на который он собирается прыгнуть меньше того, на котором мы стоим, то мы его обойдём.

Ставим брейкпоинт на следующую за ним строчку(F9); Затем F5; F9(снять брейкпоинт) и продолжаем трассировку. Аналогично обходим все подобные JZ/JNZ/JMP. Когда увидите инструкцию POPA, встанете на RET, нажмите F10 последний раз. Всё! Распаковка закончилась! Мы в программе, в секции CODE.

Запишем EIP на бумагу. Введём команду suspend. Ничего не закрываем и запускаем Procdump.

В Options оставляем только Recompute Object Size и Use actual import infos. Сделаем Dump(Full) нашего процесса.

Убьём его. Выйдем из Trw 2000. Опять в ProcDump->PE editor->Our_dump.exe

Нужно выставить ему правильную Entry Point. Она равняется EIP-Image Base. И то и другое нам известно. Для меня EIP=005F0E7, Image Base=0400000. Посчитайте в Калькуляторе от Microsoft(Hex mode). (У меня получилось 001F0E7C). Теперь поставьте всем секциям E0000020. //дамп уже запускается и распакован!

Дальше нужно восстановить таблицу импортов (хотя можно ломать и так). Можно использовать Import Reconstructor/Revirgin/руки и голову;

Я выбрал 3-е, а потом 1-е. И так и этак получается замечательно.

Через 1-е: смотрим RVA и *Size секции .idata пишем в IAT Infos. Жмём Get imports и Fix Dump. (прислушаемся к сообщению и исправим Procdump->Directory->Import Table на соответствующие параметры новой секции); Через 3-е: //долго рассказывать

Теперь самое главное. Суём всё это в Win32 Dasm. И пока он работает, запускаем Oe.exe и смотрим раздел, посвящённый регистрации. На неправильный код программа отвечает сообщением ‘Sorry…’. Вот мы и поищем его в дизассемблированном файле. (Search->Find Text); Со 2-го раза нашли:


* Referenced by a (U)nconditional or (C)onditional Jump at Address: // Вот
откуда мы прыгаем на эту гадость!

|:005997BB(C)
{Много пропущено}
|
* Possible StringData Ref from Code Obj ->"Sorry, registration information "
->"is invalid."
|
:00599878 BAE8985900 mov edx, 005998E8
:0059987D A108BD5F00 mov eax, dword ptr [005FBD08]
:00599882 8B00 mov eax, dword ptr [eax]
:00599884 E8F3E0EBFF call 0045797C

Идём на 005997BB:


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0059969E(C) // а это в свою очередь отсюда;
|
:005997B2 8B07 mov eax, dword ptr [edi]
:005997B4 80B86407000000 cmp byte ptr [eax+00000764], 00
:005997BB 7420 je 005997DD

Идём на 0059969E:


:00599697 E848FC0300 call 005D92E4 {проверяем РН}
:0059969C 84C0 test al, al {если неверен то в al должно быть 0}
:0059969E 0F840E010000 je 005997B2{если al=0 то прыгаем на сообщение о
неверности РН}

Ну что, зайдём в этот call 005D92E4 : Вот что он делает:


* Referenced by a CALL at Addresses:

|:00599697 , :005DF5CE {Оказывается, не только из 00599697 вызывается}
|
:005D92E4 8BC2 mov eax, edx {Здесь с al ничего не делают}
:005D92E6 8BD1 mov edx, ecx {и здесь тоже}
:005D92E8 E86BF6FFFF call 005D8958{а этот должен работать с Al}
:005D92ED C3 ret {выход из процедуры/функции}

Видно, что процедура проверки вызывается несколько раз. Программа, вероятно, использует её при старте, чтобы определить, показывать Nag или нет. Нужно сделать так, чтобы после выполнения нашего call 005D92E4 в AL было 1. С этим с успехом справится команда mov AL,1. Её можно записать вместо call 005D8958 по адресу 005D92E8.

Воспользуемся Hiew 6.55. Откроем файл, F5, .005D92E8,,F3,F2. Пишем. Т.К. в Hex’е наша инструкция-B001, call 005D8958- E86BF6FFFF то оставшиеся байты (после B001 и до C3) надо забить Nop’ами(90). Сохраняем (F9), выходим (F10).

Запускаем. Ура! Ни Nag’a, ни надписи NOT REGISTERED в About. Никаких ограничений!

Хотя мы не имеем прав распространять взломанную программу, этикет требует сделать для неё что-то типа патча. Чем и займёмся. Конечно, всё это можно сунуть в архив, добавить *.nfo и показывать как своё геройство.

(Так сделал TSRH; кстати, как ему не стыдно распространять Cracked Exe и гадить производителям?). Но! Мы сделаем вещь поменьше и покрасивее и не будем никому давать.

Изучив работу распаковщика, я понял, что это что-то многослойное, похожее на AsPack. Патчить его трудновато. Создадим загрузчик. Я пытался использовать R!SC Process Patcher, но он почему-то не работал, или заменял байты рано/поздно. Аналогично Patch Creation Wizard->Memory Patch. Взял PELG(Extreme Loader Generator). Тоже не работает.

Что ж, опять в отладчик->Load->PackedOe.exe bpx 005D92E4 //Адрес, который вызывал наш call <проверка РН>. F5/X.

Появляется Splash, чуть–чуть висит, а затем мы вываливаемся в TRW 2000. Понятно. Проверка рановато происходит, ещё при Splash’е.

Значит, при его создании и надо заменить байты. Только хорошо бы отловить этот момент.

В PELG’е есть Method of detection [Standard, Window Title, Class Name]. Standard, как я говорил, не работает, Window Title у Splash’а не наблюдается, остаётся Class Name. А его где взять? Splash показался, исчез и в списке не значится. Притормозим программу.

Отладчик->Load->PackedOe.exe


bpx 005D92E4 //Адрес, который вызывал наш call <проверка РН>.
F5/X.
suspend

В PELG’е->Refresh.
Вот он, TdlgSplash !!! Выбираем его.
Ctrl-n, отпускаем жертву;
PELG->Add (RVA, New bytes);
RVA=5D92E8 (см. выше).
New bytes=B001 + Nop’ы=B001909090 (см. выше).
PELG->Program Info->FileName=Oe.exe
PELG->Cracker Name=wersion
PELG->Create Loader;

Сделано!

Комментарии:


s 30:0 ffffff ‘string’
s=search;
30:0 ffffffff=область поиска, здесь – вся память.
‘string’– строка.
bpm xxxxxx = брейкпоинт на область памяти. w/r – запись/чтение.
bpx xxxxxx = брейкпоинт на адрес в программе.
suspend – зациклить процесс.

Greats to: Dr. Golova, Predator, G-Rom, Lorian&Stone, Sen, MackT/ uCF2000 and many others!

Пишите, если что-то непонятно и только по серьёзным вопросам.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook