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

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


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

Безжалостное убийство nag'ов на примере CloneCD 5.0.4.5. rus

Обсудить статью на форуме

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: ARCHANGEL <crazyangel88@mail.ru>


Предисловие


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

Mov EAX, 1
Retn

Во-вторых, эта софтина наглядно демонстрирует, какой угрозой может стать модальное окно
в исполнении компилятора фирмы Borland. Также это - наглядный пример того, что иногда даже
крутые декомпиляторы типа DeDe не в состоянии нам помочь. Ну, и в конце концов, это просто
полезная утилита. Ну как, я вас заинтриговал? :) Тогда берем в руки большую ножовку
(крэкерята - вам можно ту рядом, что поменьше :) и приступаем. И помните: с дядюшкой
ARCHANGEL'ом мы "рассматриваем" только популярные программные продукты, как говориться,
никаких crackme'cов:)


Начало


Однажды тёплым летним утром я отправился на рынок купить пару переводчиков - задание дали
в институте по теме "Особенности компьютерного перевода", а у меня хоть бы какой - нет ни
одного переводчика. После получаса недолгих выбираний я приобрёл диск с вожделенными
для меня софтинами, а на нём - ещё около 40 других программок. Назывался он "Домашняя
коллекция 2". Был там и мой любимый CloneCD. Вы спросите: "Почему любимый?". Сейчас у всех
в фаворе Alcohol 120%, и это действительно нечто, но однажды мне нужно было сделать копию
своего диска Windows XP Home Edition sp1, Alcohol сделать-то сделал, да только потом эта
копия при запуске сказала что-то типа:


This software could not be loaded from Image Drive


Вы только не подумайте, что я Винду с виртуалки запускал, нет, нормально переписал на CD-R,
а эта надпись обломала весь кайф:(. А вот CloneCD справилась нормально. Да что-то я
отвлёкся. Так вот, установил я эту свежую версию (у меня до этого 4.х.х.х стояла, не помню
точно, какая, к ней был ключ). Но к этой версии старый ключ не подходил, я уж было начал
расстраиваться, но тут заметил крэк от какого-то неизвестного крэкера... (пауза для
драмматического эффекта:)


Обзор чужого крэка


Вы только не злитесь на меня, что у меня вступление такое затянувшееся, но крэк - это не
только горы машинных кодов, иногда приятно расслабиться и почитать какую-нибудь историю,
а если вам не очень это приятно или вы спешите, то переходите сразу к пункту "Взлом".
Через две минуты осмотра этого, если "это" можно назвать крэком, то крэка, я так устал
дико ржать, что пошёл показать это чудо реверс-инженерии своему другу. Его это тоже не
оставило равнодушным. Сейчас постараюсь кратко описать тот крэк.
Собственно, это был cracked.exe в самораспаковывающемся Winrar архиве. Сейчас приведу ниже
команды сценария этого архива:


;в комментарии ниже находятся команды SFX-сценария
Path=C:\Program Files\SlySoft\CloneCD\
SavePath
Silent=1
Overwrite=1 


Для тех, кто не знаком с этими командами, кратко поясню значение этого скрипта. Короче,
Мало того, что не зависимо от того, куда я установил прогу, этот крэк будет всегда
распаковываться по этому адресу:

Path=C:\Program Files\SlySoft\CloneCD\

Так это ещё и нельзя изменить. Далее, хоть это и SFX,но его создатель даже не сжимал
содержимое архива, а архивчик сделал, по всей видимости, чтоб нам поиск крэка усложнить.
Позабавило меня и имя архива, внимание... CloneCD_key.exe. Это, надо полагать, внутри
лежит регистрационный ключ? Размером 1.21 Мб? Это что, эмулятор dongle:)?
Но к самому весёлому мы подойдём, когда запустим крэк. Представьте, вы только-только
установили прогу, скопировали крэк и заменили им файл CloneCD.exe. Теперь вы запускаете
крэк и видите вот такое окно:


Программа CloneCD не бесплатна!

Это пробная версия коммерческой программы!
Испытательный период программы истёк.
Подробности см. в документации на программу

Заказ Отмена



Ну, думаю, попался бы мне этот крэкер в тёмном переулке... Тем не менее, как только я
нажал "Отмена", прога, вместо того, чтоб закрыться-зарыться, показала главное окно. И
дальше стала эта прога работать, и всё, вроде бы, было хорошо, пока я не захотел
осуществить операцию записи с диска на диск. Я ввёл все требуемые параметры и нажал кнопку
"Начать", но вместо записи начался показ "многострадального бразильского сериала" под
названием "Программа CloneCD не бесплатна!":). Да-да, это опять вылезло то окно, что не
давало нам покоя вначале. Я снова нажал "Отмена" и оказался...(вы про три буквы подумали?
Нет, я оказался чуть ближе:) - на стартовом главном окне. И так ещё много-много раз.
Тут терпенье моё кончилось, и я взялся за дело сам.

Взлом.

