Comunidade

Ninguém Pintou o Retângulo de Preto

Maneshwar explica em seu post no DEV Community como o Netflix e outros aplicativos bloqueiam capturas de tela de vídeos, mostrando que não há pintura negra real, mas sim a ausência de conteúdo devido à flag FLAG_SECURE nos sistemas Android. O mecanismo é mais sofisticado para serviços como Netflix HD, onde os quadros estão em um ambiente seguro dentro do chip, tornando impossível capturar o vídeo mesmo com root.

Compartilhar
Nobody Painted That Rectangle Black - DEV Community

Olá, eu sou Maneshwar. Estou construindo o git-lrc, um revisor de código micro AI que funciona em cada commit. É gratuito e aberto na Github. Estrela o git-lrc para ajudar os desenvolvedores a descobrirem o projeto. Dê uma chance e compartilhe sua opinião.

Você fez isso.

A Netflix está tocando, algo na tela vale ser compartilhado, você pressiona printscreen e obtém um retângulo preto onde estava o vídeo.

O botão de play está lá. A barra de rolagem também.

O programa em si? Desapareceu.

A mesma coisa acontece com a gravação de tela, só que mais estranho.

Você olha diretamente para o vídeo enquanto ele toca, perfeitamente visível e colorido, e a gravação salva sai preta.

Suas vistas dizem uma coisa. O arquivo diz outra.

A maioria de nós arquiva isso como "a Netflix bloqueou" e continua com nossas vidas.
Mas o mecanismo por trás disso é mais estranho e honestamente, mais elegante do que "bloqueado".

Então vamos camada a camada.

The mental model I had is wrong

Aqui está o que eu assumi:

  1. Eu pressiono printscreen
  2. Algo detecta isso
  3. Esse algo pinta preto sobre a área protegida
  4. Eu obtenho uma imagem censurada

Razível. Também completamente errado.

Nada detecta nada. Nada pinta nada.

Sente-se com isso, porque o resto deste post se desenrola a partir disso.

Dois consumidores, dois compostos

Aqui está a ideia carregadora e me envergonha admitir que levei muito tempo para chegar nela: a tela e o gravador de tela não estão olhando para a mesma imagem.

Eu havia assumido que existia um framebuffer, uma "imagem canônica" do que o telefone atualmente parece, e que um printscreen era simplesmente uma cópia dela.

Não. SurfaceFlinger, o compositor do Android, não renderiza uma única imagem que todos compartilham.

Ele renderiza um composto separado por destino de saída.

O painel físico é um destino.

O serviço de printscreen é outro. Uma sessão de cast é a terceira.

Para cada destino, SurfaceFlinger percorre a lista de camadas e faz exatamente uma pergunta por camada: essa camada pertence a este saída? Para o painel, a resposta sempre é sim.

Para a saída do printscreen, qualquer camada carregando FLAG_SECURE é pulada.

Então a camada do vídeo nunca é removida da captura se não for adicionada.

Pelo que é preto especificamente

Aqui está a parte favorita.

O buffer de captura é alocado e zerado.

Camadas normais escrevem nele. A camada segura não escreve. Então o buffer é codificado e entregue.

Zeros são preto.

Isso é tudo. Ninguém escolheu preto.

Não há paintItBlack() sentado no AOSP.

O preto é simplesmente o que a memória não tocada parece quando você interpreta como pixels. O retângulo não está censurado, ele está vazio.

É a ausência de uma decisão.

Isto também explica algo que eu tinha visto centenas de vezes e nunca registrei: o preto é exatamente a forma do vídeo, e a UI ao redor dele sobrevive perfeitamente bem.

O botão de play, barra de rolagem, texto do título, tudo presente.

Eles são camadas separadas. Apenas uma delas tinha a flag.

Meu banco está fazendo isso também

Então eu fui e tirei uma captura de tela do meu aplicativo bancário.

O mesmo quadro preto. Gerenciador de senhas, o mesmo.

Screenshot de visualização de imagem no WhatsApp? O mesmo.

Aqui está toda a implementação:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.Para FLAG_SECURE, acredito que sim. É uma política, e o root possui a política. Passe no SurfaceFlinger, pare de honrar a bandeira, as capturas de tela voltam.

O Netflix HD é onde eu esgotar os recursos. Os quadros estão na TEE. O root te dá o kernel, mas o kernel não é quem está dizendo não. Então, o que realmente sai do outro lado?

Não tentei isso. Não tenho aparelhos extras para estragar.

Então, alguém já fez isso? Flashaholics, pessoas com ROM personalizada, o que vocês conseguiram?


Agentes de IA escrevem código rápido. Eles também removem silenciosamente lógicas, alteram comportamentos e introduzem bugs — sem te avisar. Você geralmente descobre isso em produção.

git-lrc resolve isso. Ele se conecta ao git commit e revisa cada diff antes que ele seja aplicado. Configuração de 60 segundos. Totalmente gratuito.

Toda feedback ou contribuição é bem-vinda! Está online, fonte disponível e pronto para qualquer um usar.

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa