Blog. Just Blog

Исследование защиты программы HashTab Shell Extension

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

HashTab Shell Extension - расширение стандартного Проводника Windows, которое позволяет подсчитывать контрольные суммы и хэши файлов прямо на вкладке свойств. Собственно, никаких ограничений по функционалу в программе нет, вся разница между бесплатной и платной версией заключается только в надоедливой надписи, что программа не лицензирована для коммерческого использования. Так что это будет не совсем исследование защиты, а так, косметическая операция. В конце концов, нельзя же все ломать, надо на чем-то и сидеть :)

Забираем с офсайта дистрибутив, устанавливаем. Запускать тут нечего, HashTab Shell Extension просто регистрирует свою dll в системе и не имеет других исполняемых файлов. Файл ничем не упакован, отправляем его на разбор в дизассемблер.

Нам надо избавиться от картинки с восклицательным знаком, от надписи о некоммерческом использовании и от ссылки на приобретение лицензии. Давайте посмотрим, где это все находится.

Элементы диалогового окна в ресурсах
Элементы диалогового окна в ресурсах

В ресурсах dll находится диалоговое окно, которое вставляется в свойства Проводника. Можно отредактировать его, просто удалив ненужные элементы, но проблема в том, что это окно продублировано на множестве разных языков, исправлять каждый диалог слишком хлопотно. Лучше сделать так, чтобы элементы скрывались независимо от используемой локали, а для этого надо узнать их идентификаторы. В редакторе ресурсов определяем, что это 243 (0F3h), 244 (0F4h) и 252 (0FCh). Поищем что-нибудь в коде, связанное с этими значениями.
  1. .text:1000D7C0                 push    eax             ; hWnd
  2. .text:1000D7C1                 call    esi ; ShowWindow
  3. .text:1000D7C3                 cmp     [ebp+var_10BD], 0
  4. .text:1000D7CA                 jnz     short loc_1000D7DF
  5. .text:1000D7CC                 cmp     byte ptr [edi+0C6h], 0
  6. ; Отображать элемент
  7. .text:1000D7D3                 mov     [ebp+nCmdShow], 1
  8. .text:1000D7DD                 jz      short loc_1000D7E9
  9. .text:1000D7DF loc_1000D7DF:
  10. ; Не отображать элемент
  11. .text:1000D7DF                 mov     [ebp+nCmdShow], 0
  12. .text:1000D7E9 loc_1000D7E9:
  13. .text:1000D7E9                 push    0F3h            ; nIDDlgItem
  14. .text:1000D7EE                 push    dword ptr [edi+4] ; hDlg
  15. .text:1000D7F1                 call    ebx ; GetDlgItem
  16. .text:1000D7F3                 push    [ebp+nCmdShow]  ; nCmdShow
  17. .text:1000D7F9                 push    eax             ; hWnd
  18. .text:1000D7FA                 call    esi ; ShowWindow
  19. .text:1000D7FC                 cmp     [ebp+var_10BD], 0
  20. .text:1000D803                 jnz     short loc_1000D818
  21. .text:1000D805                 cmp     byte ptr [edi+0C6h], 0
  22. ; Отображать элемент
  23. .text:1000D80C                 mov     [ebp+nCmdShow], 1
  24. .text:1000D816                 jz      short loc_1000D822
  25. .text:1000D818 loc_1000D818:
  26. ; Не отображать элемент
  27. .text:1000D818                 mov     [ebp+nCmdShow], 0
  28. .text:1000D822 loc_1000D822:
  29. .text:1000D822                 push    0FCh            ; nIDDlgItem
  30. .text:1000D827                 push    dword ptr [edi+4] ; hDlg
  31. .text:1000D82A                 call    ebx ; GetDlgItem
  32. .text:1000D82C                 push    [ebp+nCmdShow]  ; nCmdShow
  33. .text:1000D832                 push    eax             ; hWnd
  34. .text:1000D833                 call    esi ; ShowWindow
  35. .text:1000D835                 push    0F4h            ; nIDDlgItem
  36. .text:1000D83A                 push    dword ptr [edi+4] ; hDlg
  37. .text:1000D83D                 call    ebx ; GetDlgItem
  38. ; Отображать или не отображать элемент
  39. .text:1000D83F                 movzx   ecx, [ebp+var_10BD]
  40. .text:1000D846                 xor     ecx, 1
  41. .text:1000D849                 push    ecx             ; nCmdShow
  42. .text:1000D84A                 push    eax             ; hWnd
  43. .text:1000D84B                 call    esi ; ShowWindow
  44. .text:1000D84D                 cmp     [ebp+arg_0], 0
  45. .text:1000D851                 jz      short loc_1000D87F
Все очень красиво и понятно. Последовательно выполняется несколько проверок, на основании первых двух устанавливается стиль отображения элементов - показывать их или скрывать, третий стиль устанавливается неявно, путем преобразования какого-то значения. Значит, для того, чтобы ненужные элементы не отображались в диалоговом окне, надо сделать так, чтобы стили отображения всегда были нулевыми. Для первых проверок можно подавить условные переходы по адресам 1000D7DD и 1000D816, а для последней обнулить регистр ECX перед его записью в стек. Лучший вариант - заменить команду по адресу 1000D846 на пару команд XOR ECX,ECX и NOP для сохранения размера кода. Сохраняем изменения, открываем вкладку со свойствами любого файла:

Интерфейс успешно модифицирован
Интерфейс успешно модифицирован

Красота! Никаких посторонних надписей и значков. Цель достигнута. А главное, что этот способ будет работать для всех языков, которые поддерживает это расширение.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (11.09.2018 в 10:25):
Впервые слышу про 64-битные системы.
Serg0FFan (31.08.2018 в 12:56):
Для 64 битной бы адреса :)
pawel97 (15.08.2018 в 14:44):
> Лучший вариант - заменить команду по адресу 1000D846
Или по 1000D7C3 поменять cmp *,0 на or *,1, остальное патчить не нужно.
pawel97 (15.08.2018 в 13:16):
В tc4shell есть и хеши, и открытие любых архивов прямо в проводнике, и другие полезные плюшки. Жаль что недавно стал шароварой и накрыт vmprotect, имхо непозволительно для продукта, 90% которого составляют opensource компоненты...
p.s. Большинство исследуемого тут софта каким-нибудь боком относится к картинкам. PhotoInstrument - отличный пример хорошей защиты без всяких протекторов. Интересен профессиональный разбор.
Не запрос, софт по назначению не нужен, а если бы нужен был - есть не особо старые версии.
ManHunter (15.08.2018 в 01:55):
Так можно сказать практически про каждую шаровару, что есть какой-то бесплатный аналог, который делает то же самое. Но смысл статьи не в поиске аналогов, а в совершенствовании навыков исследования кода.
Anonymous (15.08.2018 в 01:34):
Как вариант, сразу воспользоваться бесплатной и свободной HashCheck (https://github.com/gurnec/HashCheck/), которая делает абсолютно то же самое, но без всяких надписей.

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

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

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