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

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


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

Взлом jv16 PowerTools.

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

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

Автор: Whlam <whlam@rambler.ru>

Всем привет. Началась моя история с того, что мне надо было подчистить реестр в своем компе, дабы избавиться от всякой непонятной нечисти. Обычно я для этих целей использовал RegCleaner - простой такой и удобный =). Но тут узнал что RegCleaner больше не обновляется, а вместо него появился более мощный инструмент для работы с реестром jv16 PowerTools. Ну я и решил его поюзать. Не смотря на 30 дневный триал прога мне понравилась &#61514;. Я сразу же полез в сеть искать кряк. В итоге нашел пару кряков – один оказался не для моего билда, а второй после пропатчивания экзешника показывал только главное окно программы с неактивными кнопками. В общем найти рабочий кряк мне так и не удалось. Не долго раздумывая я взял в руки молоток, гвозди … ээээ… в общем это уже другая история =).

Итак, взлом.
Нам понадобятся:
- PEiD
- OllyDbg c плагином CommandBar (командной строкой)
- Hiew
- UPX-Ripper


Первым делом необходимо проверить не запакована ли наша программа чем нибудь. Для этого кидаем ее в PEiD и смотрим что он нам выдаст. А выдал он следующее -UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo. Это значит что программа запакована простым (а может и не очень =)) пакером UPX. Распаковать программу не составит труда, просто закидываем экзешник в UPX-Ripper и у нас получился готовый распакованный файл написанный на Borland Delphi 4.0 - 5.0, который весит уже не 808 kb, а 2,25 Mb.

Т.к. программа у нас имеет триальный период, переведем часы на месяц вперед и посмотрим как она поведет себя по истечению триального срока. Аха… вылез MessageBox с сообщением что триал закончился. Нажимаем на сообщении ОК и закидываем экзешник в OllyDbg.
Нам необходимо узнать в каком месте программы вызывается функция с нашим nag скрином.
В командной строке прописываем
bpx MessageBoxA
и на всякий случай еще
bpx MessageBoxW
bpx MessageBox
Запускаем (F9) прогу на выполнение… вылезло окно о окончании триала. Мда…значит бряки не сработали. Следовательно nag скрин обрабатывается другой функцией и скорее всего это функция ShowWindow. Проверяем:
bpx ShowWindow
Нажимаем F9 и … опа .. прервались:

0044D42D . E8 3EABFBFF CALL <JMP.&user32.ShowWindow> ; \ShowWindow
0044D432 . E9 05010000 JMP jv16_Pow.0044D53C
0044D437 > 33C0 XOR EAX,EAX

Если вы по каким то причинам оказались на адресах 77735…. Просто нажмите Shift+F9.
Трассируем программу по F8. По пути вам встретится долгий цикл. Дабы не ждать долго пока он кончиться поставим бряк (F2) сразу после цикла и нажмем F9. И сразу же вылез наг скрин. Значит этот цикл находиться в функции обработки окна:

0044DA13 . 8990 34020000 MOV DWORD PTR DS:[EAX+234],EDX
0044DA19 > 8B03 MOV EAX,DWORD PTR DS:[EBX] ;начало цикла
0044DA1B . E8 D42D0000 CALL jv16_Pow.004507F4
0044DA20 . 8B03 MOV EAX,DWORD PTR DS:[EBX]
0044DA22 . 80B8 8C000000> CMP BYTE PTR DS:[EAX+8C],0
0044DA29 . 74 0F JE SHORT jv16_Pow.0044DA3A
0044DA2B . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0044DA2E . C780 34020000> MOV DWORD PTR DS:[EAX+234],2
0044DA38 . EB 14 JMP SHORT jv16_Pow.0044DA4E
0044DA3A > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0044DA3D . 83B8 34020000> CMP DWORD PTR DS:[EAX+234],0
0044DA44 . 74 08 JE SHORT jv16_Pow.0044DA4E
0044DA46 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0044DA49 . E8 26FDFFFF CALL jv16_Pow.0044D774
0044DA4E > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0044DA51 . 8B80 34020000 MOV EAX,DWORD PTR DS:[EAX+234]
0044DA57 . 85C0 TEST EAX,EAX
0044DA59 .^ 74 BE JE SHORT jv16_Pow.0044DA19 ;конец цикла
0044DA5B . 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX ;мы сдесь
0044DA5E . 6A 00 PUSH 0
0044DA60 . 6A 00 PUSH 0

