Blog. Just Blog

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

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

IconTOY - компактная утилита для извлечения иконок из файлов любого типа: EXE, DLL, ICL, ICO, BMP. Работает на любых версиях Windows, несмотря на возраст. Но работать, честно говоря, с IconTOY не хочется. Ее делали в те времена, когда многие программисты добавляли в свои поделки огромное количество свистоперделок. Это показывало умение разработчика, "так могу, и вот так еще могу", а сейчас это считается дурным тоном. Так что для выполнения задачи лучше использовать какую-нибудь более удобную утилиту, благо их в интернетах предостаточно. И как вы догадались, IconTOY бесплатно работает только 30 дней, а затем требует денег.

Забираем с офсайта дистрибутив, устанавливаем, смотрим что и как. Главный файл ничем не упакован, отправляем его на дизассемблирование.

Триальное окно
Триальное окно

С трудом можно найти кнопку "R", в которой находится поле для регистрации.

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

При попытке ввести левые данные, программа реагирует на строку "Registration key error!". Пока все ожидаемо.

Ошибка
Ошибка

А вот если попробовать ввести буквы или длинное число, то программа падает с ошибкой. То есть мы еще ничего не сделали в плане исследования, но уже видим, что регистрационный код должен быть числом, и при этом не очень большим.

Переходим к дизассемблеру. Обычным поиском по листингу обнаруживается строка "Registration key error!". И над ней проверка, затем сообщение о удачной регистрации, строка реестра, где хранятся настройки и скорее всего регистрационные данные.
  1. CODE:00485F9B                 mov     eax, ds:dword_48E904
  2. ; Проверка
  3. CODE:00485FA0                 call    sub_485C58
  4. ; Если появился флаг, то регистрация выполнена
  5. CODE:00485FA5                 cmp     ds:byte_48E900, 1
  6. CODE:00485FAC                 jnz     loc_486076
  7. ; Регистрация в реестре
  8. CODE:00485FB2                 lea     edx, [ebp+var_8]
  9. CODE:00485FB5                 mov     eax, [ebp+var_4]
  10. CODE:00485FB8                 mov     eax, [eax+30Ch]
  11. CODE:00485FBE                 call    sub_42B50C
  12. CODE:00485FC3                 mov     edx, [ebp+var_8]
  13. CODE:00485FC6                 mov     eax, offset dword_48E908
  14. CODE:00485FCB                 call    sub_403B5C
  15. CODE:00485FD0                 mov     dl, 1
  16. CODE:00485FD2                 mov     eax, off_45E530
  17. CODE:00485FD7                 call    sub_45E6DC
  18. CODE:00485FDC                 mov     ebx, eax
  19. CODE:00485FDE                 mov     cl, 1
  20. CODE:00485FE0                 mov     edx, offset aSoftwareLightt
  21. ; "\\software\\lighttek\\icontoy"
  22. CODE:00485FE5                 mov     eax, ebx
  23. CODE:00485FE7                 call    sub_45E8D0
  24. CODE:00485FEC                 fild    ds:dword_48E904
  25. CODE:00485FF2                 fdiv    flt_4860D0
  26. CODE:00485FF8                 call    sub_402A84
  27. CODE:00485FFD                 push    edx
  28. CODE:00485FFE                 push    eax
  29. CODE:00485FFF                 lea     eax, [ebp+var_C]
  30. CODE:00486002                 call    sub_4084B4
  31. CODE:00486007                 mov     ecx, [ebp+var_C]
  32. CODE:0048600A                 mov     edx, offset dword_4860DC
  33. CODE:0048600F                 mov     eax, ebx
  34. CODE:00486011                 call    sub_45EA6C
  35. CODE:00486016                 mov     ecx, ds:dword_48E908
  36. CODE:0048601C                 mov     edx, offset dword_4860E8
  37. CODE:00486021                 mov     eax, ebx
  38. CODE:00486023                 call    sub_45EA6C
  39. CODE:00486028                 mov     eax, ebx
  40. CODE:0048602A                 call    sub_45E744
  41. CODE:0048602F                 mov     eax, ebx
  42. CODE:00486031                 call    sub_402F38
  43. CODE:00486036                 mov     eax, offset aYouAreRegister
  44. ; "You are registered! Thank you."
  45. CODE:0048603B                 call    sub_44E080
  46. CODE:00486040                 lea     eax, [ebp+var_C]
  47. CODE:00486043                 mov     ecx, ds:dword_48E908
  48. CODE:00486049                 mov     edx, offset aRegisteredFo_0
  49. ; "Registered for: "
  50. CODE:0048604E                 call    sub_403DD0
  51. CODE:00486053                 mov     edx, [ebp+var_C]
  52. CODE:00486056                 mov     eax, ds:dword_48E8FC
  53. CODE:0048605B                 mov     eax, [eax+2E8h]
  54. CODE:00486061                 call    sub_42B53C
  55. CODE:00486066                 mov     eax, ds:off_48D280
  56. CODE:0048606B                 mov     eax, [eax]
  57. CODE:0048606D                 mov     dl, 1
  58. CODE:0048606F                 mov     ecx, [eax]
  59. CODE:00486071                 call    dword ptr [ecx+60h]
  60. CODE:00486074                 jmp     short loc_486080
  61. CODE:00486076 ; ------------------------------------------
  62. CODE:00486076 loc_486076:
  63. ; Неправильная регистрация
  64. CODE:00486076                 mov     eax, offset aRegistrationKe
  65. ; "Registration key error!"
  66. CODE:0048607B                 call    sub_44E080
  67. ...