Инструменты, которые нам понадобятся:
1. PEID_093_20050130 - для анализа защиты программы.
2. stripper_v211rc2 - для борьбы с аспром. (я про аспр не говорил? Ещё скажу :)
3. TrashReg 3.6.1.0. - для борьбы с триалом CloneCD.
4. Olly debug v1.10+CommandBar - а куда ж без них?
5. Текстовый редактор, Notepad или Bred - будем писать bat-файл
6. Restorator2004_301129f_en - так, для косметики
7. Winrar 3.51 - создадим нормальный SFX-crack
8. HIEW 7.10 - попатчим на досуге
А начнём мы с того, что натравим PEID на наш девственно-чистый CloneCD.exe. И он нам
покажет вот что:
ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov
Неаккуратненько как-то:) Запускаем stripper и исправляем ситуацию. Теперь наш ехе вырос
более чем в два раза - 1.38 Мб вместо 555 кб, а PEID покажет:
Borland C++ 1999
Ну вот, другое дело. Но тут вот какая история. Дело в том, что я не сразу начал ломать
прогу, я вначале юзал её три дня в неполоманном виде. И если при первом запуске триал
составляет 21 день, то через три дня - 18. Далее я распаковал прогу и так
её и бросил. А когда через неделю вспомнил и запустил распакованный ехе, то триал-период
не изменился - он так и остался равен 18 дням. Это натолкнуло меня на мысль, что счётчик
аспра и триал-счетчик проги - одно и то же. Лишь с той разницей, что даже после распаковки
прога может считывать значение триал-периода из ключа, но вот записать его туда уже не
может. (Подобное явление мне приходилось видеть в проге Easy CD-DA Extractor 7 лишь с той
разницей, что вместо аспра там была арма).
Теперь приостановим поток догадок и подумаем. В принципе, нас это очень даже устраивает,
что после распаковки прога становиться вечным полнофункциональным триалом, но возникает
вопрос - что делать человеку, у которого триал-период уже истёк, ведь у него даже
распакованная софтина не будет работать?
Выход есть, и поможет нам его найти утилита TrashReg 3.6.1.0. Запускаем данную утилиту
и ищем ключ, принадлежащий CloneCD. Я очень легко нашёл три ключа, принадлежащие нашей
подопытной проге. Так как я помнил дату первого запуска CloneCD и знал версию аспра,
то по этим параметрам удалил из реестра все подходящие ключи. Потом запустил CloneCD, а
она сказала, что у меня есть 21 день (снова) на её регистрацию. Далее я в TrashReg нажал
F5, т.е. повторить поиск и заметил новоиспечённые три аспровских ключа. Вот так вот очень
легко мы нашли все триальные ключи:). Вот информация о них. Первый:

 REGEDIT4

; Этот ключ реестра был создан\модифицирован 7 августа 2006 г. 22:15:32
; Описание ключа: ASProtect 1.23+ 

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}]
@=""

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}\Control]
@=""

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}\InprocServer32]
@="C:\\PROGRA~1\\COMMON~1\\PROJEC~1\\PRMT6\\PRMTLIB.OCX"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}\MiscStatus]
@="0"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}\ProgID]
@="PRMTLIB.PromtTemplateListCtrl.2"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}\ToolboxBitmap32]
@="C:\\PROGRA~1\\COMMON~1\\PROJEC~1\\PRMT6\\PRMTLIB.OCX, 3"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}\TypeLib]
@="{8EE90ADC-D96A-880F-B396-B2A88407DDD3}"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}\Version]
@="2.0"

Второй (поменьше будет):

REGEDIT4

; Этот ключ реестра был создан\модифицирован 7 августа 2006 г. 22:15:32
; Описание ключа: Фиктивный ключ TypeLib (ASProtect) 

[HKEY_LOCAL_MACHINE\Software\Classes\TypeLib\{8EE90ADC-D96A-880F-B396-B2A88407DDD3}]
@=""

Третий (общий ключ аспра):

 REGEDIT4

; Этот ключ реестра был создан\модифицирован 7 августа 2006 г. 22:15:32
; Описание ключа: Общий ключ ASProtect 

[HKEY_CURRENT_USER\Software\Asprotect\SpecData]
@="B3DB8F93B3DB8F93"
"B3DB8F93B3DB8F93"=hex:a0,42,ad,50,cc,45,8e,6d,f5,10,6b,1f,ad,7a,af,65,c2,36,\
  68,1b,95,8a,7e,0d,6d,e1,9c,0e,50,f6

А эти ключи я, зная повадки такого хитрого зверя, как аспр, нашёл на следующий день
пользуясь вышеописанным методом (можно и не ждать, а просто подкрутить системные часы и
запустить подопытную прогу) :

REGEDIT4

; Этот ключ реестра был создан\модифицирован 9 августа 2006 г. 13:41:08
; Описание ключа: ASProtect 1.23+ 

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}]
@=""

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}\HTMLControl]
@=""

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}\InprocServer32]
@="D:\\Program Files\\Microsoft Office\\Office10\\HTML\\HTMLMARQ.OCX"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}\MiscStatus]
@="0"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}\ProgID]
@="MARQUEE.MarqueeCtrl.1"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}\ToolboxBitmap32]
@="D:\\PROGRA~1\\MICROS~2\\Office10\\HTML\\HTMLMARQ.OCX, 1"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}\TypeLib]
@="{06807154-EE5E-14AC-B9B5-15D0E10E13C5}"

