Blog. Just Blog

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

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

Console Calculator - мощный калькулятор с простым, быстрым и элегантным консольным интерфейсом. Позволяет производить расчеты в десятичной, шестнадцатеричной и двоичной системе, есть много встроенных математических и тригонометрических функций, переменные, предустановленные константы, пользовательские функции, и даже простенький скриптовый язык. Полный список возможностей посмотрите на офсайте. При всем этом калькулятор не занимает много места, он портативный и будет неплохим помощником в повседневной работе.

Скачиваем дистрибутив последней версии, распаковываем, запускаем. В принципе, каких-то ограничений при работе незарегистрированного калькулятора нет, но вот после истечения триального срока он самоликвидируется (не проверял). Давайте исследуем его защиту на предмет обхода всех ограничений. Исполняемый файл ничем не упакован и не защищен, отправляем его в дизассемблер, а сами посмотрим на его работу. Кнопка регистрации находится в окне "About":

Окно "О программе"
Окно "О программе"

Вводить серийный номер надо в том же окне, где выполняются остальные расчеты. На ввод любого неправильного серийника программа реагирует сообщением "Registration invalid. Visit www.zoesoft.com to acquire a license".

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

Поищем эту строчку в файле и посмотрим условия ее срабатывания.
  1. .text:00404049                 sub     eax, edx
  2. ; Проверить длину строки серийника. Она должна быть 12 символов
  3. .text:0040404B                 cmp     eax, 0Ch
  4. .text:0040404E                 jnz     short loc_404073
  5. .text:00404050                 lea     edx, [esp+88h+var_80]
  6. .text:00404054                 push    edx
  7. .text:00404055                 lea     eax, [esp+8Ch+var_7C]
  8. .text:00404059                 push    eax
  9. .text:0040405A                 lea     ecx, [esp+90h+var_78]
  10. .text:0040405E                 push    ecx
  11. .text:0040405F                 lea     edx, [esp+94h+var_68]
  12. ; Разложить серийный номер на 3 группы по 4 шестнадцатеричные цифры
  13. .text:00404063                 push    offset a4x4x4x  ; "%4x%4x%4x"
  14. .text:00404068                 push    edx
  15. .text:00404069                 call    sub_44004E
  16. .text:0040406E                 add     esp, 14h
  17. .text:00404071                 mov     edi, eax
  18. .text:00404073 loc_404073:
  19. .text:00404073                 push    ebx
  20. .text:00404074                 push    ebp
  21. .text:00404075                 mov     ecx, esi
  22. .text:00404077                 call    sub_4026F0
  23. .text:0040407C                 cmp     edi, 3
  24. .text:0040407F                 jnz     loc_4041F8
  25. .text:00404085                 mov     edx, [esp+90h+var_78]
  26. .text:00404089                 mov     edi, [esp+90h+var_7C]
  27. .text:0040408D                 mov     ebp, [esp+90h+var_80]
  28. .text:00404091                 mov     eax, edx
  29. .text:00404093                 or      eax, edi
  30. .text:00404095                 or      eax, ebp
  31. .text:00404097                 cmp     eax, 0FFFFh
  32. .text:0040409C                 ja      loc_4041F8
  33. .text:004040A2                 mov     ecx, edx
  34. .text:004040A4                 shl     ecx, 10h
  35. .text:004040A7                 or      ecx, edi
  36. .text:004040A9                 push    ecx
  37. .text:004040AA                 push    ebp
  38. ; Вызывать функцию проверки серийного номера
  39. .text:004040AB                 call    sub_4024F0
  40. .text:004040B0                 add     esp, 8
  41. .text:004040B3                 cmp     edx, 2EF1h
  42. ; Сохранить в EBX результат проверки
  43. .text:004040B9                 mov     ebx, eax
  44. .text:004040BB                 jnz     loc_404193
  45. .text:004040C1                 cmp     edi, 7B14h
  46. .text:004040C7                 jnz     loc_404193
  47. .text:004040CD                 cmp     ebp, 8072h
  48. .text:004040D3                 jnz     loc_404193
  49. ...
  50. часть кода пропущена
  51. ...
  52. .text:00404193 loc_404193:
  53. ; Результат проверки = 0?
  54. .text:00404193                 test    ebx, ebx
  55. ; Да, значит введенный серийный номер неправильный
  56. .text:00404195                 jz      short loc_4041F8
  57. ; Серийный номер правильный
  58. .text:00404197                 mov     eax, [esi+94h]
  59. .text:0040419D                 push    offset aRegistrationSu
  60. ; "\nRegistration successful. Thank you!\n"
  61. .text:004041A2                 push    0               ; wParam
  62. .text:004041A4                 push    0C2h            ; Msg
  63. .text:004041A9                 push    eax             ; hWnd
  64. .text:004041AA                 call    ds:SendMessageA
  65. .text:004041B0                 fld     ds:dbl_45EAF0
  66. .text:004041B6                 fld     ds:dbl_45EAD0
  67. .text:004041BC                 call    __CIpow
  68. .text:004041C1                 mov     ecx, [esp+90h+var_78]
  69. .text:004041C5                 shl     ecx, 10h
  70. .text:004041C8                 or      ecx, [esp+90h+var_7C]
  71. .text:004041CC                 push    0
  72. .text:004041CE                 mov     [esp+94h+var_74], ecx
  73. .text:004041D2                 fild    [esp+94h+var_74]
  74. .text:004041D6                 mov     dword_480398, 1
  75. .text:004041E0                 fmulp   st(1), st
  76. .text:004041E2                 fiadd   [esp+94h+var_80]
  77. .text:004041E6                 fstp    dbl_47B518
  78. .text:004041EC                 call    sub_403DE0
  79. .text:004041F1                 add     esp, 4
  80. .text:004041F4 loc_4041F4:
  81. .text:004041F4                 test    ebx, ebx
  82. .text:004041F6                 jnz     short loc_404211
  83. .text:004041F8 loc_4041F8:
  84. ; Серийный номер неправильный
  85. .text:004041F8                 mov     edx, [esi+94h]
  86. .text:004041FE                 push    offset aRegistrationIn
  87. ; "\nRegistration invalid.\nVisit www.zoesof"...
  88. .text:00404203                 push    0               ; wParam
  89. .text:00404205                 push    0C2h            ; Msg
  90. .text:0040420A                 push    edx             ; hWnd
  91. .text:0040420B                 call    ds:SendMessageA
  92. ...