Смотрим на адрес 00485FA0, в котором используется условный переход. И переходим на адрес 00485C58, где находится функция проверки sub_485C58.
  1. CODE:00485C58 sub_485C58      proc near
  2. CODE:00485C58                 push    ebp
  3. CODE:00485C59                 mov     ebp, esp
  4. CODE:00485C5B                 push    0
  5. CODE:00485C5D                 xor     edx, edx
  6. CODE:00485C5F                 push    ebp
  7. CODE:00485C60                 push    offset loc_485ECD
  8. CODE:00485C65                 push    dword ptr fs:[edx]
  9. CODE:00485C68                 mov     fs:[edx], esp
  10. CODE:00485C6B                 cmp     eax, 0BAA68Ch
  11. CODE:00485C70                 jz      loc_485E2F
  12. CODE:00485C76                 cmp     eax, 135A6Ah
  13. CODE:00485C7B                 jz      loc_485E2F
  14. CODE:00485C81                 cmp     eax, 1362E0h
  15. CODE:00485C86                 jz      loc_485E2F
  16. CODE:00485C8C                 cmp     eax, 132876h
  17. CODE:00485C91                 jz      loc_485E2F
  18. CODE:00485C97                 cmp     eax, 31EDAEh
  19. CODE:00485C9C                 jz      loc_485E2F
  20. CODE:00485CA2                 cmp     eax, 31E9C6h
  21. CODE:00485CA7                 jz      loc_485E2F
  22. CODE:00485CAD                 cmp     eax, 12D8A8h
  23. CODE:00485CB2                 jz      loc_485E2F
  24. CODE:00485CB8                 cmp     eax, 137F26h
  25. CODE:00485CBD                 jz      loc_485E2F
  26. CODE:00485CC3                 cmp     eax, 0B8B7B6h
  27. CODE:00485CC8                 jz      loc_485E2F
  28. CODE:00485CCE                 cmp     eax, 127AAEh
  29. CODE:00485CD3                 jz      loc_485E2F
  30. CODE:00485CD9                 cmp     eax, 12D2A2h
  31. CODE:00485CDE                 jz      loc_485E2F
  32. CODE:00485CE4                 cmp     eax, 0B9FA2Ah
  33. CODE:00485CE9                 jz      loc_485E2F
  34. CODE:00485CEF                 cmp     eax, 0B9F836h
  35. CODE:00485CF4                 jz      loc_485E2F
  36. ...
Что мы видим в функции проверки? Берется большая пачка чисел, по очереди проверяются. Если какое-нибудь число из них понравится программе, то появится строка "Registered for:", а переменная byte_48E900 получит значение 1. Попробуем взять первое число из списка, мне нравится "0BAA68Ch". Единственно, надо перевести значение в десятичное число, это будет "12232332". Регистрационное имя нигде не используется.

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

Программа говорит "спасибо", убирается кнопка регистрации, а главное, что больше нет ограничений при работе.

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

Как выяснилось, нормально работать с IconTOY не получится, и даже не только из-за кривого интерфейса. В программе полно ошибок и странно, что за столько лет эти ошибки не исправлены. А вот если использовать IconTOY как пособие, то тогда нормально, все равно удалять. Цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

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

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

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