[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}\Version]
@="1.0"

И этот тоже:

 REGEDIT4

; Этот ключ реестра был создан\модифицирован 9 августа 2006 г. 13:41:08
; Описание ключа: Фиктивный ключ TypeLib (ASProtect) 

[HKEY_LOCAL_MACHINE\Software\Classes\TypeLib\{06807154-EE5E-14AC-B9B5-15D0E10E13C5}]
@=""

Как показывает практика, все ключи должны быть удалены из реестра. Вот для этого
мы и напишем bat-файл. Некоторые спросят, зачем, что мы будем с ним делать? Для тех,
кто ещё не понял моей идеи, популярно обьясняю - мы сделаем cracked.exe, засунем его
в архив, а вместе с ним и bat-файл, и в архиве укажем, что наш bat-файл нужно выполнить
после извлечения файлов из архива.
С этим вопросом разобрались, но есть ещё один - что будет делать наш bat-файл? Понятно,
что удалять ключи из реестра, но как? И что конкретно из реестра он будет удалять? Что
удалять, это ясно - нужно удалить такие подразделы:

 HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF}
 HKEY_LOCAL_MACHINE\Software\Classes\TypeLib\{8EE90ADC-D96A-880F-B396-B2A88407DDD3}
 HKEY_CURRENT_USER\Software\Asprotect\SpecData
 HKEY_LOCAL_MACHINE\Software\Classes\TypeLib\{06807154-EE5E-14AC-B9B5-15D0E10E13C5}
 HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F}

Теперь о том, как это сделать. Я здесь не буду особо разжёвывать, тут, в принципе, всё
должно быть и так ясно, просто приведу листинг нашего файла, назовём его WIZARD.bat.

******Листинг WIZARD.bat******

 Reg Delete HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{3E79E188-C2E4-4720-F392-53B59D10CBBF} /f
 Reg Delete HKEY_LOCAL_MACHINE\Software\Classes\TypeLib\{8EE90ADC-D96A-880F-B396-B2A88407DDD3} /f
 Reg Delete HKEY_CURRENT_USER\Software\Asprotect\SpecData /f
 Reg Delete HKEY_LOCAL_MACHINE\Software\Classes\TypeLib\{06807154-EE5E-14AC-B9B5-15D0E10E13C5} /f
 Reg Delete HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{6FB70A72-5188-449E-ECAD-A2290CAA046F} /f
 del WIZARD.bat

Параметр /f используется для удаления подразделов без подтверждения. А последняя строка
удаляет сам WIZARD.bat. Ну а зачем он нам после того, как сделал своё чёрное дело? Надо
будет, так мы ещё раз архив запустим (который скоро сделаем).
Ну что ж, теперь начнём самое непосредственное знакомство с кодом CloneCD.exe. Любители
асма, приготовьтесь, для вас сейчас начнётся самое интересное.
Запуская свою вечно-триальную (теперь уже:) версию, я заметил, что мне в ней не нравятся
три момента. Я буду их называть от менее раздражающего к более раздражающему. Итак, на
первом месте у нас раздражающая надпись в окне About о том, что мы юзаем
НЕЗАРЕГИСТРИРОВАННУЮ ВЕРСИЮ. А какую хотим, такую и юзаем!!!:) Но эту проблему мы решим
пока без всякого асма, а лишь с помошью Restorator'a. Откроем наш CloneCD в этом лучшем
редакторе ресурсов, далее RCData->TABOUTBOX. Находим там такие ресурсы, как TLABEL. Наша
задача - убить все TLABEL кроме тех, которые содержат сведения о версии и названии, то
есть нам надо удалить вот такие ресурсы:

object Copyright: TLabel
      Left = 40
      Top = 64
      Width = 44
      Height = 13
      Caption = 'Copyright'
      Layout = tlBottom
      IsControl = True
    end
    object Registered: TLabel
      Left = 40
      Top = 136
      Width = 51
      Height = 13
      Caption = 'Registered'
      Layout = tlBottom
    end
    object UserNameLabel: TLabel
      Left = 40
      Top = 152
      Width = 257
      Height = 33
      AutoSize = False
      Caption = 'Name'
    end
    object Label: TLabel
      Left = 40
      Top = 80
      Width = 273
      Height = 49
      AutoSize = False
      Caption = 'Label'
      Layout = tlCenter
    end
 И надо ещё установить ClientHeight = 130, чтоб форма куцой не казалась

Сказано - сделано. Теперь в том окне кроме версии и названия проги, больше ничего нет, что
очень хорошо:).
На втором месте у нас раздражающее сообщение типа "MessageBoxA обыкновенный". Тут и
нет-то никакого подвоха, но это окно постоянно пытается расшатать нам нервную систему своим
предложением обновить CloneCD. Как оно не может понять - ну не хотим мы нашу ломаную
версию обновлять (ей и так досталось:). Что ж, грузим прогу в отладчик, далее, как обычно,
bpx MessageBoxA
прервёмся по адресу 00490156 и увидим вот что:

 0049014C  |. 53             PUSH EBX                                 ; /Style
0049014D  |. 57             PUSH EDI                                 ; |Title
0049014E  |. 56             PUSH ESI                                 ; |Text
0049014F  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]             ; |
00490152  |. 8B40 30        MOV EAX,DWORD PTR DS:[EAX+30]            ; |
00490155  |. 50             PUSH EAX                                 ; |hOwner
00490156  |. E8 95360700    CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA

Тут дальше никакой фантазии, nop'им параметры функции и сам MessageBoxA тоже. После патча
это дело будет выглядеть так:

 0049014C     90             NOP
0049014D     90             NOP
0049014E     90             NOP
0049014F  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]             ; |
00490152  |. 8B40 30        MOV EAX,DWORD PTR DS:[EAX+30]            ; |
00490155     90             NOP
00490156     90             NOP
00490157     90             NOP
00490158     90             NOP
00490159     90             NOP
0049015A     90             NOP

(Да, тут хотелось бы сделать маааааленькую поправку - уже после написания тьютора я заметил
одну не очень приятную вещь. Дело в том, что эта же функция в этом самом месте используется
для создания сообщения при очистке дисков. Короче говоря, если её занопить, то функция
очистки в проге будет мёртвая, но для меня это было не страшно, т.к. для очистки дисков
я использую Alcohol 120% ИМХО чистят они одинаково, но если вы хотите совсем "Final Edition",
то не нопьте её:)
И никаких гвоздей!(Здесь советую сохраниться) Почти никаких, так как остаётся ещё один NAG.
Собственно, ради этой гадости я и затевал написание этого тьютора. (Эта зараза всё время
нам напоминает,сколько у нас осталось дней) Теперь нам будет противостоять не какой-то
там занюханный MessageBoxA, а модальное окно. Его мы не занопим, т.к. напрямую оно не
вызывается. Ах, как хотелось бы просто удалить его из ресурсов тем же Restorator'ом, но
ничего не выйдет - при попытке это сделать CloneCD выдаст сообщение об ошибке и закроется.
Придумаем что-то другое. Вначале у меня была идея попасть на функцию нажатия кнопки ОК, но
после декомпилирования с помощью DEDE я заметил, что такой процедуры попросту нет. Я долго
ломал голову над этой проблемой, читал другие тьюторы, но там везде был один ответ - нужно
найти и поменять переход, и НАГ исчезнет. Я применял метод тупого трейса (Ctrl+F8) - хотел
дождаться, когда прога остановиться на каком-то call'е, но прога каждый рах входила в
длительный цикл, а ждать вечно как-то не хотелось:). Нужна была свежая мысль, и она пришла.
Я заметил (трудно было не заметить:), что после нажатия на кнопку ОК, когда мы соглашались
попробовать прогу в течение триал-периода, НАГ исчезает, а неактивное главное окно
становиться активным. Оно было создано и раньше, наша же задача теперь сделать его активным.
А какая функция активирует окна? Правильно SetActiveWindow!
bpx SetActiveWindow
И действительно, после нажатия злосчастной кнопки "попробовать" бряк сразу сработал. Теперь
нужно было найти начало функции, каким-то образом причастной к созданию НАГА. Я искал
переход, по которому мы попали на эту функцию. Я даже использовал такие шаманские приёмы,
как установка бряка на пару инструкций выше текущего бряка. Такая своеобразная рекурсия.
Короче говоря, разными магическими методами я добрёл до такого кода:

 0048CC62   . 33C0           XOR EAX,EAX
0048CC64   . 5A             POP EDX
0048CC65   . 59             POP ECX
0048CC66   . 59             POP ECX
0048CC67   . 64:8910        MOV DWORD PTR FS:[EAX],EDX
0048CC6A   . 68 06CD4800    PUSH CloneCD1.0048CD06
0048CC6F   > A1 C03D5300    MOV EAX,DWORD PTR DS:[533DC0]
0048CC74   . 8B40 48        MOV EAX,DWORD PTR DS:[EAX+48]
0048CC77   . 3B45 E8        CMP EAX,DWORD PTR SS:[EBP-18]
0048CC7A   . 75 10          JNZ SHORT CloneCD1.0048CC8C
0048CC7C   . 66:8B55 EE     MOV DX,WORD PTR SS:[EBP-12]
0048CC80   . A1 C03D5300    MOV EAX,DWORD PTR DS:[533DC0]
0048CC85   . E8 B2120000    CALL CloneCD1.0048DF3C
0048CC8A   . EB 0C          JMP SHORT CloneCD1.0048CC98
0048CC8C   > 33D2           XOR EDX,EDX
0048CC8E   . A1 C03D5300    MOV EAX,DWORD PTR DS:[533DC0]
0048CC93   . E8 A4120000    CALL CloneCD1.0048DF3C
0048CC98   > 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
0048CC9B   . E8 7C9FFFFF    CALL CloneCD1.00486C1C
0048CCA0   . A1 C03D5300    MOV EAX,DWORD PTR DS:[533DC0]
0048CCA5   . 8B58 7C        MOV EBX,DWORD PTR DS:[EAX+7C]
0048CCA8   . 837B 08 00     CMP DWORD PTR DS:[EBX+8],0
0048CCAC   . 7E 22          JLE SHORT CloneCD1.0048CCD0
0048CCAE   . 8BC3           MOV EAX,EBX
0048CCB0   . E8 03230400    CALL CloneCD1.004CEFB8
0048CCB5   . 8BF0           MOV ESI,EAX
0048CCB7   . A1 C03D5300    MOV EAX,DWORD PTR DS:[533DC0]
0048CCBC   . 8970 78        MOV DWORD PTR DS:[EAX+78],ESI
0048CCBF   . 8BD6           MOV EDX,ESI
0048CCC1   . A1 C03D5300    MOV EAX,DWORD PTR DS:[533DC0]
0048CCC6   . 8B40 7C        MOV EAX,DWORD PTR DS:[EAX+7C]
0048CCC9   . E8 92240400    CALL CloneCD1.004CF160
0048CCCE   . EB 0A          JMP SHORT CloneCD1.0048CCDA
0048CCD0   > A1 C03D5300    MOV EAX,DWORD PTR DS:[533DC0]
0048CCD5   . 33D2           XOR EDX,EDX
0048CCD7   . 8950 78        MOV DWORD PTR DS:[EAX+78],EDX
0048CCDA   > 837D E4 00     CMP DWORD PTR SS:[EBP-1C],0
0048CCDE   . 74 09          JE SHORT CloneCD1.0048CCE9
0048CCE0   . 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C]
0048CCE3   . 50             PUSH EAX                                 ; /hWnd
0048CCE4   . E8 7F6B0700    CALL <JMP.&user32.SetActiveWindow>       ; \SetActiveWindow

