Blog. Just Blog

Исследование защиты программы Duplicate Video Search

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

Программа Duplicate Video Search предназначена для поиска дубликатов видеофайлов. В отличие от программ аналогичного назначения, которые ищут точные копии по совпадению сигнатур, Duplicate Video Search позволяет обнаруживать все копии видео, включая те, которые были сконвертированы в другие видеоформаты или имеют другое качество и разрешение. Если вы владеете большой видеоколлекцией, то такая программа наверняка вам пригодится. Только вот платить деньги за программу, чтобы затем с ее помощью шерстить коллекцию пиратских фильмов, я не собираюсь.

Скачиваем дистрибутив, устанавливаем, смотрим. С первого же взгляда становится ясно, что исполняемый файл упакован. Анализаторы файлов говорят, что это Obsidium. Противник серьезный, на сегодняшний день для него нет публичных распаковщиков. Но пока не будем расстраиваться и посмотрим, какие у программы есть ограничения.

Сообщение незарегистрированной программы
Сообщение незарегистрированной программы

Из того, что я смог найти, это ограничение по количеству отображаемых дубликатов. В незарегистрированной версии показывается не более 10 найденных файлов и сопровождается это вот таким сообщением.

Попробуем пока обойтись без распаковки и без снятия протектора. Просто запустим программу и снимем дамп памяти, когда она будет распакована. Дамп, естественно, получится нерабочим, но зато можно будет загнать его в дизассемблер и посмотреть, что там вообще происходит.

Делаем дамп программы
Делаем дамп программы

Запускаем PE Tools, выбираем нужный процесс, делаем полный дамп. После этого отправляем полученный дамп в наш любимый дизассемблер. По тексту выдаваемого сообщения выходим на следующий код:
  1. seg000:0040958B                 call    sub_408D10
  2. seg000:00409590                 add     esp, 8
  3. ; Неявный вызов функции проверки
  4. seg000:00409593                 call    dword_54D4A8
  5. seg000:00409599                 test    al, al
  6. ; Если она вернула AL!=0, то показать все результаты
  7. seg000:0040959B                 jnz     loc_409648
  8. seg000:004095A1                 mov     eax, [esi+1Ch]
  9. ; Найдено больше 10 файлов?
  10. seg000:004095A4                 cmp     eax, 0Ah
  11. ; Да, тоже не показывать сообщение
  12. seg000:004095A7                 jle     loc_409648
  13. seg000:004095AD                 push    eax
  14. seg000:004095AE                 lea     ecx, [ebp+var_114]
  15. ; Вывести сообщение о триальности
  16. seg000:004095B4                 push    offset aDDuplicatesWer
  17. ; "%d duplicates were found. In TRIAL vers"...
  18. seg000:004095B9                 push    ecx
  19. seg000:004095BA                 call    dword_54D1EC
Функция проверки вызывается неявно, скорее всего она вынесена в память протектора. А вот условный переход по результатам ее выполнения ничем не защищен, значит никто нам не помешает пропатчить его в памяти. Для этого применяются лоадеры, позволяющие пробивать даже очень серьезные защиты без снятия навесных протекторов.

Но перед там, как начать делать лоадер, надо найти все участки, где вызывается функция проверки. По перекрестным ссылкам выходим на еще один очень похожий код:
  1. seg000:0040A402                 call    dword_54D1EC
  2. seg000:0040A408                 add     esp, 10h
  3. ; Вызвать функцию проверки
  4. seg000:0040A40B                 call    dword_54D4A8
  5. seg000:0040A411                 test    al, al
  6. ; Если AL!=0, то перепрыгиваем
  7. seg000:0040A413                 jnz     short loc_40A443
  8. seg000:0040A415                 mov     eax, [esi+14h]
  9. seg000:0040A418                 mov     ecx, edi
  10. seg000:0040A41A                 lea     ebx, [ebx+0]
  11. seg000:0040A420 loc_40A420:
  12. seg000:0040A420                 cmp     eax, ebx
  13. seg000:0040A422                 jz      short loc_40A443
  14. ; Если какой-то счетчик больше 10, то переход
  15. ; Очевидно, что это тоже счетчик отображаемых дубликатов
  16. seg000:0040A424                 cmp     ecx, 0Ah
  17. seg000:0040A427                 jge     short loc_40A430
  18. seg000:0040A429                 mov     eax, [eax+4]
  19. seg000:0040A42C                 add     ecx, edi
Итого у нас есть два адреса с условными переходами, которые надо заменить на безусловные сразу после загрузки программы в память и завершения работы навесного протектора. Можно воспользоваться каким-нибудь готовым инструментом для изготовления лоадеров, а можно написать его самому. Приведу полный код лоадера на FASM, он сделан по шаблону, который я обычно использую для таких случаев.
  1. ;-------------------------------------------------------------
  2. ; Loader example
  3. ;-------------------------------------------------------------
  4.  
  5. format PE GUI 4.0
  6. entry start
  7.  
  8. include 'win32a.inc'
  9.  
  10. ;-------------------------------------------------------------
  11.  
  12. section '.data' data readable writeable
  13.  
  14. sinfo   STARTUPINFO
  15. pinfo   PROCESS_INFORMATION
  16.  
  17. procid  dd ?
  18. tmp     dd ?
  19.  
  20. ;-------------------------------------------------------------
  21.  
  22. section '.code' code readable executable
  23.  
  24. start:
  25.         ; Создать процесс с пробросом командной строки
  26.         invoke  GetCommandLine
  27.         invoke  CreateProcess,fname,eax,NULL,NULL,NULL,\
  28.                 NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo
  29.         or      eax,eax
  30.         jnz     @f
  31.  
  32.         ; Файл не найден
  33.         invoke  MessageBox,0,err1,errt,MB_OK
  34.         jmp     loc_exit
  35.  
  36. @@:
  37.         ; Небольшая пауза для отработки протектора
  38.         invoke  Sleep,400
  39.  
  40. @@:
  41.         invoke  Sleep,100
  42.  
  43.         ; Приостановить выполнение программы
  44.         invoke  SuspendThread,[pinfo.hThread]
  45.         ; Процесс еще активен?
  46.         invoke  GetExitCodeProcess,[pinfo.hProcess],procid
  47.         cmp     [procid],STILL_ACTIVE
  48.         jne     loc_exit
  49.         ; Файл распакован в памяти?
  50.         invoke  ReadProcessMemory,[pinfo.hProcess],0040959Bh,tmp,4,NULL
  51.         ; Возобновить выполнение программы
  52.         invoke  ResumeThread,[pinfo.hThread]
  53.  
  54.         ; Контрольные байты, которые должны быть в распакованном файле
  55.         cmp     [tmp],00A7850Fh
  56.         jne     @b
  57.  
  58.         ; Приостановить выполнение программы
  59.         invoke  SuspendThread,[pinfo.hThread]
  60.         ; Пропатчить процесс в памяти
  61.         invoke  WriteProcessMemory,[pinfo.hProcess],0040959Bh,patch1,2,NULL
  62.         invoke  WriteProcessMemory,[pinfo.hProcess],0040A413h,patch2,1,NULL
  63.         ; Возобновить выполнение программы
  64.         invoke  ResumeThread,[pinfo.hThread]
  65.  
  66. loc_exit:
  67.         invoke  ExitProcess,0
  68.  
  69. ; Байты для патча в памяти
  70. patch1  db 090h,0E9h
  71. patch2  db 0EBh
  72.  
  73. errt    db 'Error',0
  74. err1    db 'File not found: '
  75. fname   db 'vsp.exe',0
  76.  
  77. ;-------------------------------------------------------------
  78.  
  79. section '.idata' import data readable writeable
  80.  
  81.   library kernel32,'kernel32.dll',\
  82.           user32,'user32.dll'
  83.  
  84.   include 'apia\kernel32.inc'
  85.   include 'apia\user32.inc'
  86.  
  87. ;-------------------------------------------------------------
  88.  
  89. section '.rsrc' resource data readable
  90.  
  91.   directory RT_ICON,icons,\
  92.             RT_GROUP_ICON,group_icons
  93.  
  94.   resource icons,\
  95.            1,LANG_NEUTRAL,icon_data
  96.   resource group_icons,\
  97.            1,LANG_NEUTRAL,main_icon
  98.  
  99.   icon main_icon,icon_data,'vsp.loader.ico'
Все адреса для патчей заданы фиксированными значениями, поэтому работать лоадер будет только с той версией Duplicate Video Search, под которую он делался. При обновлении программы, если аффтар не наворотит дополнительных степеней защиты, достаточно будет повторить процедуру по поиску в дампе нужных адресов, чтобы затем внести их в обновленный лоадер.

Ограничение успешно нейтрализовано
Ограничение успешно нейтрализовано

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

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 2245 | Комментариев: 16

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

Комментарии

Отзывы посетителей сайта о статье
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? Это меняются какие-то байты в адресе или это инструкция?
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
Hello (06.05.2016 в 21:39):
Снимаю шляпу, отличная статья! Было бы интересно почитать как снимаются протекторы на подобие фемиды - там шифруется вся таблица импорта и как её восстановить не понятно.
vonMI (06.05.2016 в 00:36):
Fasm отличная и легко понятная вещь,не понимаю,почему в сети все таблетки активно советуют писать на дельфи или в студии....Видимо ищут сложных путей.

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

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

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