Смотрим выше где у нас начинается эта функция:

0044D8D4 /. 55 PUSH EBP ;начало функции
0044D8D5 |. 8BEC MOV EBP,ESP
0044D8D7 |. 83C4 E0 ADD ESP,-20

Поставим на начало этой функции бряк и перезапускаем прогу и оказываемся на адресе 0044D8D4 т.е. на начале нашей функции. Далее нам нужно узнать как откуда программа «прыгает» на эту функцию. Для этого в OllyDbg кликаем два раза на строку PUSH EBP и меняем ее на RETN, т.е. на возврат из этой функции не проходя ее тела. Нажимаем F8 и оказываемся тут:

00456767 |. 8B10 MOV EDX,DWORD PTR DS:[EAX]
00456769 |. FF92 D8000000 CALL DWORD PTR DS:[EDX+D8] ;отсюда мы пришли
0045676F |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
00456772 |. 33C0 XOR EAX,EAX

Наша начальная функция находиться в еще одной функции. Нам нужно выйти и из этой функции тоже. Вообще нам нужно добраться до тела основной программы, которая вызывает функцию nag скрина. Для выхода из этой функции делаем те же действия что и до этого; т.е. поднимаемся на начало этой функции:

004566E8 /$ 55 PUSH EBP ;начало функции
004566E9 |. 8BEC MOV EBP,ESP
004566EB |. 83C4 F4 ADD ESP,-0C

савим бряк на этом начале, перезапускаем программу. OllyDbg выдаст ошибку и дезактивирует все бряки. Нажимаем кнопку «B» на главной панели инструментов OllyDbg и активируем последний наш бряк, т.е. 004566E8, а за одно и удалим не нужные теперь бряки ShowWindow. Запускаем прогу F9. прерываемся на нашем только что активированном бряке, перебиваем первую строку функции с PUSH EBP на RETN и нажимаем F8. Оказываемся еще в одной функции, которая находиться тремя строчками выше:

004566D8 |. 6A 00 PUSH 0
004566DA |. 66:8B4D FE MOV CX,WORD PTR SS:[EBP-2]
004566DE |. E8 05000000 CALL jv16_Pow.004566E8
004566E3 |. 59 POP ECX ;мы сдесь
004566E4 |. 5D POP EBP
004566E5 \. C2 0C00 RETN 0C
004566E8 C3 RETN ;начало нашей бывшей функции
004566E9 |. 8BEC MOV EBP,ESP
004566EB |. 83C4 F4 ADD ESP,-0C

Кликаем на начало этой функции - 004566C4 /$ 55 PUSH EBP и в строке статуса смотрим откуда она вызывается:

Local call from 004567B5

Перейдем к этому адресу – Go To Call from 004567B5:

004567A8 /$ 6A 00 PUSH 0 ; /Arg3 = 00000000
004567AA |. 52 PUSH EDX ; |Arg2
004567AB |. 51 PUSH ECX ; |Arg1
004567AC |. B2 04 MOV DL,4 ; |
004567AE |. 66:8B0D BC674>MOV CX,WORD PTR DS:[4567BC] ; |
004567B5 |. E8 0AFFFFFF CALL jv16_Pow.004566C4 ; \jv16_Pow.004566C4
004567BA \. C3 RETN

Такой способ хорошо подходит только тогда, когда вызов функции идет только с одного места программы. В иных случаях приходиться перебивать начало функции на команду retn, чтобы попасть именно в ту часть кода, откуда она была вызвана.
Далее также кликаем по 004567A8 и смотрим откуда идет вызов этой функции. А идет он от сюда - Local call from 004567A2. Этот адрес находится прямо над текущей функцией:

0045679C /$ 83C9 FF OR ECX,FFFFFFFF
0045679F |. 83CA FF OR EDX,FFFFFFFF
004567A2 |. E8 01000000 CALL jv16_Pow.004567A8 ;предыдущая функция
004567A7 \. C3 RETN

Ставим бряк на адрес 0045679C, перезапускаем прогу, перебиваем OR ECX,FFFFFFFF на retn нажимаем F8 и смотрим откуда у нас произошел вызов:

0052D386 |. 837D FC 00 CMP DWORD PTR SS:[EBP-4],0
0052D38A |. 74 08 JE SHORT jv16_Pow.0052D394
0052D38C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0052D38F |. E8 0894F2FF CALL jv16_Pow.0045679C ;предыдущая функция
0052D394 |> 33C0 XOR EAX,EAX
0052D396 |. 5A POP EDX
0052D397 |. 59 POP ECX

Ё мое!!! да чтож такое!!! Мы опять в функции!!! Когда же они кончатся!?. Программеры явно были мозаистами и любили вложенные функции. Но мы все равно доберемся до истины =).
Дальше все делаем как обычно до тех пор пока не выйдем из всех тел вложенных функций. А осталось их там всего две. После долгих выходов из функций мы должны оказаться сдесь:

004F0B89 > \8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004F0B8C . 8378 10 00 CMP DWORD PTR DS:[EAX+10],0

004F0B90 . /74 08 JE SHORT jv16_Pow.004F0B9A
004F0B92 . |84DB TEST BL,BL
004F0B94 . |0F85 A4000000 JNZ jv16_Pow.004F0C3E
004F0B9A > \8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
004F0B9D . B8 14000000 MOV EAX,14
004F0BA2 . E8 65290200 CALL jv16_Pow.0051350C
004F0BA7 . 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
004F0BAA . 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
004F0BAD . E8 E631F1FF CALL jv16_Pow.00403D98
004F0BB2 . 8D55 E8 LEA EDX,DWORD PTR SS:[EBP-18]
004F0BB5 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004F0BB8 . E8 27E4FFFF CALL jv16_Pow.004EEFE4 ;
004F0BBD . 6A 00 PUSH 0 ;мы сдесь

004F0BBF . 6A 00 PUSH 0

По адресу 004F0BB8 находиться как раз функция которая и создает nag скрин. Хотел я ее сначала заNOPить, но потом увидел два интересных перехода что повыше =)
Второй переход перепрыгивает через функцию нага куда то нахрен. Значит это то что нам надо! Все что нам надо сделать это условный переход поменять на безусловный. Но у нас есть еще и первый переход, который при определенных условиях (не будем вдаваться в подробности :)), перепрыгивает второй переход, что в нашем случае недопустимо. Вот его то мы и заNOPим.
Открываем нашу прогу в Hiew и меняем байты следующим образом:

004F0B90 . 90 nop
004F0B91 . 90 nop
004F0B92 . 84DB TEST BL,BL
004F0B94 . E9A5000000 JMP jv16_Pow.004F0C3E
004F0B99 . 90 nop
004F0B9A . 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]

Теперь запускаем прогу и радуемся =). А радовались мы не долго ((… ровно 10 секунд. Потом программа сама закрывается и приходиться ее запускать снова и снова. Хитрые программеры по ходу сделали дополнительную защиту по счетчику. Надо ее найти.
Открываем в OllyDbg наш пропатченный файл, ставим бряк приблизительно в том месте где мы меняли байты, запускаем прогу (F9) и прерываемся. Прокрутив пару экранов вверх, пару экранов вниз обнаруживаем функцию GetTickCount. Прокрутим еще несколько экранов вверх – эта функция будет вызываться не однократно с разных частей программы. Кстати по пути прокрутки вверх вам должны будут встретиться такие вот потешные фразы:

004F020A . B8 480E4F00 MOV EAX,jv16_Pow.004F0E48 ; ASCII "Cracking sucks"

Видать это ругательство которое предназначалось крэкеру от разработчиков =). Значит мы на верном пути =).
Т.к. вызовов функции GetTickCount тут как снега зимой, то проще нам поставить бряк на эту функцию и протрейсить прогу до того момента пока она не запуститься:
bpx GetTickCount