А вот внизу как раз наша функция, которая стала в данном случае отправной точкой. Но как я
попал на вершину данного кода, если на него нет никакого перехода? И тут на меня, как
говориться, нашло, нет, меня осенило! А что, если я попал сюда по инструкции Retn? В стек
втолкнули адрес верхней инструкции, а потом через Retn закинули меня сюда (злые дяди
программеры:). Т.е. где-то должна быть совершенно определённая инструкция - push 0048CC62.
Долго её искать не пришлось - она была прямо надо мной:

 0048CC4D  |. 68 62CC4800    PUSH CloneCD1.0048CC62    вталкивается в стек адрес возврата
0048CC52  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] эти инструкции нас не
0048CC55  |. E8 7AFDFFFF    CALL CloneCD1.0048C9D4        интересуют
0048CC5A  \. C3             RETN                       ВОЗВРАТ

Теперь посмотрим выше, пока не увидим стандартное начало всех подпрограмм, и вот оно где:

 0048CA8C  /. 55             PUSH EBP
0048CA8D  |. 8BEC           MOV EBP,ESP

Ставим бряк на адресе 0048CA8C и перезапускаемся. Каково же было моё удивление, когда бряк
сработал до появления НАГА. Я, естевственно, захотел узнать, где создаётся НАГ. Оказывается,
эта зараза создаётся в цикле:

 0048CBD1  |> 8B03           /MOV EAX,DWORD PTR DS:[EBX]
0048CBD3  |. E8 74310000    |CALL CloneCD1.0048FD4C
0048CBD8  |. 8B03           |MOV EAX,DWORD PTR DS:[EBX]
0048CBDA  |. 80B8 9C000000 >|CMP BYTE PTR DS:[EAX+9C],0
0048CBE1  |. 74 0F          |JE SHORT CloneCD1.0048CBF2
0048CBE3  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
0048CBE6  |. C780 4C020000 >|MOV DWORD PTR DS:[EAX+24C],2
0048CBF0  |. EB 14          |JMP SHORT CloneCD1.0048CC06
0048CBF2  |> 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
0048CBF5  |. 83B8 4C020000 >|CMP DWORD PTR DS:[EAX+24C],0
0048CBFC  |. 74 08          |JE SHORT CloneCD1.0048CC06
0048CBFE  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
0048CC01  |. E8 36FDFFFF    |CALL CloneCD1.0048C93C
0048CC06  |> 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
0048CC09  |. 8B80 4C020000  |MOV EAX,DWORD PTR DS:[EAX+24C]
0048CC0F  |. 85C0           |TEST EAX,EAX
0048CC11  |.^74 BE          \JE SHORT CloneCD1.0048CBD1

Вот где-то здесь, и то как-то по частям - вначале окно появится, потом надпись на нём,
потом кнопка и т.д. Тогда у меня зародилась коварная мысль вообще не выполнять команды
этой функции. Я вернулся на начало подпрограммы (назовём её "создание НАГА") и пропатчил
её вот так:

  Было				    Стало
  0048CA8C  /. 55    PUSH EBP                             0048CA8C     С3    RETN
  0048CA8D  |. 8BEC  MOV EBP,ESP                       0048CA8D  |. 8BEC  MOV EBP,ESP

