Blog. Just Blog

Исследование защиты программы Screen Calipers

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

Screen Calipers - отличный помощник для дизайнеров и программистов, разрабатывающих интерфейсы. Это что-то вроде виртуального штангенциркуля, который позволяет с точностью до пиксела измерять любые расстояния и размеры любых элементов на экране. Внешний вид измерительного инструмента изменяется при помощи скинов. Но по какой-то непонятной причине за полноценную работу с этой программой требуется выложить некоторую сумму вечнозеленых денег.

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

Сообщение незарегистрированной программы
Сообщение незарегистрированной программы

В splash-окне написано, что это невозможность отключить сам splash, невозможность устанавливать прозрачность и ограничение по углам поворота инструмента.

Окно регистрации программы
Окно регистрации программы

Поиск в файле по строке "serial number" выводит нас на вот такое интересное сообщение:

Строки в файле
Строки в файле

Или эти строки относятся к проверке введенного серийного номера, или я ничего не понимаю в этой жизни. Посмотрим в дизассемблере на место, где эти строки используются. Переход по перекрестным ссылкам выводит нас на достаточно объемную процедуру проверки серийного номера. Разберем ее по шагам.

Первая проверка - подсчет количества попыток регистрации. Дается не более пяти попыток, но это, конечно, легко патчится или обходится под отладчиком.
  1. CODE:004D6900                 call    sub_404A64
  2. CODE:004D6905                 inc     ds:dword_5064F0
  3. CODE:004D690B                 cmp     ds:dword_5064F0, 5
  4. CODE:004D6912                 jle     short loc_4D692A
  5. CODE:004D6914                 mov     eax, offset aYouHaveAttempt
  6. ; "You have attempted to check your serial"...
  7. CODE:004D6919                 call    sub_43CD30
  8. CODE:004D691E                 mov     eax, ds:off_4E4474
  9. CODE:004D6923                 mov     eax, [eax]
  10. CODE:004D6925                 call    sub_4658D0
Чуть дальше - подсчет длины строки серийного номера и сравнение его с константой 0Eh. Отлично, теперь мы знаем допустимую длину серийного номера.
  1. CODE:004D693C                 mov     eax, [ebp+var_4]
  2. CODE:004D693F                 call    sub_404C8C
  3. CODE:004D6944                 cmp     eax, 0Eh
  4. CODE:004D6947                 jnz     loc_4D6ABB
  5. CODE:004D694D                 lea     eax, [ebp+var_20]
  6. CODE:004D6950                 push    eax
Дальше лучше всего запустить программу под отладчиком, поставив точку останова на начало процедуры проверки серийника.
  1. CODE:004D6958                 mov     eax, [ebp+var_4]
  2. CODE:004D695B                 call    sub_404EEC
  3. CODE:004D6960                 mov     eax, [ebp+var_20]
  4. CODE:004D6963                 mov     edx, offset a81 ; "81"
  5. CODE:004D6968                 call    sub_404DD8
  6. CODE:004D696D                 jz      short loc_4D6995
  7. CODE:004D696F                 lea     eax, [ebp+var_24]
  8. CODE:004D6972                 push    eax
  9. CODE:004D6973                 mov     ecx, 2
  10. CODE:004D6978                 xor     edx, edx
  11. CODE:004D697A                 mov     eax, [ebp+var_4]
  12. CODE:004D697D                 call    sub_404EEC
  13. CODE:004D6982                 mov     eax, [ebp+var_24]
  14. CODE:004D6985                 mov     edx, offset a82 ; "82"
  15. CODE:004D698A                 call    sub_404DD8
  16. CODE:004D698F                 jnz     loc_4D6ABB
