Blog. Just Blog

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

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

Программа tinySpell+ предназначена для автоматической проверки правописания в любых приложениях. При обнаружении ошибки tinySpell+ сразу предлагает варианты для исправления. В платной версии поддерживаются внешние словари в формате Hunspell, что является большим преимуществом. Ну и еще некоторые полезные опции становятся доступны только после покупки. Но, как я всегда говорю, слова "купить" и "программа" ни при каких обстоятельствах не могут стоять рядом.

Забираем с офсайта дистрибутив последней версии, распаковываем, смотрим. Главный исполняемый файл ничем не упакован, отправляем его на разбор в дизассемблер. Попутно попробуем разблокировать программу, потому что без активации ее можно запустить только в пробном режиме на 15 минут. При вводе левых данных появляется следующее сообщение:

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

А при запуске в левом нижнем углу всплывает сообщение, что, мол, unregistered и все такое. Поищем в листинге эту строку. Первым же заходом обнаруживается следующий код:
  1. .text:004119C4                 add     esp, 24h
  2. ; Проверить значение флага регистрации
  3. .text:004119C7                 cmp     dword_45BBD4, ebx
  4. ; Флаг =0, программа не зарегистрирована
  5. .text:004119CD                 jz      short loc_411A0F
  6. ; Программа зарегистрирована
  7. .text:004119CF                 lea     eax, [ebp+Rect]
  8. .text:004119D2                 push    eax             ; lpRect
  9. .text:004119D3                 push    edi             ; hWnd
  10. .text:004119D4                 call    ds:GetWindowRect
  11. .text:004119DA                 mov     eax, [ebp+Rect.bottom]
  12. .text:004119DD                 sub     eax, [ebp+Rect.top]
  13. .text:004119E0                 sar     eax, 2
  14. .text:004119E3                 push    offset aLicensedTo
  15. ; " - licensed to:"
  16. .text:004119E8                 push    50h
  17. .text:004119EA                 lea     ebx, [eax+eax*2]
  18. .text:004119ED                 lea     eax, [ebp+String]
  19. .text:004119F0                 push    eax
  20. .text:004119F1                 call    sub_432535
  21. .text:004119F6                 mov     esi, ds:SetDlgItemTextA
  22. .text:004119FC                 lea     eax, [ebp+String]
  23. .text:004119FF                 add     esp, 0Ch
  24. .text:00411A02                 push    eax             ; lpString
  25. .text:00411A03                 push    65h             ; nIDDlgItem
  26. .text:00411A05                 push    edi             ; hDlg
  27. .text:00411A06                 call    esi ; SetDlgItemTextA
  28. .text:00411A08                 push    offset byte_45F578
  29. .text:00411A0D                 jmp     short loc_411A36
  30. .text:00411A0F ; ----------------------------------------
  31. .text:00411A0F loc_411A0F:
  32. .text:00411A0F                 push    offset aUnregistered
  33. ; " - unregistered"
  34. .text:00411A14                 lea     eax, [ebp+String]
  35. .text:00411A17                 push    50h
  36. .text:00411A19                 push    eax
  37. .text:00411A1A                 call    sub_432535
  38. .text:00411A1F                 mov     esi, ds:SetDlgItemTextA
  39. .text:00411A25                 lea     eax, [ebp+String]
  40. .text:00411A28                 add     esp, 0Ch
Мы знаем условие срабатывания на триальную ветку алгоритма, для этого флаг dword_45BBD4 должен быть равен нулю. Посмотрим на этот флаг и на участки кода, где он инициализируется тем или иным значением.

Перекрестные ссылки на ячейку памяти
Перекрестные ссылки на ячейку памяти

По умолчанию флаг равен 1, но по перекрестным ссылкам видно, что несколько раз он сбрасывается на нулевое значение. Поочередно пройдем по этим командам и заменим в них 0 на 1, чтобы при любом раскладе программа чувствовала себя хорошо.
  1. .text:00415D8C                 mov     edi, ecx
  2. .text:00415D8E                 mov     byte_45F578, 0
  3. .text:00415D95                 mov     dword_45BBD4, 0
  4. .text:00415D9F                 mov     dword_460448, 0
  5. .text:00415DA9                 jle     loc_415E3C
  1. .text:0041C787                 push    eax             ; hWnd
  2. .text:0041C788                 call    ds:SetFocus
  3. .text:0041C78E                 mov     dword_45BBD4, 0
  1. .text:00423BF6                 mov     dword_45BBD4, 0
  2. .text:00423C00                 mov     bEnable, 0
  3. .text:00423C0A                 mov     dword_45FCB8, 0
  4. .text:00423C14                 call    sub_413800
А в кусочке кода
  1. .text:0041C82E                 mov     eax, dword_45BBD4
  2. .text:0041C833                 test    eax, eax
  3. .text:0041C835                 cmovz   eax, esi
  4. .text:0041C838                 mov     dword_45BBD4, eax
надо заменить трехбайтную команду cmovz eax, esi на пару команд xor eax,eax и inc eax, длина которых суммарно также составляет три байта. Сохраняем изменения, смотрим. Теперь при запуске текст во всплывающем окне меняется на "licensed to:" с пустым именем, а в настройках и главном меню программы открываются все доступные опции. Ограничений по времени работы также нет. Цель достигнута, можно пользоваться.

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (29.01.2025 в 13:31):
Ctrl+X , стандартная функция IDA
Grey (29.01.2025 в 13:30):
Xrefs твоя разработка?

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

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

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