Blog. Just Blog

Исследование защиты программы USB Low-Level Format

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

Утилита USB Low-Level Format предназначена для низкоуровнего форматирования карт памяти и USB-накопителей различных производителей (поддерживается более 20 типов контроллеров). При форматировании не только стирается вся информация, но также все параметры накопителя сбрасываются к заводским значениям. В некоторых случаях это позволяет даже восстановить неисправные накопители, например, у которых некорректно определяется емкость. Кроме того после форматирования можно сразу сделать загрузочную флешку. В бесплатном режиме USB Low-Level Format позволяет форматировать накопители емкостью не более 2GB. Машины времени, чтобы вернуться на много лет назад в эпоху таких емкостей, у меня нет, зато есть дизассемблер и отладчик, чтобы привести утилиту к реалиям нашего времени.

Забираем с офсайта дистрибутив, устанавливаем, смотрим что и как. Основной исполняемый файл ничем не упакован, отправляем его на разбор в дизассемблер. Теперь попытаемся определить признаки незарегистрированной программы. Для этого надо просто попытаться отформатировать диск большой емкости. Появится следующее сообщение:

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

Вроде все понятно, но вот незадача, ни одну из этих строк в программе не найти, ни в юникоде, ни простым текстом. Зато обнаруживается текст из заголовка окна "Warning", а рядом с ним что-то интересное, явно не код и не случайные бинарные данные.

Зашифрованная строка в файле
Зашифрованная строка в файле

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

Теперь давайте вернемся в дизассемблер и посмотрим, где и при каких условиях выводится сообщение об ограничениях.
  1. .text:004843ED                 call    @Controls@TControl@GetText$qqrv
  2. .text:004843F2                 mov     edx, [ebp+var_54]
  3. .text:004843F5                 lea     ecx, [ebp+var_3C]
  4. .text:004843F8                 mov     eax, [ebp+var_38]
  5. .text:004843FB                 call    sub_4823A0
  6. .text:00484400                 mov     eax, [ebp+var_20]
  7. .text:00484403                 mov     edx, offset _str_GB_1.Text
  8. ; Емкость носителя должна быть в GB...
  9. .text:00484408                 call    @System@@LStrCmp$qqrv
  10. .text:0048440D                 jnz     loc_484552
  11. .text:00484413                 fild    [ebp+var_48]
  12. .text:00484416                 fld     ds:tbyte_4864DC
  13. .text:0048441C                 fcompp
  14. .text:0048441E                 fstsw   ax
  15. .text:00484421                 sahf
  16. ; ... и их количество должно быть не больше 2
  17. .text:00484422                 jnb     loc_484552
  18. .text:00484428                 mov     eax, [ebp+var_38]
  19. ; Проверить признак зарегистрированности
  20. .text:0048442B                 cmp     byte ptr [eax+432h], 0
  21. .text:00484432                 jz      loc_484552
  22. ; Вывести сообщение об ограничении функционала
  23. .text:00484438                 lea     edx, [ebp+var_58]
  24. .text:0048443B                 mov     eax, off_490008
  25. .text:00484440                 mov     eax, [eax]
  26. .text:00484442                 call    @Forms@TApplication@GetTitle$qqrv
  27. .text:00484447                 push    [ebp+var_58]
  28. .text:0048444A                 push    offset _str___57.Text
  29. .text:0048444F                 lea     edx, [ebp+var_5C]
  30. .text:00484452                 mov     eax, offset _str_epft_opu_tvqqps.Text
  31. .text:00484457                 call    sub_4800BC
  32. .text:0048445C                 push    [ebp+var_5C]
  33. .text:0048445F                 push    offset _str___58.Text
  34. .text:00484464                 push    offset _str___59.Text
  35. .text:00484469                 lea     edx, [ebp+var_60]
  36. .text:0048446C                 mov     eax, offset _str_Ep_zpv_xbou_up_.Text
  37. .text:00484471                 call    sub_4800BC
  38. .text:00484476                 push    [ebp+var_60]
  39. .text:00484479                 lea     eax, [ebp+var_4]
  40. .text:0048447C                 mov     edx, 6
  41. .text:00484481                 call    @System@@LStrCatN$qqrv
  42. .text:00484486                 push    4               ; uType
  43. .text:00484488                 push    offset aWarning ; "Warning"
  44. .text:0048448D                 mov     eax, [ebp+var_4]
  45. .text:00484490                 call    @System@@LStrToPChar
  46. .text:00484495                 push    eax             ; lpText
  47. .text:00484496                 mov     eax, [ebp+var_38]
  48. .text:00484499                 call    @Controls@TWinControl@GetHandle$qqrv
  49. .text:0048449E                 push    eax             ; hWnd
  50. .text:0048449F                 call    MessageBoxA_0
  51. .text:004844A4                 mov     ebx, eax
Тут выполняется несколько проверок. Сперва, как я понял, проверяются единицы емкости накопителя. Это должна быть строка "GB". Если емкость носителя измеряется в "MB", то так и быть, форматируем бесплатно. Затем проверяется, собственно, значение этой емкости. Оно должно быть не более 2. Ну и на последнем шаге выполняется самая интересная проверка: байт по адресу [eax+432h] сравнивается с нулевым значением. Если там не ноль, то никаких сообщений не выводится, форматирование выполняется в штатном режиме. Что-то мне подсказывает, что это и есть признак зарегистрированности. Вернемся в начало дизассемблерного листинга и поищем что-нибудь по сигнатуре "+432h]". Обнаружится вот такой код:
  1. .text:0048395E                 call    dword ptr [edx+44h]
  2. .text:00483961                 xor     eax, eax
  3. .text:00483963                 call    sub_48CCBC
  4. ; Обнулить регистр EAX
  5. .text:00483968                 xor     eax, eax
  6. ; Обнулить два флага
  7. .text:0048396A                 mov     [ebx+432h], al
  8. .text:00483970                 mov     [ebx+433h], al
  9. .text:00483976                 mov     byte ptr [ebx+430h], 0
  10. .text:0048397D                 lea     edx, [ebp+var_20]
  11. .text:00483980                 xor     eax, eax
  12. .text:00483982                 call    @System@ParamStr$qqri
Почему я обратил внимание именно на это место? Во-первых, оно находится в самом начале функции создания главного окна. Во-вторых, тут есть еще один соседний флажок [ebx+433h], который, если посмотреть дальше по коду, тоже постоянно светится то рядом с зашифрованными строками, то рядом с манипуляциями с флагом регистрации. Нашим проще. Заменяем двухбайтную команду XOR EAX,EAX по адресу 00483968 на двухбайтную команду MOV AL,1 и сохраняем изменения.

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

Кнопка "Upgrade" пропала, в заголовке красуется надпись "Pro", при попытке отформатировать накопитель большой емкости никаких сообщений не выводится, а само форматирование выполняется без каких-либо ограничений. Цель достигнута. А кроме того, пропатченная программа теперь может работать со съемного носителя.

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (31.01.2022 в 17:30):
*ANY* requests are strictly prohibited. Here is not bureau of good offices.
Rattlesnake (31.01.2022 в 17:14):
Great work indeed.. This is the first 100% crack of this I have ever seen..

[deleted]
ManHunter (31.01.2022 в 02:03):
Ну дык, нашим легче.
voffka (30.01.2022 в 14:07):
Классика жанра. Кто-то из разработчиков выпиливает весь функционал, и ради прикола оставляет окна регистрации, а кто-то выпиливает все проверки ключей и функционал проверяет булом isdemo.

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

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

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