Blog. Just Blog

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

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

Программа Batch Text Replacer предназначена для пакетной обработки текстовых файлов на предмет поиска, замены, добавления или удаления произвольных фрагментов текста. Огромное количество правил обработки позволяют выполнить практически любую задачу по модификации текстов. Всю прелесть портит необходимость выкладывать за программу деньги.

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

Строка в ресурсах
Строка в ресурсах

Нас интересует строка о том, что программа зарегистрирована. Эта строка имеет числовой индекс 63045 или 0F645h, если в шестнадцатеричной системе счисления. Поиском по строке "0F645h" в листинге дизассемблера обнаруживается стандартная для Дельфи конструкция:
  1. .text:00D4F6E0 off_D4F6E0      dd offset hInstance
  2. .text:00D4F6E4                 dd 0F645h
На нее ссылается вот такой код. Для удобства я сразу добавил строки проверки, по результатам которой он выполняется.
  1. .text:00D4FE5B                 mov     eax, [eax]
  2. .text:00D4FE5D                 mov     eax, [eax+64h]
  3. ; Выполнить функцию проверки
  4. .text:00D4FE60                 call    sub_B7C224
  5. .text:00D4FE65                 cmp     al, 2
  6. ; Если результат AL=2, то программа зарегистрирована
  7. .text:00D4FE67                 jz      short loc_D4FECF
  8. .text:00D4FE69                 lea     edx, [ebp+var_1C]
  9. .text:00D4FE6C                 mov     eax, offset off_D4F6D8
  10. .text:00D4FE71                 call    sub_40C2C4
  11. ...
  12. ...
  13. .text:00D4FECF loc_D4FECF:
  14. .text:00D4FECF                 lea     edx, [ebp+var_30]
  15. ; "Lizenzstatus" ("Статус лицензии")
  16. .text:00D4FED2                 mov     eax, offset off_D4F6D8
  17. .text:00D4FED7                 call    sub_40C2C4
  18. .text:00D4FEDC                 mov     edx, [ebp+var_30]
  19. .text:00D4FEDF                 lea     ecx, [ebp+var_2C]
  20. .text:00D4FEE2                 mov     eax, off_DE80FC
  21. .text:00D4FEE7                 mov     eax, [eax]
  22. .text:00D4FEE9                 call    sub_661B68
  23. .text:00D4FEEE                 push    [ebp+var_2C]
  24. .text:00D4FEF1                 push    offset asc_D4FFA4 ; ": "
  25. .text:00D4FEF6                 lea     edx, [ebp+var_38]
  26. ; "Registriert" ("Зарегистрировано")
  27. .text:00D4FEF9                 mov     eax, offset off_D4F6E0
  28. .text:00D4FEFE                 call    sub_40C2C4
  29. .text:00D4FF03                 mov     edx, [ebp+var_38]
  30. .text:00D4FF06                 lea     ecx, [ebp+var_34]
Вызывается функция проверки, если она вернула AL=2, то в статус лицензии подставляется строка "Registriert". Сама функция проверки совсем маленькая, вызывается из множества мест, и везде проверяется равенство результата двойке.
  1. .text:00B7C224 sub_B7C224      proc near
  2. .text:00B7C224                 push    ebx
  3. .text:00B7C225                 push    esi
  4. .text:00B7C226                 mov     esi, eax
  5. .text:00B7C228                 xor     ebx, ebx
  6. .text:00B7C22A                 mov     eax, esi
  7. .text:00B7C22C                 call    sub_B7C21C
  8. .text:00B7C231                 test    al, al
  9. .text:00B7C233                 jz      short loc_B7C23F
  10. .text:00B7C235                 mov     bl, 1
  11. .text:00B7C237                 cmp     byte ptr [esi+19h], 0
  12. .text:00B7C23B                 jz      short loc_B7C23F
  13. .text:00B7C23D                 mov     bl, 2
  14. .text:00B7C23F loc_B7C23F:
  15. .text:00B7C23F                 mov     eax, ebx
  16. .text:00B7C241                 pop     esi
  17. .text:00B7C242                 pop     ebx
  18. .text:00B7C243                 retn
  19. .text:00B7C243 sub_B7C224      endp
Не мудрствуя лукаво, просто пропатчим функцию, записав в ее начало по адресу 00B7C224 пару команд MOV EAX,2 и RET. Сохраняем изменения, запускаем.

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

Триальное окно при старте не появляется, в заголовке главного окна и в окне "О программе" красуется надпись "Registered". По функционалу тоже никаких ограничений не наблюдается. Цель достигнута. Сигнатура для поиска очень приметная, поэтому сделать универсальный патч не составит никакого труда.

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

Комментарии

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

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

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

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