Blog. Just Blog

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

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

Zeta Debugger, по заявлению его создателя, представляет собой отладчик с поддержкой отладочной информации, оставляемой некоторыми компиляторами в файлах. На самом деле все не так. И без того небогатый функционал этого неуклюжего поделия напрочь убивается чудовищным вырвиглазным интерфейсом "добро пожаловать в 90-е". А главный прикол в том, что этот отладчик еще и платный. К счастью, проект давно загнулся, но это как раз тот случай, когда ни капельки не жалко.

Офсайт недоступен, ссылки на скачивание не работают, но у меня в закромах завалялся дистрибутив версии 1.4. В интернетах мне удалось наковырять более свежую версию 1.5, но там урезанная бесплатная версия, которая не регистрируется. Да и не вижу смысла гоняться за последним релизом.

Устанавливаем, смотрим. Главный исполняемый файл ничем не упакован, поэтому отправляем отладчик в дизассемблер. Мммм, как звучит-то!

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

Если внимательно посмотреть на окно регистрации, то можно заметить, что поле ввода регистрационного имени заблокировано. В него принудительно вписывается имя учетной записи пользователя. Это означает, что регистрация привязывается как минимум к этой информации, и сделать универсальное решение на основе серийного номера не получится.

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

Картинка в ресурсах
Картинка в ресурсах

И обнаруживается вот что. Вместо обычного сообщения о правильной регистрации в программе используется КАРТИНКА попугайской расцветки! По всей видимости, в случае успеха на нее заменяется картинка в окне регистрации. Индекс этой картинки 200, что в hex-значении равняется 0C8h. Поищем в коде, где это значение используется. Таких мест найдется несколько, но только одно относится к ресурсам:
  1. .text:00426E79                 call    ds:SetCursor
  2. .text:00426E7F                 push    offset byte_46731C ; lpString
  3. .text:00426E84                 mov     edx, dword_46736C
  4. .text:00426E8A                 push    edx             ; hWnd
  5. .text:00426E8B                 call    ds:SetWindowTextA
  6. .text:00426E91                 push    1               ; uIDEvent
  7. .text:00426E93                 mov     eax, [ebp+hWnd]
  8. .text:00426E96                 push    eax             ; hWnd
  9. .text:00426E97                 call    ds:KillTimer
  10. .text:00426E9D                 mov     ecx, dword_46739C
  11. .text:00426EA3                 push    ecx             ; ho
  12. .text:00426EA4                 call    ds:DeleteObject
  13. ; Загрузить картинку из ресурсов
  14. .text:00426EAA                 push    0C8h            ; lpName
  15. .text:00426EAF                 mov     edx, hModule
  16. .text:00426EB5                 push    edx             ; hModule
  17. .text:00426EB6                 call    sub_453600
  18. .text:00426EBB                 add     esp, 8
  19. .text:00426EBE                 mov     dword_46739C, eax
  20. .text:00426EC3                 push    0               ; bErase
  21. .text:00426EC5                 push    offset stru_4673A0 ; lpRect
  22. .text:00426ECA                 mov     eax, [ebp+hWnd]
  23. .text:00426ECD                 push    eax             ; hWnd
  24. ; Перерисовать окно
  25. .text:00426ECE                 call    ds:InvalidateRect
Чуть выше условие, при котором этот блок срабатывает:
  1. .text:00426DD3                 cmp     [ebp+var_108], 10h
  2. .text:00426DDA                 jnz     loc_426F22
Прокручиваем еще выше на то место, где инициализируется переменная [ebp+var_108]:
  1. .text:00426D38                 call    sub_427029
  2. .text:00426D3D                 add     esp, 8
  3. .text:00426D40                 mov     [ebp+var_108], eax