Теперь зажимаем F9 и ждем пока не загрузиться программа. В конце концов программа загрузиться и мы зациклимся на месте:

00524FA0 |. 8078 18 00 CMP BYTE PTR DS:[EAX+18],0
00524FA4 |. 74 6A JE SHORT jv16_Pow.00525010
00524FA6 |> E8 F525EEFF CALL <JMP.&KERNEL32.GetTickCount> ; [GetTickCount
00524FAB |. 84DB TEST BL,BL
00524FAD |. 75 49 JNZ SHORT jv16_Pow.00524FF8

Т.к. мы находимся в теле функции нам нужно из нее выйти чтобы узнать откуда она вызывается. Трэйсим по F8 до конца функции и выходим из нее:

0056D91B . /EB 1B JMP SHORT jv16_Pow.0056D938
0056D91D > |33C0 XOR EAX,EAX
0056D91F . |E8 7076FBFF CALL jv16_Pow.00524F94
0056D924 . |6A 64 PUSH 64 ; /Timeout = 100. ms
0056D926 . |E8 AD9DE9FF CALL <JMP.&KERNEL32.Sleep> ; \Sleep
0056D92B . |53 PUSH EBX ; /Arg2
0056D92C . |68 10D85600 PUSH jv16_Pow.0056D810 ; |Arg1 = 0056D810
0056D931 . |8BC3 MOV EAX,EBX ; |
0056D933 . |E8 8CB6EAFF CALL jv16_Pow.00418FC4 ; \jv16_Pow.00418FC4
0056D938 > \807B 0C 00 CMP BYTE PTR DS:[EBX+C],0
0056D93C . 75 0B JNZ SHORT jv16_Pow.0056D949
0056D93E . A1 F0605B00 MOV EAX,DWORD PTR DS:[5B60F0]
0056D943 . 8078 01 00 CMP BYTE PTR DS:[EAX+1],0
0056D947 .^ 74 D4 JE SHORT jv16_Pow.0056D91D ;переход который все ;время перепрыгивает на функцию - счетчик


Сдесь функция 00524F94 и есть та самая функция которая запускает счетчик во время выполнения программы. Чтобы эта функция не выполнилась достаточно заNOPить переход:

Было:
0056D947 .^ 74 D4 JE SHORT jv16_Pow.0056D91D

Стало:
0056D947 90 nop
0056D948 90 nop

Все! Программа полностью функциональна!

Хочу поблагодарить сайт CrackLab.ru и в особенности его создателя Bad_Guy. Спасибо также за DVD диск от cracklab, который по сей день является одним из лучших моих приобретений )). За статью сильно не ругайте)) это моя первая статья. Всем удачи и хорошего настроения!))




Обсуждение статьи: Взлом jv16 PowerTools. >>>


Комментарии к статье: Взлом jv16 PowerTools.

WildOne 04.10.2006 10:04:41
Во-первых, какая версия программы?
Во-вторых, на кого рассчитана статья? Если на новичков, то нужно описывать подробней: не только что делаешь но и почему.
В-третьих, свою версию (1.5.0.278) я взломал проще: оказывается что прога ищет в своей папке файлы в имени которых есть crack, .nfo и чо там еще. Если находит то выводит основное окно программы ( в независимости от триал периода). Это окно обладает единственным недостатком - оно неактивно. Отлавливаем EnableWindow и засылаем в параметр например ненулевой регистр. Осталось только исправить в заголовке DEMO VERSION на что-то более подходящее.
---
Soft_Ice 09.10.2006 18:34:49
А еще проще найти релиз 1.3RC2 - тогда автор был не так жаден и этот релиз был бесплатен. А функциональность абсолютно такая же.
---

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



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


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