Blog. Just Blog

Исследование защиты программы GiMeSpace Cam Control Pro

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

GiMeSpace Cam Control Pro предназначена для управления компьютером при помощи жестов руками перед камерой. Можно листать страницы, эмулировать действия курсора, управлять рабочим столом. Наверное, в некоторых случаях имеет место быть, если бы не ограничение по времени работы.

Скачиваем с офсайта дистрибутив, устанавливаем, смотрим. По характерным названиям и количеству секций можно определить, что использован навесной протектор Armadillo. Любой специализированный анализатор исполняемых файлов эту догадку подтверждает. При старте появляется уведомление о количестве оставшихся дней:

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

Снимаем навесной протектор при помощи утилиты ArmaGeddon. Распаковка проходит успешно, все опции защиты успешно нейтрализуются, импорт также восстанавливается без проблем в автоматическом режиме.

Распаковываем файл
Распаковываем файл

Но при попытке запуска распакованного файла он падает с ошибкой:

Сообщение об ошибке
Сообщение об ошибке

Грустить по этому поводу не будем, пока займемся очисткой распакованного файла от ненужных данных. Для этого воспользуемся программой CFF Explorer. Удаляем секции не только из заголовка файла, но и само их содержимое.

Удаляем ненужные секции
Удаляем ненужные секции

Под удаление попадают секции протектора .text1, .adata, .data1, .reloc1 и .pdata. После этого файл "худеет" практически в половину. Ошибка запуска остается. Ну ничего, стабильность в этом случае подтверждает, что удаление секций никак не повлияло на (не)работоспособность. Переходим к следующему инструменту - Armadillo Environment Variables Finder.

Результат анализа файла
Результат анализа файла

По результатам проверки выясняем, что в файле используется стандартная переменная окружения DAYSINSTALLED протектора Armadillo. Логично предположить, что триал реализован средствами навесного протектора, текст сообщения ошибки тоже намекает, что программа пытается получить какое-то значение, а оно возвращается не в виде числа. Очень похоже, что это как раз связано с попыткой запросить количество оставшихся дней из данных протектора. Берем следующий инструмент - Armadillo Environment Variables Injector, чтобы эмулировать эту переменную.

Патчим переменную окружения
Патчим переменную окружения

Патчим переменную DAYSINSTALLED каким-нибудь небольшим значением. Проверяем работоспособность файла, теперь появляется триальное окно с числом за вычетом пропатченного значения, а программа запускается в пробном режиме. Ошибка при запуске пропала, догадка оказалась верной. Отправляем распакованный файл в дизассемблер. Несмотря на то, что триал реализован с помощью навесного протектора, сама обработка триала выполняется средствами самой программы. Вот тут выводится сообщение со счетчиком дней:
  1. .text:00487350 sub_487350      proc near
  2. .text:00487350                 push    ebp
  3. .text:00487351                 mov     ebp, esp
  4. .text:00487353                 push    0
  5. .text:00487355                 push    0
  6. .text:00487357                 push    0
  7. .text:00487359                 push    ebx
  8. .text:0048735A                 xor     eax, eax
  9. .text:0048735C                 push    ebp
  10. .text:0048735D                 push    offset loc_4873EC
  11. .text:00487362                 push    dword ptr fs:[eax]
  12. .text:00487365                 mov     fs:[eax], esp
  13. .text:00487368                 lea     edx, [ebp+var_4]
  14. .text:0048736B                 mov     eax, offset aDaysinstalled
  15. ; "DAYSINSTALLED"
  16. .text:00487370                 call    sub_40E3CC
  17. .text:00487375                 mov     eax, [ebp+var_4]
  18. .text:00487378                 call    sub_408E38
  19. .text:0048737D                 mov     ebx, eax
  20. .text:0048737F                 cmp     ebx, 1
  21. .text:00487382                 mov     eax, off_48B498
  22. .text:00487387                 setnle  byte ptr [eax]
  23. .text:0048738A                 call    sub_482394
  24. .text:0048738F                 cmp     ebx, eax
  25. .text:00487391                 jge     short loc_487395
  26. .text:00487393                 mov     ebx, eax
  27. .text:00487395 loc_487395:
  28. .text:00487395                 cmp     ebx, 1Eh
  29. .text:00487398                 jle     short loc_48739F
  30. .text:0048739A                 mov     ebx, 1Eh
  31. .text:0048739F loc_48739F:
  32. .text:0048739F                 lea     edx, [ebp+var_C]
  33. .text:004873A2                 mov     eax, 1Eh
  34. .text:004873A7                 sub     eax, ebx
  35. .text:004873A9                 call    sub_408CFC
  36. .text:004873AE                 mov     ecx, [ebp+var_C]
  37. .text:004873B1                 lea     eax, [ebp+var_8]
  38. .text:004873B4                 mov     edx, offset aFreeTrialDaysL
  39. ; "Free trial days left: "
  40. .text:004873B9                 call    sub_404C20
  41. .text:004873BE                 mov     eax, [ebp+var_8]
  42. .text:004873C1                 call    sub_437F6C
  43. .text:004873C6                 cmp     ebx, 1Eh
  44. .text:004873C9                 jl      short loc_4873CF
Ого, целая процедура для вывода сообщения. Давайте посмотрим, откуда и при каких условиях она вызывается:
  1. ; Вызвать функцию проверки регистрации
  2. .itext:00488906                 call    sub_483340
  3. .itext:0048890B                 mov     edx, off_48B54C
  4. ; Сохранить ее результат
  5. .itext:00488911                 mov     [edx], al
  6. .itext:00488913                 mov     eax, off_48B54C
  7. ; Проверить сохраненный результат
  8. .itext:00488918                 cmp     byte ptr [eax], 0
  9. .itext:0048891B                 jnz     short loc_48896C
  10. ; Вывести сообщение со счетчиком
  11. .itext:0048891D                 call    sub_487350
  12. .itext:00488922                 test    al, al
  13. .itext:00488924                 jz      short loc_488952
  14. .itext:00488926                 call    sub_482E60
  15. .itext:0048892B                 test    al, al
  16. .itext:0048892D                 jnz     short loc_488938
  17. .itext:0048892F                 push    0               ; nExitCode
Вроде все понятно. Вызывается какая-то функция проверки регистрации, сохраняется ее результат, потом он проверяется и по результату или выводится сообщение с триальным счетчиком, или нет. Патчим начало функции проверки по адресу 00483340 парой команд MOV AL,1 и RET. Сохраняем изменения, проверяем.

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

Триальное окно исчезло, вкладка "Help and Registration" превратилась в "Help", перевод часов на программу не влияет. Цель достигнута, можно осваивать новый инструмент. Заодно освежили в памяти как работать с инструментарием против Armadillo.

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

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

Комментарии

Отзывы посетителей сайта о статье
0101 (02.04.2022 в 20:20):
Что-то x32dbg и hiew32 не видят ссылки на 00487350, хотя адрес указан явно..
voffka (02.04.2022 в 20:04):
Занопать
00483685 JNZ 0048369A
или
004836A2 JNZ 004836B7
и готово

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

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

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