Pull to refresh

Смотрим полноэкранное флеш-видео на втором мониторе, работаем на первом

Reading time 9 min
Views 31K
Просмотр видео во флеше (youtube и другие) на полном экране имеет пару недостатков, которые полезно исправить прямо в библиотеке флеша, выполнив патч некоторых файлов, появившихся в системе после процедуры инсталляции или обновления флеш-плеера.

Недостатки:
   1) (основной) развёрнутый на полный экран флеш-ролик фильма (или анимации) сворачивается при потере фокуса окном. Например, стоит заглянуть в ICQ, Скайп на другом мониторе, в другое окно браузера, запустить или перейти в другую программу — развёрнутый флеш беспощадно сворачивается в прежние размеры;
   2) (тоже неприятное свойство) при разворачивании в полное окно флеш-ролик с упорством робота повторяет одну и ту же фразу в течение 3-4 секунд, мешая просмотру: «Press Esc to exit full screen mode», забывая, что у пользователей тоже есть память.
   Результат приведён в виде нескольких правил для ручного патча и в виде архива пропатченных файлов библиотеки флеш-плеера текущей версии 10.1.85.3.
   Даже если у вас один монитор, второй патч и в этом случае будет полезен.

(UPD: Статья-продолжение, для версии 10.1.102.64, приведена пошаговая методика выполнения патчей, идентичная описанной; выложены файлы для версии флеша.)

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

Патч придётся обновлять и применять при каждом обновлении плеера. В будущих версиях плеера патч-программа, имеющаяся сейчас под Windows, может перестать работать, поэтому ниже объяснены метод и суть построения патча. Для случая Linux придётся воспользоваться приведённой ручной методикой или написать что-то своё.

Используем готовый хак (неполное решение, для Windows и части браузеров)


Программа хакинга FlashHacker.zip [2] в последней версии от июня 2010, рассчитанная на флеш v.10.1.53.64, нормально работает и с актуальной на данный момент версией 10.1.85.3 (от середины сентября 2010), потому что, как видно по открытому приложенному коду, её алгоритм заключается в поиске и замене пары байтов 11-байтовой строки в файле с:\WINDOWS\system32\Macromed\Flash\NPSWF32.dll или в подобной для Windows 7.