Две следующие проверки: два первых символа серийника поочередно сравниваются со строками "81" и "82". Это означает, что правильный серийный номер должен начинаться с одной из них. Дальше идет основной цикл:
  1. CODE:004D69FF                 push    0
  2. CODE:004D6A01                 push    0Ah
  3. CODE:004D6A03                 mov     eax, [ebp+var_10]
  4. CODE:004D6A06                 mov     edx, [ebp+var_C]
  5. CODE:004D6A09                 call    sub_405A40
  6. CODE:004D6A0E                 add     ebx, eax
  7. CODE:004D6A10                 push    0
  8. CODE:004D6A12                 push    0Ah
  9. CODE:004D6A14                 mov     eax, [ebp+var_10]
  10. CODE:004D6A17                 mov     edx, [ebp+var_C]
  11. CODE:004D6A1A                 push    edx
  12. CODE:004D6A1B                 push    eax
  13. CODE:004D6A1C                 push    0
  14. CODE:004D6A1E                 push    0Ah
  15. CODE:004D6A20                 mov     eax, [ebp+var_10]
  16. CODE:004D6A23                 mov     edx, [ebp+var_C]
  17. CODE:004D6A26                 call    sub_405A40
  18. CODE:004D6A2B                 sub     [esp+74h+var_74], eax
  19. CODE:004D6A2E                 sbb     [esp+74h+var_70], edx
  20. CODE:004D6A32                 pop     eax
  21. CODE:004D6A33                 pop     edx
  22. CODE:004D6A34                 call    sub_4059AC
  23. CODE:004D6A39                 mov     [ebp+var_10], eax
  24. CODE:004D6A3C                 mov     [ebp+var_C], edx
  25. CODE:004D6A3F                 push    0
  26. CODE:004D6A41                 push    0Ah
  27. CODE:004D6A43                 mov     eax, [ebp+var_10]
  28. CODE:004D6A46                 mov     edx, [ebp+var_C]
  29. CODE:004D6A49                 call    sub_405A40
  30. CODE:004D6A4E                 mov     esi, eax
  31. CODE:004D6A50                 add     esi, esi
  32. CODE:004D6A52                 cmp     esi, 9
  33. CODE:004D6A55                 jle     short loc_4D6A60
  34. CODE:004D6A57                 add     esi, ebx
  35. CODE:004D6A59                 sub     esi, 9
  36. CODE:004D6A5C                 mov     ebx, esi
  37. CODE:004D6A5E                 jmp     short loc_4D6A62
  38. CODE:004D6A60 ; --------------------------------------
  39. CODE:004D6A60 loc_4D6A60:
  40. CODE:004D6A60                 add     ebx, esi
  41. CODE:004D6A62 loc_4D6A62:
  42. CODE:004D6A62                 push    0
  43. CODE:004D6A64                 push    0Ah
  44. CODE:004D6A66                 mov     eax, [ebp+var_10]
  45. CODE:004D6A69                 mov     edx, [ebp+var_C]
  46. CODE:004D6A6C                 push    edx
  47. CODE:004D6A6D                 push    eax
  48. CODE:004D6A6E                 push    0
  49. CODE:004D6A70                 push    0Ah
  50. CODE:004D6A72                 mov     eax, [ebp+var_10]
  51. CODE:004D6A75                 mov     edx, [ebp+var_C]
  52. CODE:004D6A78                 call    sub_405A40
  53. CODE:004D6A7D                 sub     [esp+74h+var_74], eax
  54. CODE:004D6A80                 sbb     [esp+74h+var_70], edx
  55. CODE:004D6A84                 pop     eax
  56. CODE:004D6A85                 pop     edx
  57. CODE:004D6A86                 call    sub_4059AC
  58. CODE:004D6A8B                 mov     [ebp+var_10], eax
  59. CODE:004D6A8E                 mov     [ebp+var_C], edx
В статике тут не очень понятно, зато под отладчиком все прекрасно видно. Подсчет начинается с конца серийника. Цифры номера через одну, начиная с последней, просто суммируются. Цифры номера через одну, начиная с предпоследней, умножаются на 2. Если результат превышает 9, то из результата вычитается 9 и после этого он прибавляется к контрольному значению, если не превышает, то к контрольному значению прибавляется без изменений. Финальная проверка:
  1. CODE:004D6AA9                 mov     eax, ebx
  2. CODE:004D6AAB                 mov     ecx, 3Ah
  3. CODE:004D6AB0                 cdq
  4. CODE:004D6AB1                 idiv    ecx
  5. CODE:004D6AB3                 test    edx, edx
  6. CODE:004D6AB5                 jnz     short loc_4D6ABB
Контрольный результат делится на 3Ah, деление должно выполниться без остатка. Говоря проще, он должен равняться значению 3Ah. Такому серийнику, например, соответствует строка "82223344556767".

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

Программа благодарит за регистрацию. Все ограничения на поворот и прозрачность также благополучно исчезают. Цель достигнута. Генератор ключей вы теперь можете написать самостоятельно.

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

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Николай (07.08.2023 в 07:05):
Спасибо, для не программистов темный лес. Хорошо кто может такое делать.
Анрей (20.04.2021 в 18:35):
Огромное спасибо !
как подключусь обязательно попробую понять ход мыслей по нахождению ключа )
Толян (05.02.2018 в 23:20):
Спасибо вам ) Разблокировал
А (26.09.2016 в 03:18):
Молодец.
speedboy (07.03.2016 в 04:38):
good

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

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

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