Итак, что мы имеем. Длина серийного номера должна быть 12 символов, и это три группы по 4 шестнадцатеричных цифры. Теперь посмотрим функцию проверки введенного серийного номера. Под отладчиком весь алгоритм проверки становится еще более понятным.
  1. .text:004024F0 sub_4024F0      proc near
  2. ; В регистре EAX значение конечного WORD'а
  3. .text:004024F0                 movzx   eax, [esp+arg_0]
  4. .text:004024F5                 lea     ecx, [eax+7531h]
  5. .text:004024FB                 shl     eax, 10h
  6. .text:004024FE                 and     ecx, 0FFFFh
  7. .text:00402504                 add     ecx, eax
  8. .text:00402506                 rol     ecx, 6
  9. .text:00402509                 add     ecx, 12341234h
  10. .text:0040250F                 xor     eax, eax
  11. ; Сейчас в регистре ECX правильное значение начального DWORD'а
  12. .text:00402511                 cmp     ecx, [esp+arg_4]
  13. .text:00402515                 setz    al
  14. .text:00402518                 retn
  15. .text:00402518 sub_4024F0      endp
Функция проверки серийного номера настолько прозрачная, что даже не требует каких-то дополнительных комментариев. Можно просто скопировать и вставить в свой генератор ключей. Все манипуляции производятся с завершающим WORD'ом из введенного серийного номера, а первый DWORD является проверочным. Если принять, что в регистре EAX записан завершающий WORD, то формулу можно записать в виде:

Код = ((((EAX + 7531h) AND 0FFFFh) + (EAX SHL 10h)) ROL 6) + 12341234h
Например, для начального значения 1122h проверочный код получится 5AD5A6F8h, значит целиком серийный номер будет 5AD5A6F81122. Теперь попробуем зарегистрировать программу с найденным серийником:

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

Программа успешно зарегистрирована. Вот такой пятиминутный ребус стоимостью пять баксов. При желании можете даже купить этот калькулятор, а можно написать кейген, выбор за вами. Кстати, с чувством юмора у автора тоже все в порядке. Если внимательно посмотрите на код проверки, то обнаружите там такие строки:
  1. .text:004040B3                 cmp     edx, 2EF1h
  2. .text:004040B9                 mov     ebx, eax
  3. .text:004040BB                 jnz     loc_404193
  4. .text:004040C1                 cmp     edi, 7B14h
  5. .text:004040C7                 jnz     loc_404193
  6. .text:004040CD                 cmp     ebp, 8072h
Если собрать проверяемые значения в серийный номер 2EF17B148072, а затем попытаться зарегистрировать с его помощью программу, то вместо ошибки вы получите вот такое забавное сообщение:

Варезный серийный номер
Варезный серийный номер

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

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

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ChVL (24.03.2013 в 00:24):
А всё-таки буква "ё" - законная и равноправная буква русского алфавита...
IMPosTOR (21.03.2013 в 00:38):
:)
ManHunter (20.03.2013 в 14:04):
Rustamer, "шутка юмора" - это литературный фразеологизм. В жизни его тоже  употребляю, но по ситуации. Пруф: http://folklor.academic.ru/212...%D1%80%D0%B0
Rustamer (20.03.2013 в 11:49):
Интересная программа. Да еще и под макось есть. Вот бы такой функционал в меню Пуск в Windows (или в "Выполнить") :)
Из подобных утилит мне нравится маленькая, но очень функциональная утилита SpeQ. Прямо таки математический пакет.
P.S. В качестве придирки: сочетание "шутка юмора" употребляется в жизни или это опечатка?

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

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

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