Исследование защиты программы Duplicate Video Search
Скриншот программы Duplicate Video Search
Программа Duplicate Video Search предназначена для поиска дубликатов видеофайлов. В отличие от программ аналогичного назначения, которые ищут точные копии по совпадению сигнатур, Duplicate Video Search позволяет обнаруживать все копии видео, включая те, которые были сконвертированы в другие видеоформаты или имеют другое качество и разрешение. Если вы владеете большой видеоколлекцией, то такая программа наверняка вам пригодится. Только вот платить деньги за программу, чтобы затем с ее помощью шерстить коллекцию пиратских фильмов, я не собираюсь.
Скачиваем дистрибутив, устанавливаем, смотрим. С первого же взгляда становится ясно, что исполняемый файл упакован. Анализаторы файлов говорят, что это Obsidium. Противник серьезный, на сегодняшний день для него нет публичных распаковщиков. Но пока не будем расстраиваться и посмотрим, какие у программы есть ограничения.
Сообщение незарегистрированной программы
Из того, что я смог найти, это ограничение по количеству отображаемых дубликатов. В незарегистрированной версии показывается не более 10 найденных файлов и сопровождается это вот таким сообщением.
Попробуем пока обойтись без распаковки и без снятия протектора. Просто запустим программу и снимем дамп памяти, когда она будет распакована. Дамп, естественно, получится нерабочим, но зато можно будет загнать его в дизассемблер и посмотреть, что там вообще происходит.
Делаем дамп программы
Запускаем PE Tools, выбираем нужный процесс, делаем полный дамп. После этого отправляем полученный дамп в наш любимый дизассемблер. По тексту выдаваемого сообщения выходим на следующий код:
Code (Assembler) : Убрать нумерацию
- seg000:0040958B call sub_408D10
- seg000:00409590 add esp, 8
- ; Неявный вызов функции проверки
- seg000:00409593 call dword_54D4A8
- seg000:00409599 test al, al
- ; Если она вернула AL!=0, то показать все результаты
- seg000:0040959B jnz loc_409648
- seg000:004095A1 mov eax, [esi+1Ch]
- ; Найдено больше 10 файлов?
- seg000:004095A4 cmp eax, 0Ah
- ; Да, тоже не показывать сообщение
- seg000:004095A7 jle loc_409648
- seg000:004095AD push eax
- seg000:004095AE lea ecx, [ebp+var_114]
- ; Вывести сообщение о триальности
- seg000:004095B4 push offset aDDuplicatesWer
- ; "%d duplicates were found. In TRIAL vers"...
- seg000:004095B9 push ecx
- seg000:004095BA call dword_54D1EC
Но перед там, как начать делать лоадер, надо найти все участки, где вызывается функция проверки. По перекрестным ссылкам выходим на еще один очень похожий код:
Code (Assembler) : Убрать нумерацию
- seg000:0040A402 call dword_54D1EC
- seg000:0040A408 add esp, 10h
- ; Вызвать функцию проверки
- seg000:0040A40B call dword_54D4A8
- seg000:0040A411 test al, al
- ; Если AL!=0, то перепрыгиваем
- seg000:0040A413 jnz short loc_40A443
- seg000:0040A415 mov eax, [esi+14h]
- seg000:0040A418 mov ecx, edi
- seg000:0040A41A lea ebx, [ebx+0]
- seg000:0040A420 loc_40A420:
- seg000:0040A420 cmp eax, ebx
- seg000:0040A422 jz short loc_40A443
- ; Если какой-то счетчик больше 10, то переход
- ; Очевидно, что это тоже счетчик отображаемых дубликатов
- seg000:0040A424 cmp ecx, 0Ah
- seg000:0040A427 jge short loc_40A430
- seg000:0040A429 mov eax, [eax+4]
- seg000:0040A42C add ecx, edi
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------
- ; Loader example
- ;-------------------------------------------------------------
- format PE GUI 4.0
- entry start
- include 'win32a.inc'
- ;-------------------------------------------------------------
- section '.data' data readable writeable
- sinfo STARTUPINFO
- pinfo PROCESS_INFORMATION
- procid dd ?
- tmp dd ?
- ;-------------------------------------------------------------
- section '.code' code readable executable
- start:
- ; Создать процесс с пробросом командной строки
- invoke GetCommandLine
- invoke CreateProcess,fname,eax,NULL,NULL,NULL,\
- NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo
- or eax,eax
- jnz @f
- ; Файл не найден
- invoke MessageBox,0,err1,errt,MB_OK
- jmp loc_exit
- @@:
- ; Небольшая пауза для отработки протектора
- invoke Sleep,400
- @@:
- invoke Sleep,100
- ; Приостановить выполнение программы
- invoke SuspendThread,[pinfo.hThread]
- ; Процесс еще активен?
- invoke GetExitCodeProcess,[pinfo.hProcess],procid
- cmp [procid],STILL_ACTIVE
- jne loc_exit
- ; Файл распакован в памяти?
- invoke ReadProcessMemory,[pinfo.hProcess],0040959Bh,tmp,4,NULL
- ; Возобновить выполнение программы
- invoke ResumeThread,[pinfo.hThread]
- ; Контрольные байты, которые должны быть в распакованном файле
- cmp [tmp],00A7850Fh
- jne @b
- ; Приостановить выполнение программы
- invoke SuspendThread,[pinfo.hThread]
- ; Пропатчить процесс в памяти
- invoke WriteProcessMemory,[pinfo.hProcess],0040959Bh,patch1,2,NULL
- invoke WriteProcessMemory,[pinfo.hProcess],0040A413h,patch2,1,NULL
- ; Возобновить выполнение программы
- invoke ResumeThread,[pinfo.hThread]
- loc_exit:
- invoke ExitProcess,0
- ; Байты для патча в памяти
- patch1 db 090h,0E9h
- patch2 db 0EBh
- errt db 'Error',0
- err1 db 'File not found: '
- fname db 'vsp.exe',0
- ;-------------------------------------------------------------
- section '.idata' import data readable writeable
- library kernel32,'kernel32.dll',\
- user32,'user32.dll'
- include 'apia\kernel32.inc'
- include 'apia\user32.inc'
- ;-------------------------------------------------------------
- section '.rsrc' resource data readable
- directory RT_ICON,icons,\
- RT_GROUP_ICON,group_icons
- resource icons,\
- 1,LANG_NEUTRAL,icon_data
- resource group_icons,\
- 1,LANG_NEUTRAL,main_icon
- icon main_icon,icon_data,'vsp.loader.ico'
Ограничение успешно нейтрализовано
Осталось скомпилировать лоадер, закинуть его в папку с жертвой и запустить. Если теперь снова выполнить поиск дубликатов, то в списке окажутся все результаты и никаких сообщений о необходимости регистрации не появится. Основная цель достигнута. В заголовке окна осталась надпись о триальном режиме работы, но на это можно просто не обращать внимания, ведь все ограничения по функционалу сняты. В крайнем случае заголовок окна можно заменить из того же лоадера.
Просмотров: 8689 | Комментариев: 19
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Борис
(11.02.2018 в 00:57):
И зачем эти танцы с бубнами? Программа на официальном сайте стоит 500 рублей, с промокодом - 350! 350 рублей жалко? Да за такие деньги даже поесть нельзя нормально. Или из принципа не платить и из принципа нахаляву пользоваться?
User
(03.12.2017 в 00:44):
ManHunter, спасибо за труд! Интересно, доходчиво.
К сожалению не шарю в асме, поэтому осилил прогу с launcher generator 1.03.
Он не спрашивает, что заменить, а просто просит адреса и что вписать. Минус-если не указать ему показывать MSGbox, он не дожидается распаковки и не срабатывает. Может, не поленюсь сделать нормальный лаунчер. Вот только когда я полез смотреть, что именно патчится в W32dsmv10 - приофигел. По 0040959Bh, 0F85A7000000 пишем 090h,0E9h - не понятно немного, что на что меняется(извиняюсь за невежество). ПО 0040A413h, 752E меняем на EB - тут понятно. Дубликатам-бой!
К сожалению не шарю в асме, поэтому осилил прогу с launcher generator 1.03.
Он не спрашивает, что заменить, а просто просит адреса и что вписать. Минус-если не указать ему показывать MSGbox, он не дожидается распаковки и не срабатывает. Может, не поленюсь сделать нормальный лаунчер. Вот только когда я полез смотреть, что именно патчится в W32dsmv10 - приофигел. По 0040959Bh, 0F85A7000000 пишем 090h,0E9h - не понятно немного, что на что меняется(извиняюсь за невежество). ПО 0040A413h, 752E меняем на EB - тут понятно. Дубликатам-бой!
DaniCh
(28.10.2017 в 06:24):
[b]UPD:[/b] Получилось через Cheat Engine. На вопрос про адреса сам ответ нашёл, но вот с компиляцией хз...
DaniCh
(28.10.2017 в 05:00):
ManHunter, Здравствуй! Отличный разбор, но есть не ясности, я n00b полный.
Не хочет полностью компилировать твой код в FASM
Вот где взять эту библиотеку? include 'apia\kernel32.inc' это из папки API? Надо просто переименовать или как? Ну вот мне ума хватило только переименовать каталог, дальше компилятор встаёт тут file 'vsp.loader.ico':6,16
У меня наверно получилось бы провернуть тоже самое с помощью Cheat Engine, но я не понимаю, что значит маленькая h в конце адреса 0040959Bh, 0040A413h
Ну и по логике следующий вопрос...
patch1 db 090h,0E9h
patch2 db 0EBh
Что значит db? Это меняются какие-то байты в адресе или это инструкция?
Не хочет полностью компилировать твой код в FASM
Вот где взять эту библиотеку? include 'apia\kernel32.inc' это из папки API? Надо просто переименовать или как? Ну вот мне ума хватило только переименовать каталог, дальше компилятор встаёт тут file 'vsp.loader.ico':6,16
У меня наверно получилось бы провернуть тоже самое с помощью Cheat Engine, но я не понимаю, что значит маленькая h в конце адреса 0040959Bh, 0040A413h
Ну и по логике следующий вопрос...
patch1 db 090h,0E9h
patch2 db 0EBh
Что значит db? Это меняются какие-то байты в адресе или это инструкция?
ManHunter
(21.08.2017 в 23:12):
Без разницы, все равно готового вареза тут не будет.
MaCTeP
(21.08.2017 в 23:00):
Лорд
А где волшебное слово ПОЖАЛУЙСТА ?
А где волшебное слово ПОЖАЛУЙСТА ?
ManHunter
(22.06.2017 в 00:08):
Да побыстрее!
Лорд
(21.06.2017 в 18:32):
Выложите эту прогу с патчем
brute
(12.05.2016 в 12:11):
можно было и оставить.. brut'ально!
ManHunter
(12.05.2016 в 10:58):
Мда... подкорректировал.
Vladimir
(12.05.2016 в 01:31):
На первом вашем скриншоте ссылка на [del]. Сходил по ней и долго ржал.))
Пасхалка получилась.
Пасхалка получилась.
Exit
(11.05.2016 в 13:27):
Спасибо за толковую прогу! Даже не ожидал, что на винте есть с десяток дублей...
И еще одна Спасибка за то, что блог продолжает развиваться!
И еще одна Спасибка за то, что блог продолжает развиваться!
Алекс
(08.05.2016 в 17:51):
Крайне поучительно, жаль только, что ломался не Video Comparer
ManHunter
(07.05.2016 в 20:45):
IDA Pro
dew
(07.05.2016 в 20:40):
А каким дизассемблером Вы пользуетесь?
ManHunter
(06.05.2016 в 22:02):
Про распаковку фимки
https://tuts4you.com/download....oad_name.ASC
https://tuts4you.com/download....oad_name.ASC
Hello
(06.05.2016 в 21:39):
Снимаю шляпу, отличная статья! Было бы интересно почитать как снимаются протекторы на подобие фемиды - там шифруется вся таблица импорта и как её восстановить не понятно.
vonMI
(06.05.2016 в 00:36):
Fasm отличная и легко понятная вещь,не понимаю,почему в сети все таблетки активно советуют писать на дельфи или в студии....Видимо ищут сложных путей.
Добавить комментарий
Заполните форму для добавления комментария
Вот, кстати, справедливое замечание. Если это не считается деньгами, то нафига их тогда требовать с пользователей??