К сожалению, на этом победные реляции заканчиваются. Далее, программа пытается найти библиотеки для Хрома 6-й версии и Оперы в Висте (в "%PROGRAMFILES(X86)%), не пытается патчить Flash10.ocx для IE. Итого, обеспечивает безбедный патч для 2 с половиной браузеров. Для Хрома-6,7 есть другая программа — DrizzlyChrome.zip того же автора. Для других придётся действовать руками.

У программы, есть ряд ограничений: она работает только на Windows, требует .NET 3.5 Framework, не поясняет свои принципы работы. Решает только первую из 2 поставленных в начале статьи задач.

В другом месте [8] суровый программист на Visual Си и Qt пишет аналогичный патч с открытым кодом и доступным SVN, который, к тому же, умеет определять обновления флеша, чтобы автоматически переинсталлировать себя (фича добавлена в сентябре 2010). IgnoFlash-1.3.1.zip, 4.0 MB. Вопрос с IE давно решён; подход выглядит более серьёзным.



Ручной хакинг файла библиотеки флеша


Перейдём на более глубокий уровень, чтобы не зависеть от инициативы других хакеров и сделать то же самое руками в любой новой версии флеша, для любого браузера, для любой ОС. Это частично выяснили до нас, поэтому я просто процитирую объяснения из статьи [4].

Суть хака в том, что в библиотеке флеша отыскивается код, который на псевдокоде выглядел бы примерно так:
if (msg == WM_KILLFOCUS)
  jump to kill_focus
if (msg == WM_PAINT)
  jump to paint
и переделывается в код
if (msg == WM_KILLFOCUS)
  nop
if (msg == WM_PAINT)
  jump to paint
Например, для версии флеша 10.1.53.64 (и для 10.1.85.3) окружающий код выглядит так:

  74 39 83 E8 07 74 11 83 E8 05 75 13 8B

В последующих версиях могут меняться некоторые из байтов, но значения 74, 74 и 75 (коды команд), скорее всего, останутся неизменными (как выясним дальше, для IE это оказывается не совсем так). В найденном участке заменяем 2 байта 74 39 на 90 90, запускаем браузер, смотрим результат. (Конец цитирования.)
Итого, правило для всех браузеров, кроме IE: находим в файле NPSWF32.dll v.10.1.85.3 или gcswf32.dll (где расположен этот файл, описано ниже) строчку «74 39 83 E8 07 74 11 83 E8 05 75 13 8B», заменяем её на «90 90 83 E8 07 74 11 83 E8 05 75 13 8B».

Фантомы библиотеки флеша


Как найти нужный файл библиотеки флеша? С этим веселее — она существует в нескольких инсталляциях для разных браузеров и хранится в разных местах системы (упоминалось выше).

Дата создания файлов не всегда соответствует действительности. Например, NPSWF32.dll v.10.1.85.3 датируется 27.01.2010 (на самом деле, версия файла — от середины сентября 2010).

Чтобы определить, используется ли файл в данном браузере, помогает утилита Unlocker: открываем браузер, затем проверяем заблокированность файла этим браузером.

Браузеры Firefox, Safari(5) и Opera в WinXP (x32) используют библиотеку, лежащую на стандартном месте: с:\WINDOWS\system32\Macromed\Flash\NPSWF32.dll.

Хром — использует библиотеку, помещённую в
D:\Documents and Settings\<имя_пользователя>\Local Settings\Application Data\Google\Chrome\Application\<7.0.517.41>\gcswf32.dll.

Опера в Win 7, вероятно (судя по программе-хаку) использует библиотеку из "%PROGRAMFILES(X86)%\Opera\program\plugins\NPSWF32.dll.

IE — использует свою ActiveX-библиотеку на стандартном месте:
с:\WINDOWS\system32\Macromed\Flash\Flash10<k>.ocx
Метабуква <k> — меняется в зависимости от версии библиотеки. Для v.10.1.85.3 <k> = «k».

Это, кстати, тот знаменитый файл, который удерживается системой, даже если он нигде не используется и даже если эта копия WinXP в системе неработающая. К счастью, свежая версия программы Unlocker с ним справляется. Для исправлений в нём понадобится сделать копию файла в другое место системы, снять признак «Read only», исправить, удалить файл на старом месте, исправленный файл поместить на старое место.

Установка новой версии флеша на один браузер ещё не означает установки её на другой. Поэтому всем знакомо ощущение дежа-вю при установке новой версии флеша: «Я же это когда-то уже делал! И успешно завершал!». Действительно, инсталляция повторяется по 2-3 раза, каждый раз для одной версии браузера. Через 3-5 месяцев история повторяется. Принудительная инсталляция текущей версии плеера для IE выполняется с адреса fpdownload.adobe.com/get/flashplayer/current/install_flash_player_ax.exe.

Итого, для разных браузеров надо убедиться, что исправляем или исправили именно тот файл, который используется браузером. С заменой имён файлов могут быть недоразумения. Например, Firefox подхватил переименованный файл с именем NPSWF32-1.dll и стал с ним работать. Вывод: хранить копии файлов лучше в другом каталоге, даже на этапе экспериментов.

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

Патч для Internet Explorer


На настоящий момент описания хака для IE в интернете не было, поэтому пришлось достать IDA Pro, чтобы найти похожую цепочку команд в Flash10k.ocx и «выкусить» ненужный переход. Действительно, если в других браузерах команды транслировались в короткий 2-байтовый переход, этот файл содержит 6-байтовый, поэтому искомая цепочка была очень непохожа на известную нам. На рисунке приведён фрагмент искомого кода и обведена та команда, которую надо превратить в последовательность NOP.


Или код на ассемблере x86 для файла Flash10k.ocx:
.text:1018576A loc_1018576A: ; CODE XREF: sub_101856AF+B7j
.text:1018576A push ebx
.text:1018576B push eax
.text:1018576C lea ecx, [ebp+68h+var_D4]
.text:1018576F call sub_10387C40
.text:10185774 push esi
.text:10185775 lea ecx, [ebp+68h+var_70]
.text:10185778 call sub_10199257
.text:1018577D mov ecx, [esi+34h]
.text:10185780 mov edi, [ecx+44Ch]
.text:10185786 mov eax, [edi+24h]
.text:10185789 mov [ebp+68h+var_BC], eax
.text:1018578C mov eax, 111h
.text:10185791 cmp [ebp+68h+arg_4], eax
.text:10185794 ja loc_10185A32
.text:1018579A mov ecx, [ebp+68h+arg_4]
.text:1018579D cmp ecx, eax
.text:1018579F jz loc_101859F5
.text:101857A5 cmp ecx, 20h
.text:101857A8 ja loc_101858EE
.text:101857AE jz loc_101858B5
.text:101857B4 mov eax, ecx
.text:101857B6 sub eax, 5
.text:101857B9 jz loc_101858A9
.text:101857BF dec eax
.text:101857C0 dec eax
.text:101857C1 jz loc_1018588D
.text:101857C7 dec eax
.text:101857C8 jz loc_10185860
.text:101857CE sub eax, 7
.text:101857D1 jz short loc_101857DC
.text:101857D3 sub eax, 5
.text:101857D6 jnz loc_10185D11
Итого, для IE в файле Flash10k.ocx (v.10.1.85.3) надо найти "00 48 0F 84 92 00 00 00 83 E8" (адрес 0x184bc6) и заменить на "00 48 90 90 90 90 90 90 83 E8".

Исправление надписи «Press Esc to...»


В интернете нашлась только одна ветка обсуждения и решения этой задачи. Странно, что такое всеобщее неудобство заставило найти решение и опубликовать его только одного человека (а второй подключился). Вот что об этом говорят:
Are there any params I can give to the unity web player to make it disable the «Press esc» message? I've got no problem with the «esc» from fullscreen function (in addition to my own toggle), I just don't want that message showing up in the webplayer, since it doesn't in the standalone client.
— Есть ли параметры, которыми я мог бы удалить сообщение «Нажмите Esc...»?

No, that message is a security feature to prevent fullscreen unity web players from being used for phising and the like.
There is no way to prevent it showing up.
It's a real shame, but it's just one of the things you have to factor in when developing for the web.
— Нет, это решение для безопасности, чтобы защитить веб-плееры от фишинга и тому подобного. Нет способов запретить показ. Это действительно, неудобство, но это одна из особенностей разработки для веба.
Будем бороться с этим сознательным антифишинговым кодом, зная, от чего отказываемся. Будьте готовы к тому, что какой-то чрезвычайно хитрый фишер предложит вам развернуть видео на полный экран, а на самом деле это будет не только видео, но и форма расчёта с вашим банком, куда вы внесёте приватные сведения, забыв, что на полном экране у вас флеш. Фишер порадуется, что вы не прочитали лишний раз предупреждение про кнопку Esc и забыли, что это флеш из интернета.

В [6] продемонстрирован подход: превратить надпись в невидимую и не бороться с её появлением (Chronomaster заполнил её нулями) или написать более короткий по коду ресурс. Вручную второй подход потребует менять меньше данных, поэтому выберем его. (Не смотрел, что это за ресурс длиной 2288 байт: изображение или нечто более сложное. Проверено — работает везде, строчка для замены встречается во всех 3 библиотеках.)
Для удаления предупреждения «Press Esc to...» (на любом языке) во всех 3 файлах библиотек флеша v10.1.85.3: NPSWF32.dll, gcswf32.dll, Flash10k.ocx строчка «43 57 53 08 60 10 00 00 78 9C 95 57 6B 70 13 D7» заменяется на «84 85 4E 2B 6D 76 4E AA 65 1D D9 83 07 D4 93 2E».

Подробные пояснения написаны для возможных будущих правок версий флеша, отличающихся от нынешней. Если на компьютере проинсталлирована версия 10.1.85.3, файлы библиотек с 2 патчами для замены можно взять из архива. Attention! Files are copied from russian installation, WinXP. Контрольные суммы MD5:
NPSWF32.dll — 2791B3E6EA48D491B8B8926EE96BF862 (5`969`360 байт);
gcswf32.dll — 1466158D5E0D35CAD501BA663C9E4377 (6`021`120 байт);
Flash10k.ocx — 308987522024C66FAE39B5B85AA37055 (6`069`712 байт).
Или новый архив для версии 10.1.102.64.
   Перед заменой файлов убедитесь, что окна браузеров закрыты и что установленная на компьютере версия флеш-плеера — во всех 3 файлах именно 10.1.85.3. Если нет — установите эту версию или обновите только файлы с совпадающей версией (тогда будет эффект только в соответствующих браузерах). Определить версию файла — правая кнопка мыши на файле — Свойства — Версия — Версия файла.
   Если в результате экспериментов что-то перестало работать (при ошибочном патче возможна неправильная работа флеша в браузере), действия можно исправить, закрыв браузеры и восстановив исходные версии файлов. В крайнем случае, деинсталлировав и заново инсталлировав флеш-плеер для браузеров. Может, конечно, уйти управление в непредсказуемое место и что-то наломать, если постараться менять адреса переходов с ошибками. Общий совет по безопасности относительно поломок системы — не делайте экспериментов, в восстановимости последствий которых не уверены, не забывайте сохранять исходные копии файлов.

Ссылки


   1. "Заставляем flash-видео играть в фоне на полный экран на многомониторных системах (windows only)", 6 марта 2010.
   2. Программа-патчер файлов NPSWF32.dll, имеющих отношение к браузерам. Build 6-24-2010
«FlashHacker» (en.), Support for Flash 10.1.53.64
(на видео неполноценно объясняет способ патча, на самом деле патчит по поиску 11 байтов, как описано в [4].
   3. Как воспользоваться устаревшей версией плеера с хаком (приложены файлы для установки).
«Заставляем flash-видео играть в фоне на полный экран на многомониторных системах (windows only)» 9 мая 2010 — 3 октября 2010.
   4. (англ.) Решение для флеша 10.1 до версий 10.1.82.76 (без IE) — основной источник.
«Fullscreen Hack for Flash 10.1»
   5. Альтернативный патч (исходный код на AutoIt v3) (парсер Хабра корёжит ссылку: правильное имя в хосте: autoitscript, исправьте в адресной строке при просмотре).
   6. Патч для «Press Esc to...» (v.10.1.85.3), основной источник. Имеется сборка с 2 патчами для 10.1.82.76.
   7. Репост — Jun 11, 2010.
   8. IgnoFlash Patch — перспективный хак для 2 мониторов.
   UPD: 9. Статья-продолжение, для версии 10.1.102.64, приведена пошаговая методика выполнения патчей, идентичная описанной; выложены файлы для версии флеша.
   UPD: 10. В Flash 10.2 beta уже «Полноэкранный контент останется полноэкранным на вторичных мониторах, что позволит пользователям смотреть его, работая на другом дисплее.». Хорошо, что прогресс не стоит на месте и скоро необходимость в подобных патчах уменьшится.
Tags:
Hubs:
+59
Comments 33
Comments Comments 33

Articles