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

Скриншот программы VCap Downloader
Программа VCap Downloader позволяет сохранять видео и аудио с различных хостингов. Работает на движке браузера Chrome, по интерфейсу очень сильно этот браузер напоминает. Вы просто переходите по ссылкам в основном окне, а справа появляются предложения на загрузку. В незарегистрированном варианте часть функций закрыты, в том числе и сохранение видео в хорошем качестве. Но раз уж мы собрались тырить видосики, то попутно притырим и инструмент для их скачивания.
Забираем с сайта дистрибутив последней версии, устанавливаем. В процессе установки загружаются дополнительные компоненты, без них ничего работать не будет. После установки смотрим, что и как. Сразу бросается в глаза надпись "Незарегистрировано" в заголовке главного окна. С этого и начнем. Хотя начать надо, конечно, с дизассемблера, но вы это и так хорошо знаете.

Строка в языковом файле
Программа мультиязычная, соответствующий языковой файл находится в папке Languages. Код строки 10776 или 2A18h, если смотреть в шестнадцатеричной системе счисления. Код, в котором используется это значение, выглядит следующим образом:
Code (Assembler) : Убрать нумерацию
- ; Загрузить в AL флаг регистрации
- .text:004E6444 mov al, byte_6BEEEC
- .text:004E6449 loc_4E6449:
- .text:004E6449 test al, al
- ; Если он не нулевой, то перепрыгнуть загрузку строки
- .text:004E644B jnz loc_4E657E
- ; Загрузить строку "Незарегистрированная"
- .text:004E6451 mov ecx, 2A18h
- .text:004E6456 call sub_581980
- .text:004E645B mov edx, eax

Перекрестные ссылки на флаг
Фигвам. Только проверки или же загрузка значения флага. Никаких прямых инициализиаций. Ничего страшного, там, где не помогает дизассемблер, поможет отладчик. Загружаем программу в отладчик и ставим хардварную точку останова на запись в байт памяти по адресу 006BEEEC.

Ставим точку останова
Запускаем программу на выполнение. Запись в память сработает только в двух местах.
Code (Assembler) : Убрать нумерацию
- ; Первая инициализация флага регистрации
- .text:0058E9D9 mov byte ptr [ecx+4], 0
- .text:0058E9DD mov dword ptr [ecx+8], 0
- .text:0058E9E4 mov dword ptr [eax+10h], 0
- .text:0058E9EB cmp dword ptr [eax+14h], 8
Code (Assembler) : Убрать нумерацию
- .text:0058EF7D mov eax, dword_6BEDD0
- ; Вторая инициализация флага регистрации
- .text:0058EF82 mov [edi+4], bl
- .text:0058EF85 test eax, eax
- .text:0058EF87 jz short loc_58EF9C
- .text:0058EF89 push eax
- .text:0058EF8A push 59E68620h
- .text:0058EF8F call sub_58E5F0
- .text:0058EF94 add esp, 4

Программа успешно "зарегистрирована"
Но устранены только внешние проявления, расширенный функционал программы все еще заблокирован. И везде рядом с заблокированными пунктами меню присутствует надпись "PRO" жирным шрифтом. Поищем эту строку в файле. Обнаружатся следующие юникодные конструкции, хорошо подходящие под структуру надписей в менюшках.

