Исследование защиты скринсейвера Skeleton
Скриншот скринсейвера Skeleton
Раскопал в старых архивах забавный скринсейвер Skeleton - на экране бодро марширует скелетик. Качество картинки, конечно, осталось в далеком прошлом, никакой корректировки пропорций изображения не выполняется, но статья вовсе не об этом. Скринсейвер платный, только вот купить его все равно не получится, так как офсайт уже давно недоступен. Будем решать задачу другими методами.
Забираем с файлообменника дистрибутив, устанавливаем, смотрим. Признаки триальности пропустить невозможно - это уродливая надпись поперек экрана.
Триальная надпись
При попытке зарегистрировать скринсейвер левыми данными, вываливается вот такое сообщение. Отлично, точка отсчета у нас есть.
Сообщение о неправильной регистрации
Отправляем файл скринсейвера в дизассемблер, когда он закончит работу, поищем в листинге этот текст и условия, при котором появляется сообщение.
Code (Assembler) : Убрать нумерацию
- CODE:0043B7D2 push eax ; hDlg
- CODE:0043B7D3 call GetDlgItem
- CODE:0043B7D8 push eax ; hWnd
- CODE:0043B7D9 call GetWindowTextA
- CODE:0043B7DE lea edx, [ebp+var_4]
- CODE:0043B7E1 lea eax, [ebp+String]
- CODE:0043B7E7 call sub_40791C
- CODE:0043B7EC push 1F4h ; nMaxCount
- CODE:0043B7F1 lea eax, [ebp+String]
- CODE:0043B7F7 push eax ; lpString
- CODE:0043B7F8 push 6 ; nIDDlgItem
- CODE:0043B7FA mov eax, [ebp+hWnd]
- CODE:0043B7FD push eax ; hDlg
- CODE:0043B7FE call GetDlgItem
- CODE:0043B803 push eax ; hWnd
- CODE:0043B804 call GetWindowTextA
- CODE:0043B809 lea edx, [ebp+var_8]
- CODE:0043B80C lea eax, [ebp+String]
- CODE:0043B812 call sub_40791C
- CODE:0043B817 mov edx, [ebp+var_8]
- CODE:0043B81A mov eax, [ebp+var_4]
- ; Вызвать функцию проверки
- CODE:0043B81D call sub_43A7F4
- ; Если AL=0, то регистрация неправильная
- CODE:0043B822 test al, al
- ; Вывести сообщение о неправильной регистрации
- CODE:0043B824 jz short loc_43B86E
- CODE:0043B826 mov eax, offset dword_443B34
- CODE:0043B82B mov edx, [ebp+var_4]
- CODE:0043B82E call sub_403878
- CODE:0043B833 mov eax, offset dword_443B38
- CODE:0043B838 mov edx, [ebp+var_8]
- CODE:0043B83B call sub_403878
- CODE:0043B840 lea eax, [ebp+var_4]
- CODE:0043B843 mov ecx, ds:dword_443B34
- CODE:0043B849 mov edx, offset aThankYouForReg
- ; "Thank you for registering.\rNow this sof"...
- CODE:0043B84E call sub_403AEC
- CODE:0043B853 push 40h ; uType
- CODE:0043B855 push offset aSuccess ; "Success"
- CODE:0043B85A mov eax, [ebp+var_4]
- CODE:0043B85D call sub_403C64
- CODE:0043B862 push eax ; lpText
- CODE:0043B863 mov eax, [ebp+hWnd]
- CODE:0043B866 push eax ; hWnd
- CODE:0043B867 call MessageBoxA_0
- CODE:0043B86C jmp short loc_43B896
- CODE:0043B86E ; --------------------------------------
- CODE:0043B86E loc_43B86E:
- CODE:0043B86E lea eax, [ebp+var_4]
- CODE:0043B871 mov edx, offset aNameOrRegistra
- ; "Name or Registration Key are not correc"...
- CODE:0043B876 call sub_4038BC
- CODE:0043B87B push 10h ; uType
- CODE:0043B87D push offset aError_1 ; "Error"
- CODE:0043B882 mov eax, [ebp+var_4]
- CODE:0043B885 call sub_403C64
- CODE:0043B88A push eax ; lpText
- CODE:0043B88B mov eax, [ebp+hWnd]
- CODE:0043B88E push eax ; hWnd
- CODE:0043B88F call MessageBoxA_0
Code (Assembler) : Убрать нумерацию
- CODE:0043A7F4 sub_43A7F4 proc near
- CODE:0043A7F4 push ebp
- CODE:0043A7F5 mov ebp, esp
- CODE:0043A7F7 add esp, 0FFFFFFF0h
- CODE:0043A7FA push ebx
- CODE:0043A7FB xor ecx, ecx
- CODE:0043A7FD mov [ebp+var_C], ecx
- CODE:0043A800 mov [ebp+var_10], ecx
- CODE:0043A803 mov [ebp+var_8], edx
- CODE:0043A806 mov [ebp+var_4], eax
- CODE:0043A809 mov eax, [ebp+var_4]
- CODE:0043A80C call sub_403C54
- CODE:0043A811 mov eax, [ebp+var_8]
- CODE:0043A814 call sub_403C54
- CODE:0043A819 xor eax, eax
- CODE:0043A81B push ebp
- CODE:0043A81C push offset loc_43A880
- CODE:0043A821 push dword ptr fs:[eax]
- CODE:0043A824 mov fs:[eax], esp
- CODE:0043A827 lea eax, [ebp+var_10]
- CODE:0043A82A mov edx, ds:off_443D44
- CODE:0043A830 call sub_403A44
- CODE:0043A835 lea eax, [ebp+var_10]
- CODE:0043A838 mov edx, ds:dword_443B30
- CODE:0043A83E mov edx, [edx+0A2h]
- CODE:0043A844 call sub_403AA8
- CODE:0043A849 mov edx, [ebp+var_10]
- CODE:0043A84C lea ecx, [ebp+var_C]
- CODE:0043A84F mov eax, [ebp+var_4]
- CODE:0043A852 call sub_43A6FC
- ; Сравнение двух строк
- CODE:0043A857 mov eax, [ebp+var_C]
- CODE:0043A85A mov edx, [ebp+var_8]
- CODE:0043A85D call sub_403BB0
- ; Установить флаг по результату сравнения
- CODE:0043A862 setz bl
- CODE:0043A865 xor eax, eax
- CODE:0043A867 pop edx
- CODE:0043A868 pop ecx
- CODE:0043A869 pop ecx
- CODE:0043A86A mov fs:[eax], edx
- CODE:0043A86D push offset loc_43A887
- CODE:0043A872 loc_43A872:
- CODE:0043A872 lea eax, [ebp+var_10]
- CODE:0043A875 mov edx, 4
- CODE:0043A87A call sub_403848
- CODE:0043A87F retn
- CODE:0043A880 loc_43A880:
- CODE:0043A880 jmp loc_4032E4
- CODE:0043A885 jmp short loc_43A872
- CODE:0043A887 loc_43A887:
- CODE:0043A887 mov eax, ebx
- CODE:0043A889 pop ebx
- CODE:0043A88A mov esp, ebp
- CODE:0043A88C pop ebp
- CODE:0043A88D retn
- CODE:0043A88D sub_43A7F4 endp
Указатели на строки в регистрах
Перед сравнением в регистрах EAX и EDX находятся указатели на две строки: это наш левый серийник и правильный, с которым выполняется сравнение. Так для имени "MANHUNTER / PCL" правильный серийник будет "A2A71200". Выходим из отладчика, снова открываем настройки и повторяем регистрацию с найденными данными.
Программа успешно зарегистрирована
Программа благодарит за регистрацию, уродливая надпись пропала. Значит все сделано правильно.
Программа успешно зарегистрирована
Вот и все, цель достигнута. Можно немного поностальгировать и удалить скринсейвер, потому что в современных условиях им пользоваться просто нереально.
Просмотров: 209 | Комментариев: 1
Метки: исследование защиты
Комментарии
Отзывы посетителей сайта о статье
Добавить комментарий
Заполните форму для добавления комментария
Skeleton screenSaver v.6.0
Set registerable
Skeleton.scr
.0043A862: 0F 31 ;00039C62:
.0043A863: 94 DB ;00039C63:
.0043A864: C3 43 ;00039C64:
Skip crc check when 1st run
Skeleton.scr
.0043A3FD: 24 00 ;000397FD:
.0043A411: 10 00 ;00039811:
;----------------------------------skeleton.CRK EOF