RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Исследование Hollywood Screenplay v2.15


Description : [WIN] Hollywood Screenplay v2.15
Crack subject : NAG screen, Trial Limitation
Crack made by : Runtime_err0r
Crack made at : 26-11-2001
Comments : HollywoodScreenplay.com
Protection : (X)Beginner ( )Intermediate ( )Advanced ( )Expert
Time for hack : 00:10
Type of hack : Byte hack
Used packer : none
Used unpacker : none
File size : 1540096 bytes
Src language : Visual C++ 5.0
Price : Three kisses ;-)
Used tools : FAR v1.65, UN-PACK v2.2, HiEW v6.55, Win32Dasm v8.93
Under Music : Rammstein "Mutter"

Внимание !!!
Данная статья носит образовательный характер и предназначена для разработчиков программных защит.
Автор не несёт никакой ответственности за возможное использование материалов данной статьи в противозаконных целях.

Честно говоря, я не знаю, что это за программа и зачем она нужна. Говорят, в ней удобно писать сценарии :-)))
Что же касается защиты, то это типичная Trial'ка. Программа имеет ограничение на кол-во запусков (5 раз) и на кол-во дней (15). При зауске появляется NAG-screen, с двумя индикаторами, показывающими сколько раз (дней) прграмма использовалась и сколько осталось. Для продолжения работы надо нажать кнопку Use Program, которая после окончания испытательного срока становится неактивной. Щаз мы попытаемся это дело поправить ...
Итак, прежде всего, определим с чем мы имеем дело. Воспользуемся утилитой UN-PACK, чтобы определить наличие и тип упаковщика. Выполним команду:

UN-PACK -I Screen.exe

В результате выясняется, что прога написана на Visual C++ 5.0 и ничем не запакована. Теперь откроем файл Screen.exe кнопочкой F3 в FAR'е и поищем ключевое слово "Trial Days" (поиск - F7). Ничего не нашли ??? Ладно, выходим из просмотрщика и нажимаем Alt + F7 (поиск файлов). Вводим:

Маска
*.*
Содержащий текст:
Trial Days
Ставим галочку напротив
(*) Искать, начиная с текущей папки

В результате находится один файл Bullet.dll. Логично предположить, что вся защита находится в этой библиотеке, а программа только импортирует из неё нужные функции. Проверим эту гипотезу... Сделаем две копии файла Screen.exe - Screen.!!! (на всякий случай) и Screen.w32 (для дизассемблирования). Открываем файл Screen.w32 в W32Dasm, жмём на кнопочку Imp Fn чтобы получить список импортируемых функций. В списке находим модуль Bullet и видим, что из неё импортируется две функции: BCI_DoProtection и BCI_DoUpgrade. Нас должна заинтересовать первая. Тыкаем на неё мышкой несколько раз, чтобы найти все её вызовы, в результате видим, что она вызывается только один раз:

* Reference To: USER32.SendMessageA, Ord:0214h     
                |
:00410BAA FF1538174E00            Call dword ptr [004E1738]
:00410BB0 8D542414                lea edx, dword ptr [esp+14]
:00410BB4 8D442418                lea eax, dword ptr [esp+18]
:00410BB8 52                      push edx
:00410BB9 8D4C2414                lea ecx, dword ptr [esp+14]
:00410BBD 50                      push eax
:00410BBE 51                      push ecx

* Reference To: Bullet.BCI_DoProtection, Ord:0003h
                |
:00410BBF E81CC20900              Call 004ACDE0
:00410BC4 85C0                    test eax, eax
:00410BC6 745F                    je 00410C27
:00410BC8 837C241001              cmp dword ptr [esp+10], 00000001
:00410BCD 7558                    jne 00410C27
:00410BCF 8B442414                mov eax, dword ptr [esp+14]
:00410BD3 85C0                    test eax, eax
:00410BD5 751D                    jne 00410BF4
:00410BD7 8B442418                mov eax, dword ptr [esp+18]
:00410BDB 85C0                    test eax, eax
:00410BDD 7509                    jne 00410BE8
:00410BDF C6059007500002          mov byte ptr [00500790], 02
:00410BE6 EB26                    jmp 00410C0E
(Вообще-то в тексте присутствуют две ссылки на эту функцию, но вторая - в таблице импорта, она нас в данный момент не интересует)
Тыкаем мышкой в строку под номером 00410BBF и видим в нижней части экрана такой текст:
Code Data @: 00410BBF @Offset: 0010BBFh 
Offset - это смещение команды в файле, его надо записать на бумажку (или запомнить) :-))) Теперь W32Dasm можно закрыть - он нам больше не понадобится. Теперь откроем файл Screen.exe в HIEW32, жмём F4, выбираем HEX, теперь F5, вводим 10BBF (смещение), опять F4, выбираем Decode. При необходимости кнопками Alt + F1 и Ctrl + F1 добиваемся того, чтобы в верхней части экрана было следующая информация:
PE  00010BBF   32 
что в переводе на человеческий язык означает, что смещения - глобальные (без точки), а операдны - 32-разрядные. Теперь мы видим такую картину:
00010BB0: 8D542414                lea         edx,[esp][00014]
00010BB4: 8D442418                lea         eax,[esp][00018]
00010BB8: 52                      push        edx
00010BB9: 8D4C2414                lea         ecx,[esp][00014]
00010BBD: 50                      push        eax
00010BBE: 51                      push        ecx
00010BBF: E81CC20900              call        Bullet.3
00010BC4: 85C0                    test        eax,eax
00010BC6: 745F                    je          000010C27   -------- (2)
00010BC8: 837C241001              cmp         d,[esp][00010],001 ;"."
00010BCD: 7558                    jne         000010C27   -------- (3)
00010BCF: 8B442414                mov         eax,[esp][00014]
00010BD3: 85C0                    test        eax,eax
00010BD5: 751D                    jne         000010BF4   -------- (4)
00010BD7: 8B442418                mov         eax,[esp][00018]
00010BDB: 85C0                    test        eax,eax
00010BDD: 7509                    jne         000010BE8   -------- (5)
00010BDF: C6059007500002          mov         b,[000500790],002 ;"."
00010BE6: EB26                    jmps        000010C0E   -------- (6)
00010BE8: 83F801                  cmp         eax,001 ;"."
00010BEB: 7521                    jne         000010C0E   -------- (7)
00010BED: A290075000              mov         [000500790],al
00010BF2: EB1A                    jmps        000010C0E   -------- (8)
Первым делом надо забить NOP'ами call по адресу 10BBF. Жмём F3, вводим 5 раз код 90 (NOP), жмём F9 (сохранить изменения). Выходим из HIEW и запускаем прогу. И что мы видим ??? Я лично вижу окошечко:

Программа вызвала ошибку <нет данных> и будет закрыта

В чём же дело ? В Windows параметры функции передаются через стек, после чего вызываемая функция чистит его. Мы убрали вызов функции, в результате чего стек оказался несбалансированным и это превело к сбою в системе. Поэтому надо заодно заNOPить и три предыдущих команды PUSH. Теперь переведём часы на 20 дней вперёд и попробуем запустить прогу. Сообщение об ошибке теперь не появляется, но и программа не запускается. Теперь надо разобраться с подозрительными переходами, следующими за вызовом функции. Они оба указывают на оди и тот же адрес (000010C27) поэтому изменять их надо вместе. Все руководства по краку почему-то рекомендуют изменять в таких случаях код операции 74 на 75 (je на jne) и наоборот. Но это преведёт к тому, что алгоритм начнёт работать наоборот, т.е. если trial период закончился, то программа запустится, но если нет - то программа работать не станет. Поэтому менять ситуацию нужно радикально: если надо, чтобы jump выполнялся всегда, то je или jne следует заменить на jmps (в машинных кодах это будет 74XX или 75XX на EBXX). Если же надо, чтобы jump никогда не выполнялся, то команду следует или забить NOP'ами (74XX или 75XX меняем на 9090) или меняем адрес перехода на 00 (74XX или 75XX на 7400 или 7500). Этот момент следует пояснить - так как адрес перехода задаётся в виде смещения относитель следующей за командой перехода, то команда 7400 эквивалентна je [адрес следующей строки]. Таким образом, независимо от результата сравнения, программа продолжит своё выполнение с строки, следующей за jump'ом.
Теперь применим всю эту теорию на практике: изменим je, следующую за call'ом на команду безусловного перехода - программа не запускается, значит эти переходы ведут к выходу из программы и их надо "прибить", вот так:

     Было:

00010BB0: 8D542414                lea         edx,[esp][00014]
00010BB4: 8D442418                lea         eax,[esp][00018]
00010BB8: 52                      push        edx
00010BB9: 8D4C2414                lea         ecx,[esp][00014]
00010BBD: 50                      push        eax
00010BBE: 51                      push        ecx
00010BBF: E81CC20900              call        Bullet.3
00010BC4: 85C0                    test        eax,eax
00010BC6: 745F                    je          000010C27   -------- (2)
00010BC8: 837C241001              cmp         d,[esp][00010],001 ;"."
00010BCD: 7558                    jne         000010C27   -------- (3)
00010BCF: 8B442414                mov         eax,[esp][00014]
00010BD3: 85C0                    test        eax,eax
00010BD5: 751D                    jne         000010BF4   -------- (4)
00010BD7: 8B442418                mov         eax,[esp][00018]
00010BDB: 85C0                    test        eax,eax
00010BDD: 7509                    jne         000010BE8   -------- (5)
00010BDF: C6059007500002          mov         b,[000500790],002 ;"."
00010BE6: EB26                    jmps        000010C0E   -------- (6)

     Стало: 

00010BB0: 8D542414                lea         edx,[esp][00014]
00010BB4: 8D442418                lea         eax,[esp][00018]
00010BB8: 90                      nop
00010BB9: 8D4C2414                lea         ecx,[esp][00014]
00010BBD: 90                      nop
00010BBE: 90                      nop
00010BBF: 90                      nop
00010BC0: 90                      nop
00010BC1: 90                      nop
00010BC2: 90                      nop
00010BC3: 90                      nop
00010BC4: 85C0                    test        eax,eax
00010BC6: 7400                    je          000010BC8   -------- (1)
00010BC8: 837C241001              cmp         d,[esp][00010],001 ;"."
00010BCD: 7500                    jne         000010BCF   -------- (2)
00010BCF: 8B442414                mov         eax,[esp][00014]
00010BD3: 85C0                    test        eax,eax
00010BD5: 751D                    jne         000010BF4   -------- (3)
00010BD7: 8B442418                mov         eax,[esp][00018]
00010BDB: 85C0                    test        eax,eax
00010BDD: 7509                    jne         000010BE8   -------- (4)
00010BDF: C6059007500002          mov         b,[000500790],002 ;"."
00010BE6: EB26                    jmps        000010C0E   -------- (5)
Теперь запускаем прогу ещё раз.... NAG screen не появляется, прога работает !!!
P.S. Разумеется, это не единственный способ разрешения проблемы. В Интернете я нашёл кряк от группы Shock который патчит Bullet.dll, изменяя только один байт:
00006D86: 74 EB
что приводит к аналогичному результату. Теперь, я думаю, Вы сами сможете разобраться, как это работает.

P.P.S. Для особо ленивых - запустите программку Enable Button (где её взять я не пишу, захотите - найдёте ;-))) и ткните мышкой на неактивной кнопке Use Program. Программа запускается !!!


<= Вернуться к статьям


Rambler's Top100