Так мы заходим по Call'у и сразу из него выходим. Тот же эффект, как и от забивания call'a
nop'ами, только так мы патчим один байт, а не шесть. Благодаря этому патчу мы вышли из
"создания НАГА", нажимаем F9 и... снова оказываемся на на этой процедуре, и снова, и
снова. Ну, программеры:(. То вначале горе-крэкер попался ккой-то, теперь эти программеры.
Но мы прорвёмся! Жмём F8 и выходим из "создания НАГА". Стоим здесь:

 004035C1  |. 8B0D FCA85100  |MOV ECX,DWORD PTR DS:[51A8FC]           
004035C7  |. 8B01           |MOV EAX,DWORD PTR DS:[ECX]
004035C9  |. 8B90 4C020000  |MOV EDX,DWORD PTR DS:[EAX+24C]
004035CF  |. 83FA 02        |CMP EDX,2
004035D2  |. 75 19          |JNZ SHORT CloneCD1.004035ED
004035D4  |. 8B0D C0405000  |MOV ECX,DWORD PTR DS:[5040C0]
004035DA  |. 85C9           |TEST ECX,ECX
004035DC  |. 74 1A          |JE SHORT CloneCD1.004035F8
004035DE  |. A0 5C5A5200    |MOV AL,BYTE PTR DS:[525A5C]
004035E3  |. 3C 02          |CMP AL,2
004035E5  |. 74 11          |JE SHORT CloneCD1.004035F8
004035E7  |. B8 01000000    |MOV EAX,1
004035EC  |. C3             |RETN
004035ED  |> 8A15 5C5A5200   MOV DL,BYTE PTR DS:[525A5C]
004035F3  |. 80FA 02        |CMP DL,2                      место будущего патча
004035F6  |.^75 BA          \JNZ SHORT CloneCD1.004035B2

Нам совсем не нужен весь этот код, нужно посмотреть, как бы мы вышли из цикла, если б не
патчили прогу. Перезапускаемся, останавливаемся на вышеизложенном коде, жмём F8 и смотрим,
когда мы выйдем из этого цикла. А выйдем мы из из него, когда в DL будет двойка. Если же
мы пропатчим прогу так, как мы только что сделали, то в DL всегда нуль будет, и мы так из
этого цикла и не выйдем. Но а кто нам мешает и цикл подправить? Да и подправить там всего
ничего - я то место даже пометил, пропатчим так:

004035F3  |. 80FA 02        |CMP DL,0

Далее жмём F9 и радуемся отсутствию НАГА. Только вот незадача - если мы так сделаем, то
НАГА мы, конечно, не увидим, да вот только кроме главного окна програмы, мы вообще других
окон лицезреть не будем. Дело в том, что эта процедура не только процедура создания НАГА -
она в CloneCD создаёт вообще все окна, кроме главного. Поэтому такой патч нам не подходит.
Нужно писать,так называемый, фильтр, функцией которого будет решать, какие окна создавать,
а какие нет. Но для того, чтоб такой фильтр написать, нужно определить, как в эту процедуру
создания окна попадают параметры, и какие из них нужно проверять. Для этого посмотрим на
код перед нашим call'ом. И вот что мы там увидим:

 004035B2   A1 FCA85100      MOV EAX,DWORD PTR DS:[51A8FC] в EAX передаётся класс окна
 004035B7   8B00             MOV EAX,DWORD PTR DS:[EAX]    значение класса преобразовывается
 004035B9   8B10             MOV EDX,DWORD PTR DS:[EAX]
 004035BB   FF92 E8000000    CALL DWORD PTR DS:[EDX+E8]    вызов функции создания окон
 004035C1   8B0D FCA85100    MOV ECX,DWORD PTR DS:[51A8FC]  в ECX передаётся класс окна 

Из этого становится очевидно, что стоя в начале функции создания окон, мы можем увидеть в
EAX преобразованное значение класса окна, которое в недалёком будущем будет создано этой
процедурой. Определим, каково будет это значение для нашего НАГА. Оно будет составлять
01398000
Теперь всё должно бы прокатить по стандарту. Находим в нашем распакованном ехе нули,
делаем из процедуры на них переход, затирая первые три инструкции в процедуре создания окон,
т.к. они как раз 6 байт занимают, а нам надо 5 для перехода, в этих нулях пишем обработчик,
типа если класс не соответствует значению, указанному выше, то выполним три затёртые
инструкции и перейдём обратно в процедуру, а если соответствует, то выходим из процедуры,
но так, чтоб потом выйти из цикла, о котором я уже упоминал. Сразу определимся - для того,
чтоб выйти из цикла, нужно чтоб в момент проверки значение в EDX было равно 2. Как это
сделать? Да очень просто - вернёмся к коду, идущему после вызова процедуры создания окон
и посмотрим, в каком месте в EDX записывается значение, и какое это значение. Ну, долго
искать не пришлось:

 004035C9   8B90 4C020000    MOV EDX,DWORD PTR DS:[EAX

Так как после выхода из процедуры, которая создавала НАГ и другие окна, я заметил, что
значение в EAX то же, что и до входа в процедуру, то понял, что мне нужно будет записать
2 по адресу 0139824С. Вот, собственно, и всё описание того, что пришлось бы сделать, если
б не одно обстоятельство.
Дело в том, что весь код, который до этого мною приводился, находится в секции .data, и
всё бы ничего, но в этой секции не то, что нужного мне количества нулей нет, мне даже
показалось, что там вообще такие символы не используются! (Ну, это я уж загнул:) Нет, пару
ноликов там, конечно, было, но мне ведь надо не пару. Я продолжил поиск, и через некоторое
времы HIEW показал мне нули в большом количестве, но... в другой секции. Вначале меня это
не сильно смутило, но когда оказалось так, что из секции .data я не могу прыгнуть в секцию
.code, я понял, что ситуация здесь явно НЕОБЫЧНАЯ.
В голове возникла масса идей - расширить секцию .data
- добавить новую секцию
- заменить какую-то строку моим кодом
Но все эти идеи я потом отбросил. Расширять секцию я не захотел по одной простой причине:
после распаковки у меня в CloneCD.exe стало 15 секций, .data - вторая, это что ж мне для 14
секций RAW и Virtual size пересчитывать?:( Не-не:) От добавления новой секции я тоже
отказался - где гарантия, что я смогу на неё попасть? Заменять строки, если они ничего не
говорят про регистрацию, я не люблю, поэтому и третью идею отбросил. Что же я тогда
выбрал???
Гвоздь программы
Идея, кторая сейчас будет описна, наверное, не могла прийти в голову нормально мыслящему
человеку, котрый часами просиживал за распаковкой, изучением методов борьбы с упаковщиками
и протекторами или даже написанием своих утилит для борьбы с этой заразой. Поэтому если вы
считаете себя таковым, то мой вам совет - присядьте:) Сейчас будет сюрприз.
Как вы уже поняли, я тут втихаря юзаю не только те тулзы, которые изначально указывал
в списке тех, что нам понадобятся. Да, я использовал LordPe by Yoda, чтоб глянуть на
секции и их параметры. (Ещё я и Regmon юзал, когда хотел настоящий ключ подобрать,
оказалось, что распакованная прога рег.ключ из реестра вообще не извлекает, ей по барабану,
есть он там или нет, и триал-ключи она не трогает. Также я дебажил RegCloneCD - рег.модуль
для CloneCD и получил шаблон рег.файла, но не сам файл, к сожалению. Такой вот я любитель
настоящих ключей, да видно не судьба его в этот раз найти) Да что-то я отвлёкся. Это я к
тому, что сейчас мы будем использовать ещё одну всем хорошо знакомую софтину - UPX. Да, не
удивляйтесь, не падайте со стула в обморок:), вы правильно поняли - будем наш файл
запаковывать. "Зачем?" - спросят перепуганные новички, которым всегда говорят, что всё надо
распаковывать, а мы теперь назад запаковываем, что мы с ним потом будем делать? Мы его
запаковываем потому, что UPX - это же огромный источник нулей! Кроме того, по его трём
секциям можно хоть на космическом корабле из одной в другую летать! Теперь вспомните
методику создания in-line патча, а пока будете вспоминать, советую из командной строки
прописать
upx CloneCD.exe
Перед этим нужно бы загрузить ещё раз незапакованную upx'ом прогу в Olly и посмотреть EP
пока он ещё равен OEP. Но если вы этого не сделали, то за вас это сделал я:) - OEP равно
0040154С. Вы спросите - "это ещё зачем?". Это делается для того, чтоб мы не играли в
жмурки с упаковщиком, который мы сами же и добавили. Открыв запакованный CloneCD, в
отладчике выберем Search for->Sequence of commands и введём для поиска:

 popad 
 jmp 0040154C