Строка в файле
Давайте посмотрим, где и как они вызываются.
Code (Assembler) : Убрать нумерацию
- .text:004611E7 cmp byte ptr [esi+50h], 1
- .text:004611EB jnz short loc_461207
- .text:004611ED cmp byte ptr [ebx+24h], 1
- .text:004611F1 jnz short loc_461207
- .text:004611F3 push 5
- .text:004611F5 push offset aPro_0 ; "#PRO#"
- .text:004611FA lea ecx, [ebp+lpNewItem]
- .text:004611FD mov edi, 401h
- .text:00461202 call loc_407820
Code (Assembler) : Убрать нумерацию
- .text:00460C67 jz loc_461D2B
- ; Вызвать функцию проверки
- .text:00460C6D call sub_5603F0
- ; EAX=0 - не зарегистрирована
- .text:00460C72 test eax, eax
- .text:00460C74 jz short loc_460C7F
- ; EAX=2 - не зарегистрирована
- .text:00460C76 cmp eax, 2
- .text:00460C79 jz short loc_460C7F
- .text:00460C7B xor al, al
- .text:00460C7D jmp short loc_460C81
- .text:00460C7F ; ---------------------------------------
- .text:00460C7F loc_460C7F:
- ; Флаг "не зарегистрирована"
- .text:00460C7F mov al, 1
- .text:00460C81 loc_460C81:
- ; Сохранить значение флага
- .text:00460C81 mov [ebx+24h], al
- ; Вызвать функцию проверки
- .text:00460C84 call sub_5603F0
- ; EAX=3 - не зарегистрирована
- .text:00460C89 cmp eax, 3
- .text:00460C8C setz al
- ; Какой-то дополнительный флаг
- .text:00460C8F mov [ebx+25h], al
- .text:00460C92 jnz short loc_460CA4
- .text:00460C94 call sub_5603F0
- ; EAX=5 - не зарегистрирована
- .text:00460C99 cmp eax, 5
- .text:00460C9C jnz short loc_460CA4
- .text:00460C9E mov word ptr [ebx+24h], 1
Code (Assembler) : Убрать нумерацию
- .text:005603F0 sub_5603F0 proc near
- .text:005603F0 push esi
- .text:005603F1 push edi
- .text:005603F2 mov edi, ds:OpenMutexW
- .text:005603F8 push offset aLocalB7df3bc_0
- ; "Local\\{B7DF3BCE-B146-4b00-8783-12BD0DFD"...
- .text:005603FD push 0 ; bInheritHandle
- .text:005603FF push 100000h ; dwDesiredAccess
- .text:00560404 call edi ; OpenMutexW
- .text:00560406 mov esi, eax
- .text:00560408 test esi, esi
- .text:0056040A jz short loc_560422
- .text:0056040C push esi ; hMutex
- .text:0056040D call ds:ReleaseMutex
- .text:00560413 push esi ; hObject
- .text:00560414 call ds:CloseHandle
- .text:0056041A pop edi
- .text:0056041B mov eax, 2
- .text:00560420 pop esi
- .text:00560421 retn
- .text:00560422 loc_560422:
- .text:00560422 push offset aLocalB7df3bc_1
- ; "Local\\{B7DF3BCE-B146-4b00-8783-12BD0DFD"...
- .text:00560427 push 0 ; bInheritHandle
- .text:00560429 push 100000h ; dwDesiredAccess
- .text:0056042E call edi ; OpenMutexW
- .text:00560430 mov esi, eax
- .text:00560432 test esi, esi
- .text:00560434 jz short loc_56044C
- .text:00560436 push esi ; hMutex
- .text:00560437 call ds:ReleaseMutex
- .text:0056043D push esi ; hObject
- .text:0056043E call ds:CloseHandle
- .text:00560444 pop edi
- .text:00560445 mov eax, 1
- .text:0056044A pop esi
- .text:0056044B retn
- .text:0056044C loc_56044C:
- .text:0056044C push offset aLocalB7df3bc_2
- ; "Local\\{B7DF3BCE-B146-4b00-8783-12BD0DFD"...
- .text:00560451 push 0 ; bInheritHandle
- .text:00560453 push 100000h ; dwDesiredAccess
- .text:00560458 call edi ; OpenMutexW
- .text:0056045A mov esi, eax
- .text:0056045C test esi, esi
- .text:0056045E jz short loc_560476
- .text:00560460 push esi ; hMutex
- .text:00560461 call ds:ReleaseMutex
- .text:00560467 push esi ; hObject
- .text:00560468 call ds:CloseHandle
- .text:0056046E pop edi
- .text:0056046F mov eax, 3
- .text:00560474 pop esi
- .text:00560475 retn
- .text:00560476 loc_560476:
- .text:00560476 pop edi
- .text:00560477 xor eax, eax
- .text:00560479 pop esi
- .text:0056047A retn
- .text:0056047A sub_5603F0 endp
Просмотров: 728 | Комментариев: 1
Метки: исследование защиты, мультимедиа

Комментарии
Отзывы посетителей сайта о статье
Fury
(21.04.2024 в 12:18):
Hello Master, there must be something wrong here. I tried both methods but I did not get any results.

Добавить комментарий
Заполните форму для добавления комментария
