Сейчас на форуме: 2nd, morgot, Rio, CDK123, zds, tyns777, tihiy_grom (+5 невидимых)

 eXeL@B —› Программирование —› Как подменить байты при проигравании видео файлов
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 08:45
· Личное сообщение · #1

Всем привет!

Кто-нибудь может подсказать, нужно при просмотре видеофайла заменить (подменить) несколько байт
желательно на Делфи или ВСВ.




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 31 августа 2008 09:02
· Личное сообщение · #2

Не очень ясна суть задачи. Если тебе нужно просто избавиться в видеоряде от чего-то, то почему бы просто не воспользоваться программой видеомонтажа, например VirtualDub?

-----
Программист SkyNet




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 09:21
· Личное сообщение · #3

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




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 31 августа 2008 09:38
· Личное сообщение · #4

x-code
Ну так заинлань свои видеоплейер, чтобы он сам патчил на лету нужный видеофайл.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 31 августа 2008 09:41
· Личное сообщение · #5

По идее можно внедрить dll которая будет хучить апи через которые открывается видео файл и подменять определенный кусок файла при чтении



Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 10:09
· Личное сообщение · #6

YDS пишет:
Ну так заинлань свои видеоплейер, чтобы он сам патчил на лету нужный видеофайл.


можно по подробнее с примерчиком



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 31 августа 2008 10:15
· Личное сообщение · #7

x-code
наверняка свой плеер - это какой-нибудь готовый компонент? поэтому и вопросы такие...

-----
MicroSoft? Is it some kind of a toilet paper?





Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 31 августа 2008 10:37
· Личное сообщение · #8

На пальцах: найди в exe плейера место, где открывается видеофайл (например, бряком в отладчике на CreateFileA), с этого места поставь jmp на свободное место в exe, где и пропиши патч: сначала проверку наличия в открытом файле твоей подмененной сигнатуры, если имеется, то ее восстановление.



Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 10:47 · Поправил: x-code
· Личное сообщение · #9

Tim пишет:
наверняка свой плеер - это какой-нибудь готовый компонент? поэтому и вопросы такие...


А что проблемы какие-то с компонентами? Нельзя использовать компоненты?
Форум для этого и существует чтобы задавать вопросы.
Я так и не понял к чему твой вопрос, только для поднятия ранга?
Лучше бы помог с вопросом. Не все такие умные как ты.


YDS спасибо!




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 31 августа 2008 12:04
· Личное сообщение · #10

x-code, у такого варианта есть несколько подводных камней:

1) Забивать нужно весь header, так как иначе этот порченый поток просто пропустят через VirtualDub и получат воспроизводимый файл.
2) Чуть более продвинутый пользователь сможет исправить заголовок вручную и сделать универсальный патч. Даже реверсить плеер не придётся



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 31 августа 2008 12:15
· Личное сообщение · #11

x-code
не хотел никого обижать! просто имел в виду, что когда используется компонент, то контроля над данными почти нет. я так понимаю, проект пишется на дельфи. можешь взять advApiHook библиотеку от Ms-Rem и перехватить ReadFile. прямо в коде своего плеера. затем в функции-заглушке сделать подмену или вызвать настоящий ReadFile. общий принцип такой.

если что-то не ясно, пиши, здесь помогут.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 12:47
· Личное сообщение · #12

Gideon Vi пишет:
x-code, у такого варианта есть несколько подводных камней


Да я в курсе, к тому же здесь в этом мало кто разбирается. Этого мне хватит (то что я изложил в самом начале).



Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 12:52
· Личное сообщение · #13

Tim

Я не со всем понял, то что ты предлагаешь сделать, это через Олю или программным путем.



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 31 августа 2008 12:56
· Личное сообщение · #14

x-code
все программным путем, конечно. из своей программы ты перехватываешь системную функцию, эту же функцию использует компонент, который играет видео. смысл понятен? если нужен пример, могу написать.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 13:29
· Личное сообщение · #15

Смысл понятен, но если не затруднит то с примером было бы лучше. Please.



Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 15:26
· Личное сообщение · #16

Tim
Пример не получается? Или нет времени?




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 31 августа 2008 18:30
· Личное сообщение · #17

Вот как я вижу решение, вкратце: получаем адрес функции, которая файл читает, при помощи VirtualProtect меняем атрибуты страницы памяти (запись разрешаем), записываем поверх оригинального кода апи свой, который будет исправлять файл.
Ну, или делаем так, как YDS сказал, что ещё проще.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 18:34
· Личное сообщение · #18

На словах все понятно. Можно не большой код хотя бы.



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 31 августа 2008 18:57
· Личное сообщение · #19

x-code
не могу пока для дельфи пример написать - нет времени вот из своего проекта вырезал код:

typedef HANDLE WINAPI (*CREATEFILEA)(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
CREATEFILEA __CreateFileA;

HANDLE WINAPI _CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
return __CreateFileA(lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
}

здесь сначала описание функции-переходника идет. это моя функция. все что она пока делает - запускает настоящую системную.

а вот как делается перехват:

HookProc("kernel32.dll", "CreateFileA", (void *)_CreateFileA, (void *)__CreateFileA);

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

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 августа 2008 19:13
· Личное сообщение · #20

Tim

Пока мало мне ясно, но кое что понятно. Спасибо.




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 04 сентября 2008 20:12
· Личное сообщение · #21

Могу на примере скомпилированного файла с отладчиком показать =) Если это нужно, конечно, на дельфях ибо не программирую.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 05 сентября 2008 09:04
· Личное сообщение · #22

Crawler пишет:
Могу на примере скомпилированного файла с отладчиком показать =) Если это нужно, конечно


Спасибо, если не затруднит, то покажи.

А то я тут набираю варианты как лучше сделать, пока еще не получается.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 05 сентября 2008 09:17
· Личное сообщение · #23

x-code судя по тому как тут всё разжевали и после этого x-code пишет:
пока еще не получается
, то врядли вообще получится без написания готового кода. Лучше закинь тому же Timу несколько WMZ за готовую реализацию, чем раздувать топик избитыми истенами, которые кстати уже описывались везде где только можно, на васме даже циклы статей есть.

-----
Yann Tiersen best and do not fuck




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 05 сентября 2008 09:39 · Поправил: x-code
· Личное сообщение · #24

PE_Kill пишет:
x-code судя по тому как тут всё разжевали


Вы все тут умные как я посмотрю, пару фраз кинули и все типа ответили.

Конкретно где обсуждались, скинь ссылки. PE_Kill

Я уже столько ссылок перелазил, там кроме слов типа
уже описывались везде где только можно, на васме даже циклы статей есть.

ничего нет


И к тому же я сказал что подбираю варианты, какой более подойдет тот и буду использовать.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 05 сентября 2008 12:08
· Личное сообщение · #25

x-code пишет:
Вы все тут умные как я посмотрю, пару фраз кинули и все типа ответили.

Ууу, а нам надо диссертацию?

Так и быть поучу юзать google. Берем пост тима.
Tim пишет:
можешь взять advApiHook библиотеку от Ms-Rem и перехватить ReadFile. прямо в коде своего плеера. затем в функции-заглушке сделать подмену или вызвать настоящий ReadFile. общий принцип такой.

Вбиваем в гугле advApiHook и сразу попадаем на несколько форумов, включая васм. Там и примерчики и теория и исходники и инструменты. Нельзя же быть настолько ленивым.

x-code пишет:
И к тому же я сказал что подбираю варианты

Тогда пиши что уже сделал и почему такой то вариант не подходит, пока от тебя тут ничего нет, только просьба написать примерчики. На этом форуме такое не проканает.

-----
Yann Tiersen best and do not fuck




Ранг: 12.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 05 сентября 2008 13:07
· Личное сообщение · #26

x-code
Суть в том, что без спросу копируют файлы.

У кого воруют? у тебя на компе?, за твоим компом десять человек работает? ограничь доступ к своему компу.
Воруют когда ты на сторону для просмотра отдаешь? тогда и с твоим плейером и подменами байтов Camtasia Studio справится без труда и опять скопируют/своруют.
Или надо принципиально написать плейер, чтоб было.
Отдаешь на сторону видео, зарарь его с паролем, после оплаты работы по телефону пароль скажешь, а так просто превьюху предоставляй заказчику.




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 05 сентября 2008 14:18 · Поправил: Crawler
· Личное сообщение · #27

Гыгы =) придется разжевать, раз уж никто не хочет мучить свой мозг такой простой задачей. Типа маленькое руководство, как сделать из обычного мп3-плеера проигрыватель зашифрованных файлов, ну, или файлов с подмененными байтами . За видеоплеер я не взялся, ибо они большие, хотя суть та же самая, но маленький mp3-плеер 1by1 я покопал.

На примере плеера 1by1 объясняю, очень простой пример, мы будем шифровать файл, неважно, каким
способом, и потом байты на лету перекодировать обратно прямо в модифицированной функции ReadFile, или не в ней самой, а сразу после её выполнения перейдем на собственный код, который будет править буфер, юзанный этой функцией, что более логично.
Итак, открываем плеер под отладчиком, ставим брекпойнт на ReadFile и запускаем программу. Далее -
пробуем какой-нибудь файл запустить на проигрывание. Естественно, сработает брекпойнт. По адресу
0040F033. Смотрим, какие параметры передаются перед вызовом ReadFile:

