Исследование защиты программы Web Button Menu Maker
Скриншот программы Web Button Menu Maker
Программа Web Button Menu Maker предназначена для быстрого создания комплекта стильных кнопок и менюшек для сайтов. Все делается буквально за несколько кликов мышкой. Выбираете понравившийся шаблон и штампуете нужные вам кнопки, меняя только надписи на них. Незарегистрированная версия добавляет на готовые изображения надпись "Trial", что сводит все плюсы программы к нулю. Попробуем исправить это досадное недоразумение.
Устанавливаем программу из дистрибутива, запускаем, смотрим. Первым делом нам надо определить вектор атаки. При старте программы открывается окно с предложением ее зарегистрировать, а на ввод неправильного серийного номера нам покажут вот такое сообщение:
Сообщение о неправильной регистрации
Вот с него и начнем. Исполняемый файл ничем не упакован, строка легко находится обычным поиском. Если обратите внимание, то там же рядом есть строка с благодарностью, по всей видимости за успешную регистрацию.
Строка сообщения в файле
В дизассемблере посмотрим, где эти строки используются. Код простой и понятный:
Code (Assembler) : Убрать нумерацию
- CODE:004D3560 mov eax, [ebp+var_C]
- CODE:004D3563 pop edx
- CODE:004D3564 call sub_4D2B8C
- ; Вызвать функцию проверки серийного номера
- CODE:004D3569 call sub_4D2CA8
- ; Сохранить результат проверки из EAX в переменную по указателю EDX
- CODE:004D356E mov edx, ds:off_506104
- CODE:004D3574 mov [edx], eax
- CODE:004D3576 mov eax, ds:off_506104
- ; Проверить переменную на 0
- CODE:004D357B cmp dword ptr [eax], 0
- ; Если она равна 0, то введенный серийный номер неправильный
- CODE:004D357E jz short loc_4D35A1
- CODE:004D3580 push 0
- CODE:004D3582 mov cx, word_4D35F0
- CODE:004D3589 mov dl, 2
- ; Сообщение об успешной регистрации
- CODE:004D358B mov eax, offset aThanksForChoos
- ; "Thanks for choosing MTop Web Button Men"...
- CODE:004D3590 call sub_435584
- CODE:004D3595 mov dword ptr [ebx+24Ch], 1
- CODE:004D359F jmp short loc_4D35B6
- CODE:004D35A1 ; --------------------------------------
- CODE:004D35A1 loc_4D35A1:
- ; Сообщение о неправильной регистрации
- CODE:004D35A1 push 0
- CODE:004D35A3 mov cx, word_4D35F0
- CODE:004D35AA mov dl, 2
- CODE:004D35AC mov eax, offset aInvalidUsernam
- ; "Invalid username or registration code!"
- CODE:004D35B1 call sub_435584
Code (Assembler) : Убрать нумерацию
- CODE:004D2CA8 push ebp
- CODE:004D2CA9 mov ebp, esp
- CODE:004D2CAB add esp, 0FFFFFFE0h
- CODE:004D2CAE xor eax, eax
- CODE:004D2CB0 mov [ebp+var_8], eax
- CODE:004D2CB3 mov [ebp+var_C], eax
- CODE:004D2CB6 xor eax, eax
- CODE:004D2CB8 push ebp
- CODE:004D2CB9 push offset loc_4D2E61
- CODE:004D2CBE push dword ptr fs:[eax]
- CODE:004D2CC1 mov fs:[eax], esp
- CODE:004D2CC4 lea eax, [ebp+var_8]
- CODE:004D2CC7 call sub_4042AC
- CODE:004D2CCC lea eax, [ebp+var_C]
- CODE:004D2CCF call sub_4042AC
- CODE:004D2CD4 mov dl, 1
- CODE:004D2CD6 mov eax, off_43D3AC
- CODE:004D2CDB call sub_43D4AC
- CODE:004D2CE0 mov [ebp+var_10], eax
- CODE:004D2CE3 xor eax, eax
- CODE:004D2CE5 push ebp
- CODE:004D2CE6 push offset loc_4D2D4F
- CODE:004D2CEB push dword ptr fs:[eax]
- CODE:004D2CEE mov fs:[eax], esp
- CODE:004D2CF1 mov edx, 80000001h
- CODE:004D2CF6 mov eax, [ebp+var_10]
- CODE:004D2CF9 call sub_43D54C
- CODE:004D2CFE xor ecx, ecx
- CODE:004D2D00 mov edx, offset aSoftwareMina_0
- ; "\\Software\\MinAirSoft\\BMM"
- CODE:004D2D05 mov eax, [ebp+var_10]
- CODE:004D2D08 call sub_43D5B0
- CODE:004D2D0D test al, al
- CODE:004D2D0F jz short loc_4D2D39
- CODE:004D2D11 lea ecx, [ebp+var_8]
- CODE:004D2D14 mov edx, offset aUsername_0 ; "Username"
- CODE:004D2D19 mov eax, [ebp+var_10]
- CODE:004D2D1C call sub_43D778
- CODE:004D2D21 lea ecx, [ebp+var_C]
- CODE:004D2D24 mov edx, offset aCode_0 ; "Code"
- CODE:004D2D29 mov eax, [ebp+var_10]
- CODE:004D2D2C call sub_43D778
- CODE:004D2D31 mov eax, [ebp+var_10]
- CODE:004D2D34 call sub_43D51C
Программа успешно "зарегистрирована"
Назойливое окно регистрации при старте программы пропало, надпись "Trial" к тексту кнопки не добавляется. Цель достигнута! Время на все исследование составило несколько минут, тогда как на написание этой статьи - больше часа.
Просмотров: 4998 | Комментариев: 9
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(10.06.2019 в 14:20):
xussr, маловато восклицательных знаков, чтобы бежать исправлять то, чего исправлять не надо.
xussr
(10.06.2019 в 11:00):
Опечатка поправь не EAX а MOV AL,1 и RET !!!!!!!
DagalProject
(04.02.2014 в 22:26):
Спасибо большое за советы, буду дальше учиться и набираться опытом.
Olala
(04.02.2014 в 20:41):
Все отлично пропатчилось, ничего не спрашивает.
ManHunter
(04.02.2014 в 15:51):
Плюсую, даже добавить нечего.
Anonymous
(04.02.2014 в 15:51):
DagalProject, это означает лишь то, что функция проверки вызывается не только при попытке регистрации, но и при запуске программы. Т.е. вызывается она в нескольких местах, поэтому патчить лучше именно саму функцию проверки, а не проверку результата ее работы.
Вообще, почти всегда выгоднее сделать так, чтобы функция проверки возвращала "правильное" значение. "Выгоднее" означает, что так вы потратите меньше времени, нежели выискивая все места в коде, где эта проверка используется. Причем, это еще простой случай. Бывает, что автор программы вызывает эту проверку из десятка самых разных мест. Например, при запуске, при добавлении надписи на кнопку, при сохранении файла. В таком случае, вы просто замучаетесь патчить условные переходы, да еще и рискуете какой-то пропустить, получив при этом полурабочий кряк.
Вообще, почти всегда выгоднее сделать так, чтобы функция проверки возвращала "правильное" значение. "Выгоднее" означает, что так вы потратите меньше времени, нежели выискивая все места в коде, где эта проверка используется. Причем, это еще простой случай. Бывает, что автор программы вызывает эту проверку из десятка самых разных мест. Например, при запуске, при добавлении надписи на кнопку, при сохранении файла. В таком случае, вы просто замучаетесь патчить условные переходы, да еще и рискуете какой-то пропустить, получив при этом полурабочий кряк.
DagalProject
(04.02.2014 в 14:11):
ManHunter! Мои способы хоть и выводят сообщения о правильной регистрации, но увы, при открытии программа просит пройти повторно регистрацию. Значит у меня еще недостаточно опыта.
ManHunter
(03.02.2014 в 21:25):
Путей обхода всегда может быть несколько. Если после твоего патча пропала надпись Trial и не показывается окно при старте, значит твой вариант тоже правильный.
DagalProject
(03.02.2014 в 19:42):
ManHanter спасибо за ваши статьи, я только учусь и поэтому у меня вопрос. Можно было бы пачить функцию по адресу 004D357B на значение "1" или функцию по адресу 004D357E просто заNOPить или ставить jmp на сообщение о правильной регистрации, то результат был такой же или нет.Спасибо.
Добавить комментарий
Заполните форму для добавления комментария