Blog. Just Blog

Исследование защиты программы Web Button Menu Maker

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

Программа Web Button Menu Maker предназначена для быстрого создания комплекта стильных кнопок и менюшек для сайтов. Все делается буквально за несколько кликов мышкой. Выбираете понравившийся шаблон и штампуете нужные вам кнопки, меняя только надписи на них. Незарегистрированная версия добавляет на готовые изображения надпись "Trial", что сводит все плюсы программы к нулю. Попробуем исправить это досадное недоразумение.

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

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

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

Строка сообщения в файле
Строка сообщения в файле

В дизассемблере посмотрим, где эти строки используются. Код простой и понятный:
  1. CODE:004D3560                 mov     eax, [ebp+var_C]
  2. CODE:004D3563                 pop     edx
  3. CODE:004D3564                 call    sub_4D2B8C
  4. ; Вызвать функцию проверки серийного номера
  5. CODE:004D3569                 call    sub_4D2CA8
  6. ; Сохранить результат проверки из EAX в переменную по указателю EDX
  7. CODE:004D356E                 mov     edx, ds:off_506104
  8. CODE:004D3574                 mov     [edx], eax
  9. CODE:004D3576                 mov     eax, ds:off_506104
  10. ; Проверить переменную на 0
  11. CODE:004D357B                 cmp     dword ptr [eax], 0
  12. ; Если она равна 0, то введенный серийный номер неправильный
  13. CODE:004D357E                 jz      short loc_4D35A1
  14. CODE:004D3580                 push    0
  15. CODE:004D3582                 mov     cx, word_4D35F0
  16. CODE:004D3589                 mov     dl, 2
  17. ; Сообщение об успешной регистрации
  18. CODE:004D358B                 mov     eax, offset aThanksForChoos
  19. ; "Thanks for choosing MTop Web Button Men"...
  20. CODE:004D3590                 call    sub_435584
  21. CODE:004D3595                 mov     dword ptr [ebx+24Ch], 1
  22. CODE:004D359F                 jmp     short loc_4D35B6
  23. CODE:004D35A1 ; --------------------------------------
  24. CODE:004D35A1 loc_4D35A1:
  25. ; Сообщение о неправильной регистрации
  26. CODE:004D35A1                 push    0
  27. CODE:004D35A3                 mov     cx, word_4D35F0
  28. CODE:004D35AA                 mov     dl, 2
  29. CODE:004D35AC                 mov     eax, offset aInvalidUsernam
  30. ; "Invalid username or registration code!"
  31. CODE:004D35B1                 call    sub_435584
Вызывается функция проверки, небольшого пояснения требует обработка ее результатов. Обычно просто сравнивается регистр EAX, а тут он сперва заносится в какую-то переменную, которая потом снова загружается и сравнивается с нулевым значением. Похоже, что такой неоптимизированный код - это результат работы компилятора. По результатам сравнения выполняется переход на сообщение об успешной регистрации или неправильно введенном номере. Настало время посмотреть функцию проверки серийного номера и решить, что с ней дальше делать.
  1. CODE:004D2CA8                 push    ebp
  2. CODE:004D2CA9                 mov     ebp, esp
  3. CODE:004D2CAB                 add     esp, 0FFFFFFE0h
  4. CODE:004D2CAE                 xor     eax, eax
  5. CODE:004D2CB0                 mov     [ebp+var_8], eax
  6. CODE:004D2CB3                 mov     [ebp+var_C], eax
  7. CODE:004D2CB6                 xor     eax, eax
  8. CODE:004D2CB8                 push    ebp
  9. CODE:004D2CB9                 push    offset loc_4D2E61
  10. CODE:004D2CBE                 push    dword ptr fs:[eax]
  11. CODE:004D2CC1                 mov     fs:[eax], esp
  12. CODE:004D2CC4                 lea     eax, [ebp+var_8]
  13. CODE:004D2CC7                 call    sub_4042AC
  14. CODE:004D2CCC                 lea     eax, [ebp+var_C]
  15. CODE:004D2CCF                 call    sub_4042AC
  16. CODE:004D2CD4                 mov     dl, 1
  17. CODE:004D2CD6                 mov     eax, off_43D3AC
  18. CODE:004D2CDB                 call    sub_43D4AC
  19. CODE:004D2CE0                 mov     [ebp+var_10], eax
  20. CODE:004D2CE3                 xor     eax, eax
  21. CODE:004D2CE5                 push    ebp
  22. CODE:004D2CE6                 push    offset loc_4D2D4F
  23. CODE:004D2CEB                 push    dword ptr fs:[eax]
  24. CODE:004D2CEE                 mov     fs:[eax], esp
  25. CODE:004D2CF1                 mov     edx, 80000001h
  26. CODE:004D2CF6                 mov     eax, [ebp+var_10]
  27. CODE:004D2CF9                 call    sub_43D54C
  28. CODE:004D2CFE                 xor     ecx, ecx
  29. CODE:004D2D00                 mov     edx, offset aSoftwareMina_0
  30. ; "\\Software\\MinAirSoft\\BMM"
  31. CODE:004D2D05                 mov     eax, [ebp+var_10]
  32. CODE:004D2D08                 call    sub_43D5B0
  33. CODE:004D2D0D                 test    al, al
  34. CODE:004D2D0F                 jz      short loc_4D2D39
  35. CODE:004D2D11                 lea     ecx, [ebp+var_8]
  36. CODE:004D2D14                 mov     edx, offset aUsername_0 ; "Username"
  37. CODE:004D2D19                 mov     eax, [ebp+var_10]
  38. CODE:004D2D1C                 call    sub_43D778
  39. CODE:004D2D21                 lea     ecx, [ebp+var_C]
  40. CODE:004D2D24                 mov     edx, offset aCode_0 ; "Code"
  41. CODE:004D2D29                 mov     eax, [ebp+var_10]
  42. CODE:004D2D2C                 call    sub_43D778
  43. CODE:004D2D31                 mov     eax, [ebp+var_10]
  44. CODE:004D2D34                 call    sub_43D51C
Как интересно. Компания-производитель называется "MTop Software", а в реестре ключ назван как "MinAirSoft". Или наследие ребрендинга, или кто-то у кого-то что-то притырил. Но нас это не особо интересует, лучше просто пропатчим начало функции проверки, чтобы она возвращала EAX=1. Команды MOV EAX,1 и RET, записанные по адресу 004D2CA8, должны решить проблему регистрации навсегда. Проверим, так ли это.

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

Назойливое окно регистрации при старте программы пропало, надпись "Trial" к тексту кнопки не добавляется. Цель достигнута! Время на все исследование составило несколько минут, тогда как на написание этой статьи - больше часа.

Поделиться ссылкой ВКонтакте
Просмотров: 4914 | Комментариев: 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 на сообщение о правильной регистрации, то результат был такой же или нет.Спасибо.

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

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

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