Т.к. это - upx, то переход на OEP всегда будет выполняться именно так. Для этого нам и
нужен был OEP незапакованного файла, чтоб отыскать эти инструкции. Теперь этот переход на
OEP нужно заменить на переход в область нулей. Опять с помощью HIEW ищем нули - мне
понравились нолики начиная с адреса 00CCE1C0, поэтому тот переход я заменил на такой:

 00CCB623   E9 982B0000    JMP CloneCD.00CCE1C0

И знаете, этот переход нормально выполнился! А дальше, оказавшись на своих ноликах, я их
изменил на такой вот приятный глазу код:

 00CCE1C0   C705 8CCA4800 E9>MOV DWORD PTR DS:[48CA8C],841747E9  собственно in-line
00CCE1CA   66:C705 90CA4800>MOV WORD PTR DS:[48CA90],9000        будет описан ниже
00CCE1D3  -E9 743373FF      JMP CloneCD.0040154C                 новый переход на OEP
00CCE1D8   3D 00803A01      CMP EAX,13A8000        сравнить значение класса окна с окном
                                                   НАГА                
00CCE1DD   74 0B            JE SHORT CloneCD.00CCE1EA            если равно, то переход
								 на обработчик
00CCE1DF   55               PUSH EBP                             если не равно, выполнить
00CCE1E0   8BEC             MOV EBP,ESP				затёртые in-line'ом команды	
00CCE1E2   83C4 E0          ADD ESP,-20
00CCE1E5  -E9 A8E87BFF      JMP CloneCD.0048CA92               продолжить создание окна
00CCE1EA   BA 4C823A01      MOV EDX,13A824C                    поместить значение в EDX 
00CCE1EF   50               PUSH EAX                           сохранить EAX в стеке
00CCE1F0   B8 02000000      MOV EAX,2                          записать 2 в EAX
00CCE1F5   8902             MOV DWORD PTR DS:[EDX],EAX         записать 2 по адресу 013A824C 
00CCE1F7   58               POP EAX                            восстановить сохр.значение
00CCE1F8   C3               RETN                               выйти из процедуры НАГА

