Blog. Just Blog

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

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

Программа Advanced Biorhythms предназначена для расчета персональных биоритмов на месяц, а также тестирования совместимости людей по их биоритмам. Без регистрации работает всего месяц и не дает выводить данные календаря в печатном виде. Ну ничего, если верить программе, сегодня у меня интеллектуальный подъем, попробуем провести время с пользой.

Забираем с офсайта дистрибутив, устанавливаем, запускаем, смотрим. В главном окне программы обнаруживается надпись об оставшемся триальном сроке, а в окне "О программе" стоит статут "UNREGISTERED". При попытке регистрации левыми данными появляется сообщение:

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

Попытки поискать это сообщение как в ANSI, так и в юникоде, не приводят ни к чему. А вот надпись "Reminder" дает интересный результат поиска:

Строка в файле
Строка в файле

Точнее не она сама, а прочие строки в файле. Среди вполне нормальных надписей встречаются какая-то бредятина типа "DERETSIGERNU", ".troppus tcatnoc esaelP" и подобных. Не надо быть мастером ребусов чтобы догадаться, что это просто строки "UNREGISTERED" и "Please contact support.", записанные задом-наперед. Миленький прикол от разработчиков. Если еще полистать файл, то обнаружится, что все строки, так или иначе относящиеся к регистрации, триальности и тому подобному, зашифрованы этим же способом. А вот и интересующая нас строка:

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

Посмотрим в дизассемблере код, где она используется. Вы же не забыли отправить главный исполняемый файл в дизассемблер?
  1. .text:0040E1A2                 push    esi             ; lpString
  2. .text:0040E1A3                 lea     ecx, [ebp+var_14]
  3. .text:0040E1A6                 mov     byte ptr [ebp+var_4], 1
  4. .text:0040E1AA                 call    sub_42A09B
  5. .text:0040E1AF                 push    offset a_troppusRofUoy
  6. ; ".troppus rof uoy knahT"
  7. .text:0040E1B4                 lea     ecx, [ebp+lpText]
  8. .text:0040E1B7                 mov     byte ptr [ebp+var_4], 2
  9. .text:0040E1BB                 call    sub_42A09B
  10. .text:0040E1C0                 push    offset a_niagaYrtNehtY
  11. ; ".niaga yrt neht ,yek dna eman ruoy kceh"...
  12. .text:0040E1C5                 lea     ecx, [ebp+var_1C]
  13. .text:0040E1C8                 mov     byte ptr [ebp+var_4], 3
  14. .text:0040E1CC                 call    sub_42A09B
  15. .text:0040E1D1                 push    offset a_hctamTonOdYek
  16. ; ".hctam ton od yek dna eman noitartsiger"...
  17. .text:0040E1D6                 lea     ecx, [ebp+var_1C]
  18. .text:0040E1D9                 mov     byte ptr [ebp+var_4], 4
  19. .text:0040E1DD                 call    sub_42A3A3
  20. .text:0040E1E2                 push    1
Пока не очень понятно. Посмотрим дальше. Тут выполняется работа с файлом ab.key, но перед этими операциями стоит условный переход.
  1. .text:0040E31F                 push    0               ; char **
  2. .text:0040E321                 push    eax             ; char *
  3. .text:0040E322                 call    _strtol
  4. .text:0040E327                 movzx   ecx, word ptr [ebp+var_20]
  5. .text:0040E32B                 add     esp, 0Ch
  6. .text:0040E32E                 cmp     ecx, eax
  7. ; Серийник неправильный
  8. .text:0040E330                 jnz     loc_40E412
  9. ; Сохранить регистрационные данные
  10. .text:0040E336                 xor     esi, esi
  11. .text:0040E338                 lea     ecx, [ebp+var_40] ; this
  12. .text:0040E33B                 push    esi
  13. .text:0040E33C                 push    1001h           ; unsigned int
  14. .text:0040E341                 push    offset aAb_key  ; "ab.key"
  15. .text:0040E346                 call    ?Open@CFile@@UAEHPBDIPAVCFileException
Забиваем условный переход командами NOP, сохраняем изменения. Повторяем регистрацию, программа принимает любой серийник и регистрационное имя:

Программа принимает серийный номер
Программа принимает серийный номер

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

Сообщение о неправильном ключе
Сообщение о неправильном ключе

Возвращаемся в дизассемблер, находим код, где эти строки расшифровываются и выводятся на экран:
  1. .text:0040491B                 mov     [ebp+var_4], edi
  2. .text:0040491E                 call    sub_40DF77
  3. .text:00404923                 lea     eax, [ebx+74h]
  4. .text:00404926                 mov     byte ptr [ebx+5Ch], 1
  5. .text:0040492A                 mov     dword ptr [ebx+7Ch], 5Fh
  6. .text:00404931                 push    eax             ; CString *
  7. .text:00404932                 lea     ecx, [ebp+var_28]
  8. .text:00404935                 mov     byte ptr [ebp+var_4], 2
  9. .text:00404939                 mov     dword ptr [ebx+78h], 1Eh
  10. .text:00404940                 call    sub_40E7A6
  11. .text:00404945                 mov     [ebx+7Ch], eax
  12. .text:00404948                 cmp     eax, 0Ah
  13. .text:0040494B                 jz      loc_404A6A
  14. .text:00404951                 cmp     eax, 14h
  15. .text:00404954                 jz      loc_4049DA
  16. .text:0040495A                 cmp     eax, 1Eh
  17. .text:0040495D                 jnz     loc_404A71
  18. .text:00404963                 push    offset a_troppusTcatno
  19. ; ".troppus tcatnoc esaelP "
  20. .text:00404968                 lea     ecx, [ebp+lpNewItem]
  21. .text:0040496B                 call    sub_42A09B
  22. .text:00404970                 push    offset a_dilavRegnolOn
  23. ; ".dilav regnol on si gnisu era uoy yek n"...
  24. .text:00404975                 lea     ecx, [ebp+lpNewItem]
  25. .text:00404978                 mov     byte ptr [ebp+var_4], 4
  26. .text:0040497C                 call    sub_42A3A3
  27. .text:00404981                 lea     ecx, [ebp+lpNewItem]
Видите три проверки перед операциями со строками? Заменяем первую проверку на безусловный переход, сохраняем изменения, запускаем.

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

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

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 593 | Комментариев: 4

Комментарии

Отзывы посетителей сайта о статье
Vnv (29.04.2021 в 18:32):
ManHunter, только я не умею так красиво и лаконично описывать процесс нахождения всей инфы для кейгена, все на интуиции, и опыт. "Чукча не писатель, чукча - читатель" (это я о себе). ;)
ManHunter (29.04.2021 в 10:16):
Vnv, годная годнота, красава :)
Vnv (25.04.2021 в 15:11):
Возможен и кейген, ничего сложного (уровень не для новичков):

Vnvvnv
wRTwR59YW2wY63C6CwHYY

Интересно было бы почитать именно о разборе алгоритма, я люблю поменьше патчить. ;)

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

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

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