Blog. Just Blog

Исследование защиты скринсейвера Skeleton

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот скринсейвера Skeleton
Скриншот скринсейвера Skeleton

Раскопал в старых архивах забавный скринсейвер Skeleton - на экране бодро марширует скелетик. Качество картинки, конечно, осталось в далеком прошлом, никакой корректировки пропорций изображения не выполняется, но статья вовсе не об этом. Скринсейвер платный, только вот купить его все равно не получится, так как офсайт уже давно недоступен. Будем решать задачу другими методами.

Забираем с файлообменника дистрибутив, устанавливаем, смотрим. Признаки триальности пропустить невозможно - это уродливая надпись поперек экрана.

Триальная надпись
Триальная надпись

При попытке зарегистрировать скринсейвер левыми данными, вываливается вот такое сообщение. Отлично, точка отсчета у нас есть.

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Отправляем файл скринсейвера в дизассемблер, когда он закончит работу, поищем в листинге этот текст и условия, при котором появляется сообщение.
  1. CODE:0043B7D2                 push    eax             ; hDlg
  2. CODE:0043B7D3                 call    GetDlgItem
  3. CODE:0043B7D8                 push    eax             ; hWnd
  4. CODE:0043B7D9                 call    GetWindowTextA
  5. CODE:0043B7DE                 lea     edx, [ebp+var_4]
  6. CODE:0043B7E1                 lea     eax, [ebp+String]
  7. CODE:0043B7E7                 call    sub_40791C
  8. CODE:0043B7EC                 push    1F4h            ; nMaxCount
  9. CODE:0043B7F1                 lea     eax, [ebp+String]
  10. CODE:0043B7F7                 push    eax             ; lpString
  11. CODE:0043B7F8                 push    6               ; nIDDlgItem
  12. CODE:0043B7FA                 mov     eax, [ebp+hWnd]
  13. CODE:0043B7FD                 push    eax             ; hDlg
  14. CODE:0043B7FE                 call    GetDlgItem
  15. CODE:0043B803                 push    eax             ; hWnd
  16. CODE:0043B804                 call    GetWindowTextA
  17. CODE:0043B809                 lea     edx, [ebp+var_8]
  18. CODE:0043B80C                 lea     eax, [ebp+String]
  19. CODE:0043B812                 call    sub_40791C
  20. CODE:0043B817                 mov     edx, [ebp+var_8]
  21. CODE:0043B81A                 mov     eax, [ebp+var_4]
  22. ; Вызвать функцию проверки
  23. CODE:0043B81D                 call    sub_43A7F4
  24. ; Если AL=0, то регистрация неправильная
  25. CODE:0043B822                 test    al, al
  26. ; Вывести сообщение о неправильной регистрации
  27. CODE:0043B824                 jz      short loc_43B86E
  28. CODE:0043B826                 mov     eax, offset dword_443B34
  29. CODE:0043B82B                 mov     edx, [ebp+var_4]
  30. CODE:0043B82E                 call    sub_403878
  31. CODE:0043B833                 mov     eax, offset dword_443B38
  32. CODE:0043B838                 mov     edx, [ebp+var_8]
  33. CODE:0043B83B                 call    sub_403878
  34. CODE:0043B840                 lea     eax, [ebp+var_4]
  35. CODE:0043B843                 mov     ecx, ds:dword_443B34
  36. CODE:0043B849                 mov     edx, offset aThankYouForReg
  37. ; "Thank you for registering.\rNow this sof"...
  38. CODE:0043B84E                 call    sub_403AEC
  39. CODE:0043B853                 push    40h             ; uType
  40. CODE:0043B855                 push    offset aSuccess ; "Success"
  41. CODE:0043B85A                 mov     eax, [ebp+var_4]
  42. CODE:0043B85D                 call    sub_403C64
  43. CODE:0043B862                 push    eax             ; lpText
  44. CODE:0043B863                 mov     eax, [ebp+hWnd]
  45. CODE:0043B866                 push    eax             ; hWnd
  46. CODE:0043B867                 call    MessageBoxA_0
  47. CODE:0043B86C                 jmp     short loc_43B896
  48. CODE:0043B86E ; --------------------------------------
  49. CODE:0043B86E loc_43B86E:
  50. CODE:0043B86E                 lea     eax, [ebp+var_4]
  51. CODE:0043B871                 mov     edx, offset aNameOrRegistra
  52. ; "Name or Registration Key are not correc"...
  53. CODE:0043B876                 call    sub_4038BC
  54. CODE:0043B87B                 push    10h             ; uType
  55. CODE:0043B87D                 push    offset aError_1 ; "Error"
  56. CODE:0043B882                 mov     eax, [ebp+var_4]
  57. CODE:0043B885                 call    sub_403C64
  58. CODE:0043B88A                 push    eax             ; lpText
  59. CODE:0043B88B                 mov     eax, [ebp+hWnd]
  60. CODE:0043B88E                 push    eax             ; hWnd
  61. CODE:0043B88F                 call    MessageBoxA_0