Итого, по результатам работы функции sub_427029 принимается решение о корректности регистрационных данных. Для правильного серийника она должна вернуть значение 10h. Что ж, осталось ее в этом убедить :) Записываем в начало функции проверки пару команд MOV EAX,10h и RET. Сохраняем изменения, запускаем. Окно регистрации не появляется, но и программа через доли секунды закрывается без каких-либо видимых причин. Есть подозрение, что в программе заложена проверка целостности. Хорошо, возвращаем исходный файл, запускаем отладчик под отладчиком (мммм....), ставим точку останова на адрес 0427029 и стартуем на выполнение. Когда точка останова сработает, то патчим начало функции напрямую в памяти. Отпускаем отладку, так и есть, окно регистрации не появляется, программа не закрывается. Проверка целостности файла действительно присутствует.

После каждого запуска отладчика в папке с программой создается файл zd.log. При обычном запуске процесс работы выглядит примерно так:

22 Starting main loop
23 [437103]: cmdline='"C:\Program Files\ZD\zd.exe" '
24 SAMPLE PLUG-IN: Shutting down...
25 Shutting down the debugger...
26 [401088]: OK

А вот при запуске патченного файла в лог добавляется интересная строчка:

22 Starting main loop
23 [437103]: cmdline='"C:\Program Files\ZD\zd.exe" '
24 [440883]: Patrol failedSAMPLE PLUG-IN: Shutting down...
25 Shutting down the debugger...
26 [401088]: OK

Несложно догадаться, что это и есть реакция защиты от изменений. Вернемся в дизассемблер и посмотрим, где эта строчка проявляется:
  1. .text:00440861                 add     eax, 0F0h
  2. .text:00440866                 mov     dword_46B938, eax
  3. ; Проверка
  4. .text:0044086B                 cmp     dword_46B938, 100h
  5. ; Условный переход в случае несовпадения
  6. .text:00440875                 jnz     short loc_440879
  7. ; Перепрыгнуть вывод строки
  8. .text:00440877                 jmp     short loc_440812
  9. .text:00440879 ; ------------------------------------------
  10. .text:00440879 loc_440879:
  11. .text:00440879                 push    offset aPatrolFailed
  12. ; "Patrol failed"
  13. .text:0044087E                 call    sub_44FEAA
  14. .text:00440883                 add     esp, 4
  15. .text:00440886                 mov     eax, [ebp+arg_4]
  16. .text:00440889                 mov     ecx, hWndNewParent
  17. .text:0044088F                 mov     [eax], ecx
Забиваем NOP'ами условный переход по адресу 00440875. Сохраняем изменения, запускаем. Окна регистрации нет, лог чистый, программа не закрывается.

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

Для чистоты эксперимента переведем системное время на пару месяцев вперед, программа все так же работает. Цель достигнута. Можно запускать деинсталлятор и удалять этого монстра с жесткого диска.

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

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

Комментарии

Отзывы посетителей сайта о статье
user (28.03.2018 в 22:44):
..просто не сразу разобрался, что "region59" туда тоже относится.
user (28.03.2018 в 22:31):
Да, так и есть.
ManHunter (27.03.2018 в 16:30):
Хз, файл на месте, никуда не девался. Может местный провайдер режет доступ к Я.Диску?
user (25.03.2018 в 23:17):
-- Добавлено --
Скачалась нормально версия 1.4 отсюда: www.duote.com/soft/1953.html
user (25.03.2018 в 16:54):
Что-то дистрибутив версии 1.4 не скачивается из указанного места.
И вообще, найти его в сети не удаётся.
В вебархиве только его версия 1.5.
ManHunter (24.03.2018 в 10:10):
Все когда-то было, но это же не причина, чтобы больше ничего не делать.
xussr (24.03.2018 в 04:26):
Не впечатлило уже проходилили подобное -
ManHunter (23.03.2018 в 21:32):
Интерфейс напоминает "домашние странички" времен становления интернета. Не хватает только анимации с вращающимися e-mail, бегающими собачками, Comic Sans и прочего днища.
pawel97 (23.03.2018 в 21:10):
Загнулся, вырвиглазный, не жалко, неуклюжее поделие, но дистриб оставлю :)
Хоткеи аффтар делал по принципу лишь бы не как у всех.

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

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

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