Да, совсем забыл, что после упаковки upx'ом значение класса окна-нага поменялось на
013A8000
Это можно легко определить опытным путём так, как мы это проделали в первый раз.
Теперь настало времы рассказать, что же произошло после in-line патча. А ничего особенного,
он просто создаёт эти инструкции:

0048CA8C  -E9 47178400      JMP CloneCD.00CCE1D8
 0048CA91   90               NOP

Этот код после своего выполнения перебрасывает нас в фильтр окон. А вот те затёртые
инструкции в фильтре как раз там были вместо результата работы in-line'a, но in-line их
затёр:)
Вот, собственно, и всё.
Послесловие-обращение
Кратко перечислим все проделанные нами операции:

1.Распаковка+деактивация триальных счётчиков проги.
2.Использование bat-файла для очистки реестра от триал-счётчиков.
3.Удаление объектов,содержащих сведения о незарегистрированности.
4.Удаление НАГ-MessageBoxA. (по желанию)
5.Запаковка проги upx'ом.
6.Создание in-line патча для фильтрования создаваемых окон.(Борьба с МЕГА-НАГОМ:)
7.(Я бы посоветовал:) Архивация bat-файла и крэка с целью выполнения bat-файла
при запуске крэка.

Сразу хочу предвидеть некоторые вопросы и нерадивые коментарии, которые в недалёком
будущем могут появиться под этим тьютором.
Вопрос №1:
- Почему я не воспользовался функцией SendMessageA и не отправил нагу сообщение wm_close?
- Потому что наг не реагирует на это сообщение. Скажу больше - если принудительно
деактивировать окно нага, а после - принудительно активировать главное окно программы, то
кнопки на главном окне остануться Enabled=False (недоступны, так сказать:), то очень нам
не нужно. Так что фильтр окон - идеальное решение.

Вопрос №2:
- Почему я, зная что прога при "занопивании" MessageBoxA, упомянутого выше, будет глючить,
всё равно его нопил?
- Ну достал меня этот MessageBoxA, ну жизни он мне не даёт:) Да, кстати, там где то был
переход, изменив который, можно было не попасть на MessageBoxA, я на него даже как-то
наткнулся, но искать специально - влом, хотите - ищите.

Теперь хотелось бы скзать пару слов о своём тьюторе. Что меня толкнуло на его написание?
Стимулом стали тьюторы про Alcohol 120%. Я сразу подумал, что CloneCD не хуже, но про неё
нет ни одного тьтютора или даже какой-то пресной статейки. Также не маловажным является тот
факт, что приём запаковки, который здесь был применён - пока по-своему уникален, по-моему,
его можно даже патентовать как новую технологию:). Мне всё время казалось, что все авторы
в основном используют одни и те же приёмы для взлома подопытных прог, но каждая прога -
шедевр, она по-своему уникальна, а люди, привыкшие патчить, только и знают, что
XOR EAX,EAX
INC EAX
RETN
Патч - это искусство, такое же, как keygen или loader, просто нужно его правильно
показать, и тогда даже патч может стать примером академического крэка!
Благодарности
Конечно, спасибо cracklab за то, что они есть, за то, что помогают людям и ещё за
многое им спасибо. Спасибо авторам upx за это замечательное творение, огромная благодарность
моим друзьям:
Deniska
Rain
111 (за поддержку на сессии:)
Естевственно, спасибо компании Slysoft! они реально напрягались, когда пытались свой
продукт защитить, этот взлом был не самым лёгким.
Да, чуть не забыл... ЛЁХА... СОЛОДОВНИКОВ... Ну сколько можно уже людям палки в колёса
ставить? Ну что это за дела? Завязывай ты со своим протектором:)
И, конечно, спасибо тебе, читатель. Я старался, чтоб моя статья не отпугнула тебя сразу,
если ты новичок, но и чтоб было интересно, если ты бывалый крэкер. Надеюсь, ты что-то
почерпнул для себя, ведь всё, что здесь публикуется, публикуется специально для тебя.
Удачи тебе в нелёгком деле реверсинга!!!



Обсуждение статьи: Безжалостное убийство nag'ов на примере CloneCD 5.0.4.5. rus >>>


Комментарии к статье: Безжалостное убийство nag'ов на примере CloneCD 5.0.4.5. rus

stahh 13.08.2006 21:46:14
Молоток. Это про UPX. Уважаю не стандартные решения.
Ну а как бы ты поступил, если бы создавалось не одно окно такого класса? Или создавалось одно окно, но перерисовывалось полностью на новое?
---
trc 15.08.2006 02:30:59
Недели 2 назад ломал более новую версию программы (5.2.6) и так никаким Солодниковым не пахнет, может автор программы смирился с тем, что его программу все равно сломают?!
А так программа ничего, мне нравится :)
---
PE_Kill 18.08.2006 08:44:10
Очередная чушь. Зачем ты делал батник с ключами реестра? Аспр каждый раз генерит новые.
MessageBox ты занопил в процедуре вызова этого бокса, а надо было найти от куда она вызывается.
И кстати про xor eax,eax тут как раз оно, а не то что ты тут наизвращал.
Ты бы почитал сначало туторы что ли?
---

Материалы находятся на сайте https://exelab.ru



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


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