Wednesday, March 10, 2010

Plugin do Media Player expõe existência de arquivos.

Tagged with:
Tuesday, November 10, 2009, 19:40
This news item was posted in Navegadores category and has 2 Comments so far.

Windows media player_128 Por alguns anos, trabalhei com streaming de áudio e vídeo. Um software que fez parte constante de meu trabalho foi o Windows Media Player. Não posso negar, seu plugin (objeto) para browsers traz uma série de recursos que muitos desconhecem.  Com a excelente documentação disponível na MSDN em mãos, você poderá criar um player dinâmico, tratando playlists, enviando erros durante o streaming ao servidor, anotando banda usada, pacotes perdidos, etc, tudo por JavaScript.

Claro que nem tudo é belo e devo parar meus elogios por aqui. Vocês bem sabem: Mais recursos, mais lugares para uma falha aparecer. E é, apareceu.

Esqueça a principal função de um player. Deixemos pra lá as mp3s ou vídeos que ele deveria tocar. Vamos unir tudo aquilo que o plugin nos oferece e então, no post de hoje, veremos como detectar de arquivos locais do computador do usuário usando o objeto do Windows Media Player para navegadores.

Quando solicitamos ao player embutido no navegador que conecte-se à determinada URL ou arquivo local, uma série de ações ocorrem. O WMP, precisa, por exemplo, conectar-se à url, receber uma playlist, enviar o request pela mídia a ser executada, etc.

Cada etapa do carregamento da mídia pode ser obtida pela propriedade player.openState, que retorna o ID correspondente a ação atual, e a cada mudança de etapa o evento player.OpenStateChange é acionado. Não há nenhuma relação entre os IDs e um mesmo evento pode ser chamado mais de uma vez durante o processo.

Aí então, fica bem simples entender a mágica do funcionamento da detecção. O player terá estados diferentes ao encontrar ou não o arquivo, e, monitorando as mudanças, teremos a informação que desejamos.

O único problema é que o WMP abrirá apenas arquivos que possa interpretar, como mp3, wmv, avi, etc, e, certamente, queremos ter a liberdade de detectar todas as demais extenções.

Quando pedimos para abrir um arquivo que ele não reconheça como mídia, ele perguntará ao usuário se deseja continuar, avisando, ainda, a extenção solicitada. Isso mandaria pro saco nossa detecção, não é mesmo?

É aí que o autor do blog lrv.ch.vu (..que nome, hein?) fez uma descoberta que faz ignorar esta pergunta: Ele percebeu que quando executamos no player uma url HTTP que retorne um redirecionamento para o endereço que queremos testar (como file://boot.ini, por exemplo), o player irá continuar normalmente, sem pedir qualquer interação.

Infelizmente, o post no blog citado não oferece muitos detalhes. Ele não diz, por exemplo, qual o tipo de redirecionamento (301 ou 302) é necessário, e, pra completar, sua página de exemplo, que usa formulários php e jquery, não teve detalhes exibidos. A didática foi pro saco.

Como já estava com a mão na massa e já havia programado alguns testes, resolvi seguir a dica do redirecionamento e dar sequencia. O gringo lá tinha razão. O redirecionamento HTTP “302” (Moved Temporarily) faz o player seguir o caminho sugerido e continuar a execução. Já com o código 301 não tive sucesso.

Já com o redirecionamento feito e a mudança de estado sendo monitorada pelo evento openStateChange, veja, abaixo, como a detecção é feita:

Eventos que ocorrem ao carregar um arquivo inexistente pelo redirecionamento: file://teste.exe

ESTADO: 21
ESTADO: 6
ESTADO: 6
ESTADO: 6

Eventos que ocorrem ao carregar um arquivo existente pelo redirecionamento: file://boot.ini

ESTADO: 21 – Opening a URL with an unknown type.
ESTADO: 6 – Playlist is open.
ESTADO: 8 - A new media item is about to be loaded.
ESTADO: 6 – Playlist is open.
ESTADO: 6 – Playlist is open.

Opa! Olha lá! O openState 8 só ocorre quando o arquivo existe. Temos em mãos o poder de verificar a existência de arquivos locais!

Programei um scanner que, rapidinho, pode verificar uma lista de arquivos e dizer quais existem. O código está limpo e você pode ficar a vontade para ler e aprender. Abaixo, segue o código do arquivo wmp.php chamado, que cria o redirecionamento necessário para a verificação:

<?php
header("HTTP/1.1 302 Moved Temporarily");
header("Location: file:///".$_GET['arquivo']);
?>

Entre já na página de testes que criei, clique aqui! (Internet Explorer, apenas)
Caso queira ver todos os possíveis IDs do openState e suas respectivas descrições, veja este link da MSDN.

Por hoje é só. Se você conferir os posts anteriores, de como criar módulos para BeEF, perceberá que facilmente você pode migrar essa detecção de arquivos locais para um módulo.

Feedbacks são SEMPRE bem vindos. Comente!

Até a próxima!

You can leave a response, or trackback from your own site.

2 Responses to “Plugin do Media Player expõe existência de arquivos.”

  1. Raul said on Wednesday, November 11, 2009, 12:35

    Caramba, o perigo espreita onde menos esperamos.

    Gostei da matéria….. sempre continuem postando coisas interessantes….

    vlw msmo… =D

    e postem mais.. =)

  2. Gabriel Lima said on Wednesday, November 11, 2009, 14:32

    Valeu, Raul! Obrigado pela visita e pelo comentário.

Leave a Reply

Powered by WP Hashcash