[CRACKING] [MISC.] [DOWNLOADS] [LINKS] [CONTACTS]

Взлом и защита программного обеспечения

 

 Взлом скринсэйвера

Christmаs Timе 3D Screеnsaver 1.0 [4.06 МБ    ] диск ][ за январь 2005 (или за декабрь 2004;)
W32Dasm v9.0b                     [315  KB-ZIP] http://biocyborg.narod.ru/W32dsm9b.zip 
HIEW v6.81                        [703  KB-ZIP] http://biocyborg.narod.ru/soft/Hiew.zip

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

  Чем отличается процесс  взлома скринсэйвера от взлома обычной программы? Да практически ничем! .scr-файл можно и дизассемблировать, и исследовать в отладчике, и править в HEX-редакторе... Скринсэйверы, как и обычные программы, могут быть сжаты каким-нибудь упаковщиком или защищены протектором типа ASProtect.

  Но в этот раз все оказалось просто: .scr-файл был ничем не обработан, поэтому я сразу приступил к доработке системы защиты этой красивой, но, IMHO, совершенно бесполезной программы;). Проблема заключалась в том, что незарегистрированная версия через 60 секунд работы (которые, кстати, отсчитывались в левом верхнем углу экрана) начинала показывать поверх рождественской картинки большое окно с требованием отправиться на сайт разработчика и зарегистрироваться, а в окне настроек скринсэйвера светилась раздразающая надпись "UNREGISTERED" и предлагалось нажать кнопку "Register...", чтобы ввести имя и рег. код.

  Я дизассеблировал файл Christmаs Time 3D Scrеensaver.scr в Win32Dasm и стал изучать список "String Data References". В середине списка мне попалась интересная строка "Registration name or registration code is incorrect ", после которой почти сразу шла строка "Thank you for purchase!". Эти строки, безусловно, относятся к процедуре регистрации, поэтому я решил перейти к месту, где они вызываются:

:00407DD4 8B4DC8                  mov ecx, dword ptr [ebp-38]
:00407DD7 51                      push ecx
:00407DD8 E8204A0000              call 0040C7FD
:00407DDD 83C404                  add esp, 00000004
:00407DE0 25FF000000              and eax, 000000FF
:00407DE5 85C0                    test eax, eax
:00407DE7 7444                    je 00407E2D
:00407DE9 8B1530B14B00            mov edx, dword ptr [004BB130]
:00407DEF C682B114000001          mov byte ptr [edx+000014B1], 01
:00407DF6 6A00                    push 00000000
* Possible Reference to Dialog:  
                                  |
:00407DF8 68F0F64A00              push 004AF6F0
* Possible StringData Ref from Data Obj ->"Thank you for purchase!"
                                  |
:00407DFD 6800F74A00              push 004AF700
:00407E02 8B4508                  mov eax, dword ptr [ebp+08]
:00407E05 50                      push eax
               <-вырезан участок кода->
* Possible StringData Ref from Data Obj ->"Registration"
                                  |
:00407E3B 6818F74A00              push 004AF718
* Possible StringData Ref from Data Obj ->"Registration name or registration "
                                        ->"code is incorrect."
                                  |
:00407E40 6828F74A00              push 004AF728
:00407E45 8B4D08                  mov ecx, dword ptr [ebp+08]
:00407E48 51                      push ecx

 Из листинга видно, что по адресу  407DE5 стоит проверка значения регистра еах, в зависимости от результатов которой программа примет рег. данные или не примет. Наиболее вероятно, что значение регистра еах задается процедурой, вызываемой по адресу 00407DD8. Посмотрим, что там можно изменить ;):

* Referenced by a CALL at Addresses:
|:00407686   , :00407DD8   
|
:0040C7FD 55                      push ebp
:0040C7FE 8BEC                    mov ebp, esp
:0040C800 83EC6C                  sub esp, 0000006C
:0040C803 56                      push esi
:0040C804 57                      push edi
:0040C805 837D0800                cmp dword ptr [ebp+08], 00000000
:0040C809 7507                    jne 0040C812
:0040C80B 32C0                    xor al, al
:0040C80D E911010000              jmp 0040C923

  Эта процедура вызывается в программе 2 раза: при запуске (вызывается по адресу  00407686) и при проверке рег. данных в процессе регистрации (с адреса 00407DD8). Причем, в первом случае происходит считывание информации из реестра (HKEY_CURRENT_USER\Software\TERMINAL Studio\Christmаs Time 3D Screеnsaver). Все это я узнал, изучив участок кода, на который можно перейти, вбив в окне "Go to Code location" (Shift+F12) дизассемблера адрес 407686. Чтобы программа считала себя зарегистрированной можно начиная с адреса .40C7FD ассемблировать следующее:

mov   eax,1
ret

  Теперь надоедливое окно с просьбой о регистрации никогда не появится :). Чтобы в окне настроек скринсэйвера отображалось имя крякера, нужно в реестре по адресу HKEY_CURRENT_USER\Software\TERMINAL Studio\Christmаs Time 3D Scrеensaver создать DWORD параметр с именем RegName (это можно сделать с помощью стандартного редактора реестра regedit.exe). Затем щелкнуть на созданном имени правой кнопкой и выбрать пункт  "Изменить двоичные данные". В открывшемся окошке в правом столбце можно вписать свое имя.

  В заключении хочу дать совет тем, кто надумает "вручную" сделать патч для этой программы. Чтобы долго не возиться, вбивая адреса и байты, которые нужно пропатчить, рекомендую воспользоваться одним из патчмейкеров, умеющих генерировать исходники патчей, после чего можно просто скопировать отвечающий за пропатчивание код в исходный текст своего патча. Исходники для Delphi умеет создавать Patcher Generator v1.1, а любители ассемблера могут воспользоваться программой uNivErsaL PatCheR.

Информация приведена исключительно для ознакомления. Применение данной информации в незаконных целях категорически запрещается.

© BioCyborG, 2005

 © BioCyborG
www.biocyborg.narod.ru

Hosted by uCoz