Исследование защиты программы Screen Calipers
Скриншот программы Screen Calipers
Screen Calipers - отличный помощник для дизайнеров и программистов, разрабатывающих интерфейсы. Это что-то вроде виртуального штангенциркуля, который позволяет с точностью до пиксела измерять любые расстояния и размеры любых элементов на экране. Внешний вид измерительного инструмента изменяется при помощи скинов. Но по какой-то непонятной причине за полноценную работу с этой программой требуется выложить некоторую сумму вечнозеленых денег.
Скачиваем дистрибутив, устанавливаем, смотрим. Основной исполняемый файл упакован UPX, перед началом исследований распаковываем его самим же UPX. После этого отправляем распакованный файл в дизассемблер. Попутно выясним, какие есть ограничения у незарегистрированной версии.
Сообщение незарегистрированной программы
В splash-окне написано, что это невозможность отключить сам splash, невозможность устанавливать прозрачность и ограничение по углам поворота инструмента.
Окно регистрации программы
Поиск в файле по строке "serial number" выводит нас на вот такое интересное сообщение:
Строки в файле
Или эти строки относятся к проверке введенного серийного номера, или я ничего не понимаю в этой жизни. Посмотрим в дизассемблере на место, где эти строки используются. Переход по перекрестным ссылкам выводит нас на достаточно объемную процедуру проверки серийного номера. Разберем ее по шагам.
Первая проверка - подсчет количества попыток регистрации. Дается не более пяти попыток, но это, конечно, легко патчится или обходится под отладчиком.
Code (Assembler) : Убрать нумерацию
- CODE:004D6900 call sub_404A64
- CODE:004D6905 inc ds:dword_5064F0
- CODE:004D690B cmp ds:dword_5064F0, 5
- CODE:004D6912 jle short loc_4D692A
- CODE:004D6914 mov eax, offset aYouHaveAttempt
- ; "You have attempted to check your serial"...
- CODE:004D6919 call sub_43CD30
- CODE:004D691E mov eax, ds:off_4E4474
- CODE:004D6923 mov eax, [eax]
- CODE:004D6925 call sub_4658D0
Code (Assembler) : Убрать нумерацию
- CODE:004D693C mov eax, [ebp+var_4]
- CODE:004D693F call sub_404C8C
- CODE:004D6944 cmp eax, 0Eh
- CODE:004D6947 jnz loc_4D6ABB
- CODE:004D694D lea eax, [ebp+var_20]
- CODE:004D6950 push eax
Code (Assembler) : Убрать нумерацию
- CODE:004D6958 mov eax, [ebp+var_4]
- CODE:004D695B call sub_404EEC
- CODE:004D6960 mov eax, [ebp+var_20]
- CODE:004D6963 mov edx, offset a81 ; "81"
- CODE:004D6968 call sub_404DD8
- CODE:004D696D jz short loc_4D6995
- CODE:004D696F lea eax, [ebp+var_24]
- CODE:004D6972 push eax
- CODE:004D6973 mov ecx, 2
- CODE:004D6978 xor edx, edx
- CODE:004D697A mov eax, [ebp+var_4]
- CODE:004D697D call sub_404EEC
- CODE:004D6982 mov eax, [ebp+var_24]
- CODE:004D6985 mov edx, offset a82 ; "82"
- CODE:004D698A call sub_404DD8
- CODE:004D698F jnz loc_4D6ABB
Code (Assembler) : Убрать нумерацию
- CODE:004D69FF push 0
- CODE:004D6A01 push 0Ah
- CODE:004D6A03 mov eax, [ebp+var_10]
- CODE:004D6A06 mov edx, [ebp+var_C]
- CODE:004D6A09 call sub_405A40
- CODE:004D6A0E add ebx, eax
- CODE:004D6A10 push 0
- CODE:004D6A12 push 0Ah
- CODE:004D6A14 mov eax, [ebp+var_10]
- CODE:004D6A17 mov edx, [ebp+var_C]
- CODE:004D6A1A push edx
- CODE:004D6A1B push eax
- CODE:004D6A1C push 0
- CODE:004D6A1E push 0Ah
- CODE:004D6A20 mov eax, [ebp+var_10]
- CODE:004D6A23 mov edx, [ebp+var_C]
- CODE:004D6A26 call sub_405A40
- CODE:004D6A2B sub [esp+74h+var_74], eax
- CODE:004D6A2E sbb [esp+74h+var_70], edx
- CODE:004D6A32 pop eax
- CODE:004D6A33 pop edx
- CODE:004D6A34 call sub_4059AC
- CODE:004D6A39 mov [ebp+var_10], eax
- CODE:004D6A3C mov [ebp+var_C], edx
- CODE:004D6A3F push 0
- CODE:004D6A41 push 0Ah
- CODE:004D6A43 mov eax, [ebp+var_10]
- CODE:004D6A46 mov edx, [ebp+var_C]
- CODE:004D6A49 call sub_405A40
- CODE:004D6A4E mov esi, eax
- CODE:004D6A50 add esi, esi
- CODE:004D6A52 cmp esi, 9
- CODE:004D6A55 jle short loc_4D6A60
- CODE:004D6A57 add esi, ebx
- CODE:004D6A59 sub esi, 9
- CODE:004D6A5C mov ebx, esi
- CODE:004D6A5E jmp short loc_4D6A62
- CODE:004D6A60 ; --------------------------------------
- CODE:004D6A60 loc_4D6A60:
- CODE:004D6A60 add ebx, esi
- CODE:004D6A62 loc_4D6A62:
- CODE:004D6A62 push 0
- CODE:004D6A64 push 0Ah
- CODE:004D6A66 mov eax, [ebp+var_10]
- CODE:004D6A69 mov edx, [ebp+var_C]
- CODE:004D6A6C push edx
- CODE:004D6A6D push eax
- CODE:004D6A6E push 0
- CODE:004D6A70 push 0Ah
- CODE:004D6A72 mov eax, [ebp+var_10]
- CODE:004D6A75 mov edx, [ebp+var_C]
- CODE:004D6A78 call sub_405A40
- CODE:004D6A7D sub [esp+74h+var_74], eax
- CODE:004D6A80 sbb [esp+74h+var_70], edx
- CODE:004D6A84 pop eax
- CODE:004D6A85 pop edx
- CODE:004D6A86 call sub_4059AC
- CODE:004D6A8B mov [ebp+var_10], eax
- CODE:004D6A8E mov [ebp+var_C], edx
Code (Assembler) : Убрать нумерацию
- CODE:004D6AA9 mov eax, ebx
- CODE:004D6AAB mov ecx, 3Ah
- CODE:004D6AB0 cdq
- CODE:004D6AB1 idiv ecx
- CODE:004D6AB3 test edx, edx
- CODE:004D6AB5 jnz short loc_4D6ABB
Программа успешно зарегистрирована
Программа благодарит за регистрацию. Все ограничения на поворот и прозрачность также благополучно исчезают. Цель достигнута. Генератор ключей вы теперь можете написать самостоятельно.
Просмотров: 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
Добавить комментарий
Заполните форму для добавления комментария