Blog. Just Blog

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

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

Программа JoyToKey представляет собой эмулятор клавиатуры и/или мыши, который позволяет управлять различными приложениями Windows с помощью джойстика, даже если изначально такое управление не предусмотрено. Согласно настройкам, программа подменяет нажатия кнопок джойстика на нажатия кнопок клавиатуры или мыши. И ничего удивительного, что за это требуется выложить некоторую сумму денег.

Забираем дистрибутив, устанавливаем, запускаем, смотрим. На попытку зарегистрировать программу какими-нибудь левыми данными она реагирует следующим сообщением:

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

Исполняемый файл ничем не упакован, отправляем его на анализ в дизассемблер. После того, как он закончит работу, поищем прямо в листинге строку сообщения. Сегодня HiEW на выходном. Обнаружится как строка, так и условие, при котором она появляется.
  1. .text:004543F2                 mov     [esp+88h+var_84], ecx
  2. .text:004543F6                 mov     [esp+88h+var_88], eax
  3. ; Вызывать функцию проверки
  4. .text:004543F9                 call    sub_406488
  5. ; Перенести ее результат из EAX в ECX
  6. .text:004543FE                 mov     ecx, eax
  7. .text:00454400                 mov     eax, off_7F69E4
  8. .text:00454405                 mov     eax, [eax]
  9. ; Если CL=0, то вывести сообщение о неправильной регистрации
  10. .text:00454407                 test    cl, cl
  11. .text:00454409                 jz      short loc_454457
  12. ; Вывести сообщение о правильной регистрации
  13. .text:0045440B                 mov     [ebp+var_6C], 11h
  14. .text:00454412                 mov     [esp+88h+var_88], 0
  15. .text:00454419                 mov     edx, (offset aThankYouVeryMu+2)
  16. .text:0045441E                 mov     ecx, offset aR_2 ; "R"
  17. .text:00454423                 call    sub_7B0209
  18. .text:00454428                 sub     esp, 4
  19. .text:0045442B                 mov     eax, dword_7F76C8
  20. .text:00454430                 mov     [ebp+var_6C], 12h
  21. .text:00454437                 call    sub_409D48
  22. .text:0045443C                 mov     eax, [ebp+var_3C]
  23. .text:0045443F                 mov     dword ptr [eax+314h], 1
  24. .text:00454449                 mov     [ebp+var_6C], 14h
  25. .text:00454450                 call    sub_6F41EC
  26. .text:00454455                 jmp     short loc_454477
  27. .text:00454457 ; ---------------------------------------
  28. .text:00454457 loc_454457:
  29. .text:00454457                 mov     [ebp+var_6C], 13h
  30. .text:0045445E                 mov     [esp+88h+var_88], 10h
  31. .text:00454465                 mov     edx, offset aTheSpecifiedKe
  32. ; "The specified key is not valid. Please "...
  33. .text:0045446A                 mov     ecx, offset aError_1 ; "ERROR"
  34. .text:0045446F                 call    sub_7B0209
  35. .text:00454474                 sub     esp, 4
Функция проверки сразу вызывает интерес тем, что в ней присутствуют в открытом виде некоторые строки, например, "DEKI-MOUS-E".
  1. .text:00406488                 push    ebp
  2. .text:00406489                 mov     ebp, esp
  3. .text:0040648B                 push    ebx
  4. .text:0040648C                 push    edi
  5. .text:0040648D                 push    esi
  6. .text:0040648E                 sub     esp, 6Ch
  7. .text:00406491                 mov     eax, [ebp+arg_4]
  8. .text:00406494                 mov     [ebp+var_14], eax
  9. .text:00406497                 lea     eax, [ebp+var_14]
  10. .text:0040649A                 mov     [esp+78h+var_74], eax
  11. .text:0040649E                 mov     [esp+78h+var_78], eax
  12. .text:004064A1                 call    sub_7AEC24
  13. .text:004064A6                 mov     [ebp+var_10], 0
  14. .text:004064AD                 mov     [ebp+var_3C], offset loc_7AC2A0
  15. .text:004064B4                 mov     [ebp+var_38], offset unk_7D2DCC
  16. .text:004064BB                 mov     [ebp+var_34], ebp
  17. .text:004064BE                 mov     [ebp+var_2C], esp
  18. .text:004064C1                 mov     [ebp+var_34], offset byte_4066E9
  19. .text:004064C8                 mov     [ebp+var_50], 1
  20. .text:004064CF                 lea     eax, [ebp+var_58]
  21. .text:004064D2                 call    sub_7ACF09
  22. .text:004064D7                 lea     eax, [ebp+var_10]
  23. .text:004064DA                 mov     [esp+78h+var_78], eax
  24. .text:004064DD                 mov     [esp+78h+var_70], 0
  25. .text:004064E5                 mov     [esp+78h+var_74], offset aDekiMousE
  26. ; "DEKI-MOUS-E"
  27. .text:004064ED                 call    sub_7AEBF4
  28. .text:004064F2                 mov     [ebp+var_50], 2
  29. .text:004064F9                 lea     eax, [ebp+var_10]
  30. .text:004064FC                 mov     [esp+78h+var_74], eax
  31. .text:00406500                 lea     eax, [ebp+var_14]
  32. .text:00406503                 mov     [esp+78h+var_78], eax
  33. ; Вызвать функцию сравнения строк
  34. .text:00406506                 call    sub_7AEDAC
  35. .text:0040650B                 mov     esi, [ebp+arg_0]
  36. .text:0040650E                 test    al, al
  37. .text:00406510                 jz      short loc_406522
Посмотрим под отладчиком, что происходит в функции проверки. Запустим программу под отладчиком и поставим точку останова на адресе 00406488. Запускаем программу и повторяем регистрацию. Когда точка останова сработает, переходим в режим пошаговой трассировки. На первых командах проскакивает введенный левый серийник, потом упомянутая строка "DEKI-MOUS-E". Но главное тут функция, вызываемая по адресу 00406506, по результатам которой выполняется или не выполняется условный переход. Если зайти и посмотреть ее изнутри, то окажется, что это просто функция сравнения строк на максималках, перегруженная донельзя. Дотрассировав до кода
  1. .text:007AEDC8                 mov     eax, edi
  2. .text:007AEDCA                 mov     edx, esi
  3. .text:007AEDCC                 call    sub_5ACC04
смотрим, куда ссылаются регистры EAX и EDX. А ссылается каждый из них на указатель на строку. Один на введенный серийник, а второй на строку "DEKI-MOUS-E". То есть любой введенный серийник сравнивается с этой строкой. Таким образом у нас есть один единственный валидный серийный номер. Закрываем отладчик.

Сообщение об успешной регистрации
Сообщение об успешной регистрации

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

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

В окне "О программе" деактивированы кнопки регистрации и покупки, ограничений по количеству профилей и прочего тоже нет. Цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (01.04.2025 в 11:53):
Отладчик OllyDbg, а строчки смотрел сразу в IDA
Staroekino (01.04.2025 в 11:51):
Когда HiEW на выходном ,какой отладчик использовали ?
Спасибо Вам ManHunter за интересный материал ,... Категория: Темная сторона Силы одна из любимых !!
Сергей (31.03.2025 в 14:51):
Интересная защита =)

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

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

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