Классика жанра. Вызывается функция проверки, если она вернула AL=0, то регистрационные данные либо отсутствуют, либо неправильные. Посмотрим на функцию проверки.
  1. CODE:0043A7F4 sub_43A7F4      proc near
  2. CODE:0043A7F4                 push    ebp
  3. CODE:0043A7F5                 mov     ebp, esp
  4. CODE:0043A7F7                 add     esp, 0FFFFFFF0h
  5. CODE:0043A7FA                 push    ebx
  6. CODE:0043A7FB                 xor     ecx, ecx
  7. CODE:0043A7FD                 mov     [ebp+var_C], ecx
  8. CODE:0043A800                 mov     [ebp+var_10], ecx
  9. CODE:0043A803                 mov     [ebp+var_8], edx
  10. CODE:0043A806                 mov     [ebp+var_4], eax
  11. CODE:0043A809                 mov     eax, [ebp+var_4]
  12. CODE:0043A80C                 call    sub_403C54
  13. CODE:0043A811                 mov     eax, [ebp+var_8]
  14. CODE:0043A814                 call    sub_403C54
  15. CODE:0043A819                 xor     eax, eax
  16. CODE:0043A81B                 push    ebp
  17. CODE:0043A81C                 push    offset loc_43A880
  18. CODE:0043A821                 push    dword ptr fs:[eax]
  19. CODE:0043A824                 mov     fs:[eax], esp
  20. CODE:0043A827                 lea     eax, [ebp+var_10]
  21. CODE:0043A82A                 mov     edx, ds:off_443D44
  22. CODE:0043A830                 call    sub_403A44
  23. CODE:0043A835                 lea     eax, [ebp+var_10]
  24. CODE:0043A838                 mov     edx, ds:dword_443B30
  25. CODE:0043A83E                 mov     edx, [edx+0A2h]
  26. CODE:0043A844                 call    sub_403AA8
  27. CODE:0043A849                 mov     edx, [ebp+var_10]
  28. CODE:0043A84C                 lea     ecx, [ebp+var_C]
  29. CODE:0043A84F                 mov     eax, [ebp+var_4]
  30. CODE:0043A852                 call    sub_43A6FC
  31. ; Сравнение двух строк
  32. CODE:0043A857                 mov     eax, [ebp+var_C]
  33. CODE:0043A85A                 mov     edx, [ebp+var_8]
  34. CODE:0043A85D                 call    sub_403BB0
  35. ; Установить флаг по результату сравнения
  36. CODE:0043A862                 setz    bl
  37. CODE:0043A865                 xor     eax, eax
  38. CODE:0043A867                 pop     edx
  39. CODE:0043A868                 pop     ecx
  40. CODE:0043A869                 pop     ecx
  41. CODE:0043A86A                 mov     fs:[eax], edx
  42. CODE:0043A86D                 push    offset loc_43A887
  43. CODE:0043A872 loc_43A872:
  44. CODE:0043A872                 lea     eax, [ebp+var_10]
  45. CODE:0043A875                 mov     edx, 4
  46. CODE:0043A87A                 call    sub_403848
  47. CODE:0043A87F                 retn
  48. CODE:0043A880 loc_43A880:
  49. CODE:0043A880                 jmp     loc_4032E4
  50. CODE:0043A885                 jmp     short loc_43A872
  51. CODE:0043A887 loc_43A887:
  52. CODE:0043A887                 mov     eax, ebx
  53. CODE:0043A889                 pop     ebx
  54. CODE:0043A88A                 mov     esp, ebp
  55. CODE:0043A88C                 pop     ebp
  56. CODE:0043A88D                 retn
  57. CODE:0043A88D sub_43A7F4      endp
На вход подается регистрационное имя и введенный серийник, затем выполняются некоторые манипуляции и по итогу все сводится к обычному сравнению строк. Самый простой вариант лечения - пропатчить функцию проверки, чтобы она всегда возвращала AL=1. Способов для этого точно не один, разберетесь сами. Но давайте лучше попробуем подобрать правильный серийник. Для этого открываем настройки скринсейвера и цепляемся к процессу отладчиком. Ставим точку останова на начало функции проверки по адресу 0043A7F4 и пробуем зарегистрировать программу какими-нибудь левыми данными. Когда точка останова сработает, трассируем программу в пошаговом режиме до сравнения строк.

Указатели на строки в регистрах
Указатели на строки в регистрах

Перед сравнением в регистрах EAX и EDX находятся указатели на две строки: это наш левый серийник и правильный, с которым выполняется сравнение. Так для имени "MANHUNTER / PCL" правильный серийник будет "A2A71200". Выходим из отладчика, снова открываем настройки и повторяем регистрацию с найденными данными.

Программа успешно зарегистрирована
Программа успешно зарегистрирована

Программа благодарит за регистрацию, уродливая надпись пропала. Значит все сделано правильно.

Программа успешно зарегистрирована
Программа успешно зарегистрирована

Вот и все, цель достигнута. Можно немного поностальгировать и удалить скринсейвер, потому что в современных условиях им пользоваться просто нереально.

Поделиться ссылкой ВКонтакте
Просмотров: 209 | Комментариев: 1

Комментарии

Отзывы посетителей сайта о статье
user (27.11.2024 в 19:57):
;----------------------------------skeleton.CRK
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

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0045 сек.) / Память: 4.5 Mb
Наверх