Исследование Hollywood Screenplay v2.15Description : [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 (поиск файлов). Вводим:
Маска В результате находится один файл 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: 0010BBFhOffset - это смещение команды в файле, его надо записать на бумажку (или запомнить) :-))) Теперь 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'ом. Было: 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. Программа запускается !!! |