Cómo parchar Adobe Flash Fullscreen dual monitor


Flash Player 10.1 dual monitor full screen

Hace dos días me regalaron un monitor LED, con ello sumo 2 y por tanto decidí utilizar los dos monitores para ver vídeos en Youtube. El problema, aparte de los continuos bugs críticos que se van encontrando con cada versión, es que la característica de ver vídeos a full pantalla no es adecuada para sistemas con varios monitores, y es una verdadera molestia, puesto que si ponemos una pantalla con el vídeo a fullscreen, ésta deja de estarlo cuando decidimos trabajar en el otro escritorio (pantalla).

Buscando por la web me encontré con este artículo que habla sobre cómo hacer que Flash siga funcionando a pantalla completa en distintos monitores. Así que decidí hacerlo por mí mismo guiándome de ese blog desde luego. Además, esto servirá como referencia para las siguientes versiones del plugin de Flash.

ACTUALIZACIÓN:

IgnoFlash

Este parche llamado IgnoFlash se encarga de hacerlo automáticamente.
Si deseas saber cómo se hace manualmente continúa leyendo.


Primero lo primero, las herramientas a utilizar:

  • OllyDBG con LoadDLL (depurador de ejecutables de 32 bits)

Pero antes:

Ubiquemos el archivo de Adobe Flash para Google Chrome – averiguamos dónde tenemos instalado el plugin, para ello en la dirección URL de Google Chrome escribimos about: y accederemos a los datos del navegador, algo parecido a lo siguiente:

about chrome

En la sección Línea de comandos, podremos ver la ubicación del ejecutable del navegador, copiamos hasta antes de chrome.exe sin comillas. Y luego en el explorador de windows ponemos esa dirección para acceder rápidamente.

chrome location in windows7

Ahí veremos carpetas con números, entramos en la superior, en este caso el 8.0.552.0 y dentro podremos encontrar el fichero gcswf32.dll que es el plugin de 32bits para Windows 7 en mi caso.

El evento que debemos encontrar es el mensaje WM_KILLFOCUS (0x0008) de Windows que utiliza Flash para detectar que la ventana ha perdido el foco. Una vez recibida el mensaje, se sale de full pantalla por tanto, hemos de evitar que eso suceda.

Luego de ello utilizaremos el depurador OllyDBG, y abrimos la biblioteca dinámica gcswf32.dll, no estoy seguro si Chrome o Adobe implementan una versión de 64bits, y no creo que este depurador pueda analizarlo.

WM_KILLFOCUS no es recomendable utilizarlo para enviar, en su lugar se utiliza SetFocus, pero en por el contrario sí se puede recibir como mensaje dentro de la definición de nuestra ventana, por ello observaremos dentro de DefWindowProcW o DefWindowProcA.

Por ejemplo un procedimiento se crea como:

Pseudo código
  1. procedure WndProc(..)
  2. begin
  3. case Message.Msg of
  4. WM_KILLFOCUS: Salir_de_pantalla_completa;
  5. end;
 

Entonces, vemos los procedimiento que definen una ventana utilizando OllyDBG, para ello hacemos clic derecho en la ventana de depuración y luego buscamos por las llamadas a la API de Windows (Search for > All intermodular calls)

ollydbg flash cracking

Y dentro de la nueva ventana de resultados, ordenamos por Destination para encontrar más fácilmente la llamada a DefWindowProcW, hacemos doble clic en cada uno de ellos y en la otra ventana de depuración veremos que en una de ellas se hace referencia a Case 8 (WM_KILLFOCUS) y ahí hemos de analizar.

wm_killfocus flash

Hacemos clic sobre esa línea de WM_KILLFOCUS y veremos que es el resultado de un salto condicional, la cual hemos de eliminar.

flash wm_killfocus conditional jump

Como vemos el salto es de la dirección 0FC81AED, se hizo un JE (Jump if Equal), la solución que daremos es la de poner la instrucción assembler de no operación conocido como NOP (0x90), la cual hemos de colocar en ambos bytes, tanto en la instrucción 74 y el offset 39, quedando 90 90 en su lugar, esto con la finalidad de que no tome a 39 como una instrucción si sólo hacemos que 74 desaparezca.

Para lo cual hacemos clic derecho en esa línea y luego Binary->Edit

flash binary edit

Y cambiamos a 90 90

flash patch 9090

Luego aceptamos (OK) y después copiaremos todas las modificaciones al ejecutable (clic derecho: Copy to executable –> All modifications)

flash patch copy to executable

Luego Copy All, y veremos otra ventana con los cambios hechos a la DLL, la cual hemos de guardarla definitivamente al archivo (clic derecho: Save File)

flash patch save modified file

Reemplazamos el plugin gcswf32.dll y hecho esto ya podemos iniciar Google Chrome con el plugin parchado.

Ahora a disfrutar flash a full pantalla en todo un monitor.

NOTA: la tecla ESC todavía seguirá funcionando.