Code:
  1. 0040F01D  |. 6A 00          PUSH 0                                   ; /pOverlapped = NULL
  2. 0040F01F  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]             ; |
  3. 0040F022  |. 50             PUSH EAX                                 ; |pBytesRead
  4. 0040F023  |. 68 80000000    PUSH 80                                  ; |BytesToRead = 80 (128.)
  5. 0040F028  |. 68 10C64300    PUSH 1by1_unp.0043C610                   ; |Buffer = 1by1_unp.0043C610
  6. 0040F02D  |. FF35 C4C54300  PUSH DWORD PTR DS:[43C5C4]               ; |hFile = 00000188 (window)
  7. 0040F033  |. E8 8C050100    CALL <JMP.&KERNEL32.ReadFile>            ; \ReadFile


Лезем в MSDN и видим, что передается структура:



Code:
  1. BOOL WINAPI ReadFile(
  2.   __in         HANDLE hFile, хэндл устройства
  3.   __out        LPVOID lpBuffer, указатель на буфер
  4.   __in         DWORD nNumberOfBytesToRead, количество читаемых байт
  5.   __out_opt    LPDWORD lpNumberOfBytesRead, обнуляем
  6.   __inout_opt  LPOVERLAPPED lpOverlapped тоже обнуляем
  7. );



Естественно, все в обратном порядке, так как это стек =)
Что мы тут видим? Читаем 128 байт, которые запихиваются по адресу 0043с610. В окошке hex - дампа
жмем ctrl+g и идем по этому адресу. Что мы там видим? Видим считанный набор ID3-тегов, или что-то такое, я хз, не в этом суть ))). Естественно, если мы зашифруем весь файл, нам необходимо будет вставить расшифровку блока прямо в ReadFile.
Как это сделать? Первый приходящий в голову (но от этого не самый лучший) вариант - перебазировать ReadFile на другой адрес, например, прямо в тело PE, предварительно вшив в код простой декодировщик (ну или, например, заменитель байт), после чего подменить все вызовы ReadFile на переход на модифицированную функцию.

Можно, конечно, и прыжок по адресу 0041f5c4 подменить, что проще будет, чем все вызовы править.
Но мы не будем так делать, ибо это ну очень гемморойно, мы просто посмотрим, куда можно впихнуть
наш код после того уже, как кусок файла будет прочитан в буфер.

Начинаем отлаживать ReadFile с заходом и смотреть, где и что подменять нужно, в зависимости от
алгоритма правки файла. Доходим до места 7с802511 и видим, что это - самое удобное место для
правки нашего хозяйства, ибо в стеке лежат адрес нашего буфера, куда кусок файла читается, и
размер этого самого буфера:

ebp +1c - размер буфера;
ebp+c - адрес буфера



Смотрим адрес возврата в стеке, он равен 7с801898. Так как данные считаны, а под адресом 7с802511
есть нопы, мы вставим туда переход на наш код =) Естественно, перед этим убиваем RET, который
располагается по адресу 7с802511, мы потом еще его заюзаем в собственном коде.

Можно вставить наш код куда угодно, туда, где ничего нет, например, в область выравнивания, где нолики =)
Итак, пишем вот что:
7с802511 jmp адрес_где_будет_код
Выполняем этот переход и пишем туда свой код, с возвратом последующим по адресу 7с801898.
Если до сих пор не понятно, я через некоторое время дофаршмачу код и выложу готовый вариант =)

Конечно, проигрывание обычных файлов (незашифрованных) в таком случае резко обламывается, но у нас цель - получить проигрыватель для защищенных файлов, а остальное нас ниипёт ни разу.

Только это всё извращения, и лучше закодить на Си =)

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 05 сентября 2008 15:09
· Личное сообщение · #28

monter пишет:
Суть в том, что без спросу копируют файлы.


Варианты не под ходят.
Rar'ом не пойдет, потому что пароль потом ходит по рукам.

Делаю плеер защищаю его по ID - ПК, дальше только этот плеер сможет проигрывать.
Вся суть.




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 05 сентября 2008 15:15
· Личное сообщение · #29

Вот материал по теме, довольно интересный, мб чем-то поможет.
Хотя это всё настолько неактуально, воровство мм-контента в таком случае возможно простым снятием видео с экрана тем же SnagIt-ом, если дополнительно не защитить файл.
www.xakep.ru/post/30364/default.asp?print=true

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 05 сентября 2008 15:24 · Поправил: x-code
· Личное сообщение · #30

Crawler пишет:
http://www.xakep.ru/post/30364/default.asp?print=true http://www.xakep.ru/post/30364/default.asp?print=true


Я уже с этим материалом ознакомлен давно, в принципе нормальный материал.
Но дело в том что там каждый раз происходит копирование и переписывание. Это мне не нравится.
У меня на подобие этой статьи есть уже плеер.

Спасибо еще раз.


. 1 . 2 . >>
 eXeL@B —› Программирование —› Как подменить байты при проигравании видео файлов
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати