Blog. Just Blog

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

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

Программа DecSoft HTML Compiler предназначена для создания стационарных исполняемых приложений из HTML-страниц. Это могут быть презентации, электронные книги, интерактивные справочники, браузерные игры и даже целые сайты. При этом на диск ничего не извлекается, все колдунство выполняется в памяти на современном движке Chromium. Размер готового файла, конечно, получается просто чудовищный, но кого это в наше время волнует. Если авторы программы не обманывают, то ограничений по времени и/или функционалу нет, а покупать лицензию надо только если программа понравится. Очень разумный подход. А как быть, если и программа понравилась, и платить не хочется?

Забираем с офсайта жирненький дистрибутив, устанавливаем, смотрим. Главный исполняемый файл ничем не упакован, отправляем его на разбор в дизассемблер. Пока тот работает, проверим функционал программы. Я немного потестировал, вроде бы действительно ограничений нет. Но все равно присутствует надпись "Unregistered" в заголовке программы и триальное окно с напоминанием, которое появляется при запуске.

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

Поиском по юникодной строке "Unregistered" обнаруживаем следующие строки. Как видим, тут есть оба варианта. Осталось выяснить, при каких условиях они появляются.

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

По перекрестным ссылкам в дизассемблере выходим на следующий код. Тут как раз меняется надпись в заголовке в зависимости от статуса программы.
  1. .text:00A6EED0                 push    ebp
  2. .text:00A6EED1                 push    offset loc_A6EFC2
  3. .text:00A6EED6                 push    dword ptr fs:[eax]
  4. .text:00A6EED9                 mov     fs:[eax], esp
  5. .text:00A6EEDC                 mov     eax, ds:off_858874
  6. ; Вызывать функцию проверки
  7. .text:00A6EEE1                 call    sub_858E24
  8. ; Если вернулось AL=0, то установить в заголовок "Unregistered"
  9. .text:00A6EEE6                 test    al, al
  10. .text:00A6EEE8                 jz      short loc_A6EF43
  11. .text:00A6EEEA                 mov     eax, [ebx+404h]
  12. .text:00A6EEF0                 xor     edx, edx
  13. .text:00A6EEF2                 mov     ecx, [eax]
  14. .text:00A6EEF4                 call    dword ptr [ecx+8Ch]
  15. .text:00A6EEFA                 mov     eax, off_AC37C0
  16. .text:00A6EEFF                 mov     dword ptr [eax], 1
  17. .text:00A6EF05                 lea     eax, [ebp+var_4]
  18. .text:00A6EF08                 push    eax
  19. .text:00A6EF09                 lea     ecx, [ebp+var_8]
  20. .text:00A6EF0C                 mov     eax, [ebx+400h]
  21. .text:00A6EF12                 mov     edx, offset aDecsoftHtmlC_0
  22. ; "DecSoft HTML Compiler %s"
  23. .text:00A6EF17                 call    sub_82C108
  24. .text:00A6EF1C                 mov     eax, [ebp+var_8]
  25. .text:00A6EF1F                 push    eax
  26. .text:00A6EF20                 mov     eax, offset a2022_10_4 ; "2022.10"
  27. .text:00A6EF25                 mov     [ebp+var_10], eax
  28. .text:00A6EF28                 mov     [ebp+var_C], 11h
  29. .text:00A6EF2C                 lea     edx, [ebp+var_10]
  30. .text:00A6EF2F                 xor     ecx, ecx
  31. .text:00A6EF31                 pop     eax
  32. .text:00A6EF32                 call    sub_42AE3C
  33. .text:00A6EF37                 mov     edx, [ebp+var_4]
  34. .text:00A6EF3A                 mov     eax, ebx
  35. .text:00A6EF3C                 call    sub_5855C4
  36. .text:00A6EF41                 jmp     short loc_A6EF9A
  37. .text:00A6EF43 ; ----------------------------------------
  38. .text:00A6EF43 loc_A6EF43:
  39. .text:00A6EF43                 mov     eax, [ebx+404h]
  40. .text:00A6EF49                 mov     dl, 1
  41. .text:00A6EF4B                 mov     ecx, [eax]
  42. .text:00A6EF4D                 call    dword ptr [ecx+8Ch]
  43. .text:00A6EF53                 mov     eax, off_AC37C0
  44. .text:00A6EF58                 mov     dword ptr [eax], 2
  45. .text:00A6EF5E                 lea     eax, [ebp+var_14]
  46. .text:00A6EF61                 push    eax
  47. .text:00A6EF62                 lea     ecx, [ebp+var_18]
  48. .text:00A6EF65                 mov     eax, [ebx+400h]
  49. .text:00A6EF6B                 mov     edx, offset aUnregisteredDe
  50. ; "Unregistered DecSoft HTML Compiler %s"
  51. .text:00A6EF70                 call    sub_82C108
  52. .text:00A6EF75                 mov     eax, [ebp+var_18]
  53. .text:00A6EF78                 push    eax
  54. .text:00A6EF79                 mov     eax, offset a2022_10_4 ; "2022.10"
  55. .text:00A6EF7E                 mov     [ebp+var_10], eax
  56. .text:00A6EF81                 mov     [ebp+var_C], 11h
  57. .text:00A6EF85                 lea     edx, [ebp+var_10]
  58. .text:00A6EF88                 xor     ecx, ecx
По коду понятно, что заголовок с надписью "Unregistered" появляется при условии, если функция проверки вернула в регистре EAX нулевое значение. И пусть конкретно тут проверяется только младший регистр AL, учитывать надо значение всего регистра. Впечатываем в начало функции проверки по адресу 00858E24 пару команд MOV EAX,1 и RET. Сохраняем изменения. Окно больше не появляется, в заголовке тоже все нормально, пунктов регистрации в меню нет. Но в окне "О программе" все равно присутствует надпись, что это незарегистрированная демо-версия. Если это вас не напрягает, то тут можно остановиться и считать задачу выполненной.

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

Если все-таки хотите видеть там свои регистрационные данные, то есть два пути: простой и сложный. При простом способе можно зайти в папку с установленной программой, открыть файл \About\en-US\index.html в любом блокнотике и отредактировать его содержимое на свое усмотрение:

Редактируем окно "О программе"
Редактируем окно "О программе"

Теперь сложный путь. Откатываем все изменения в исполняемом файле, запускаем и пробуем зарегистрировать программу какой-нибудь левотой.

Окно регистрации
Окно регистрации

Как видим, кнопка ввода остается неактивной, то есть корректность введенных регистрационных данных проверяется непосредственно в процессе ввода. Нечто подобное у нас было не так давно. Как и предыдущем примере, эта программа написана на Дельфи, значит в анализе обработчиков нам поможет все тот же Interactive Delphi Reconstructor. Отправляем исполняемый файл на декомпиляцию. Придется подождать, файл большой. Когда процесс завершится, открываем в списке форм элемент TRegisterForm и переключаем его на режим просмотра формы и обработчиков. Нас интересует обработчик CheckLicenseActionUpdate, который забинден на изменение содержимого полей ввода.

Поиск скобок в регистрационном имени
Поиск скобок в регистрационном имени

По названиям методов и функций все становится ясно. Берется регистрационное имя, в нем последовательно проверяется наличие символов "(" и ")", если оба этих символа есть, то кнопка ввода активируется. Запускаем программу, проверяем регистрацию, убеждаемся, что это действительно так. Теперь посмотрим второй обработчик CheckLicenseActionExecute, который срабатывает при нажатии на кнопку ввода.

Проверка регистрации
Проверка регистрации

Интересное название отмеченной функции явно намекает, что проверка регистрационных данных выполняется онлайн. Запускаем не модифицированную программу под отладчиком, ставим точку останова по адресу 00A62E64, отпускаем программу на выполнение и повторяем регистрацию с левыми данными, но правильного формата, то есть со скобочками в имени. Когда точка останова сработает, надо забить в отладчике NOP'ами все условные переходы в этой функции (00A62EAF, 00A62EE1 и 00A62F14), а затем пройти в пошаговом режиме до адреса 00A62F3F, по которому выполняется сохранение регистрационных данных. Можно обойтись и без патча, просто своевременно подменяя при трассировке значение флага ZF для подавления перехода. После этого в папке {USER}\Documents\DecSoft\HtmlCompiler\License появится файл license с зашифрованными регистрационными данными. Закрываем отладчик. Но теперь появилась другая проблема, ситуацию с полным отсутствием лицензии мы пропатчили в первой части статьи, а вот при ее наличии за корректность отвечает упомянутая серверная проверка. Открываем файл на редактирование и впечатываем в начало функции проверки по адресу 00A620A4 пару команд MOV EAX,1 и RET. Таким образом у нас есть файл лицензии и пропатченный в двух местах исполняемый файл.

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

Сохраняем окончательные изменения, запускаем, проверяем. Никаких триальных признаков нет, в окне "О программе" красуется введенное регистрационное имя. Вот теперь можно считать, что цель полностью достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
Grey (06.09.2022 в 10:39):
ManHunter, я наивно полагал, что в моникер достаточно гуид другого движка вставить...)
ManHunter (04.09.2022 в 02:02):
Grey, на офсайте https://cef-builds.spotifycdn....ml#windows32 демка на движке хромиума с dll размером в полторы сотни мегов. Вот тут документация и все остальное https://bitbucket.org/chromium.../src/master/ , если есть желание поковыряться. Мне такое счастье нафиг не уперлось.
ManHunter (02.09.2022 в 10:59):
Я ж просто не знаю, как там все реализовано. Если все сводится к одной dll и парочке api, то конечно будет статья, а если там для вхождения надо неделю курить мануалы и потом месяц жить в отладчике, то нет, нафиг.
Grey (02.09.2022 в 10:56):
ManHunter, спасибо, с годами ты становишься добрее))
Про "если - может быть" тоже увидел...
ManHunter (02.09.2022 в 10:46):
Если найду толковое описание по хромиуму, то посмотрю, может быть что-нибудь и напишу.
Grey (02.09.2022 в 10:31):
ManHunter, наилучший вариант  HTML в exe изложен в твоем блоге (диалоговые окна ассемблере). Там вроде движок IE.
Может быть наступило время выпустить версию 2 этой статьи, где прикручен хромиум или фаерфокс?
ManHunter (23.08.2022 в 10:31):
Так эту тоже с некоторой натяжкой можно назвать бесплатной. И приложения HTA, насколько я с ними работал и помню, используют только движок IE.
0101 (23.08.2022 в 08:25):
В состав Vbsedit входит прога htaedit.exe, которая может компилить HTML в exe. Прога бесплатная, весит 1,5Мб. Может, её будет достаточно.
https://drive.google.com/file/...?usp=sharing

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

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

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