Introdução
Frequentemente preciso enviar alguns e-mails para colegas e me espanto ao saber que tal e-mail não pode ser enviado porque há arquivos executáveis anexados. Já ocorreu uma vez de que nem arquivo executável tinha. Só que o problema maior é que você só é notificado que seu e-mail não pode ser enviado DEPOIS de você upar os arquivos. Uma vez gastei preciosos 30 minutos upando um arquivo de 20MB e no final recebo a mensagem que o e-mail não poderia ser enviado.
Em alguns blogs eu vejo que a solução para isso é:
- Renomear o arquivo executável, por exemplo, arquivo.exe para arquivo.txt
- Zipar o executável.
- Usar o rar (ou outro algoritmo de compressão) no executável.
Bem, creio que nenhuma dessas dicas funcionam mais (se é que já funcionaram algum dia). Só para você ter uma idéia, certa vez zipei um arquivo com senha e o gmail ainda foi capaz de dizer que ali tinha um executável (e pior que tinha mesmo hehe).
Como gmail faz isso
Não sei o certo. Mas em relação aos zips da vida, até se eles estiverem com senha, é possível espiar quais arquivos eles guardam. Procurando por padrões nos nomes listados, é possível descobrir se um arquivo tem chances de ser executável. E para o Google, se pintou alguma dúvida, é vírus. :|
Como burlar
Um modo de bypassar esse policiamento do gmail é alterar a estrutura física do arquivo, ou seja, transformá-lo em algo que ele não é. Abaixo veremos como transformar qualquer arquivo em um arquivo texto. Como arquivos textos são aceitos pelo gmail então será fácil anexar qualquer arquivo.
Uuencodando
O uuencode foi um algoritmo muito utilizado para transferir arquivos binários de forma textual pela internet. Hoje em dia é possível vê-lo sendo usado em alguns sites para juntar um texto com programas em um só documento (quem já leu a phrack já se deparou com uns desses).
No linux, existe o comando uuencode para codificar e o uudecode para decodificar. O uso é bastante simples, veja:
$ cat arquivo_de_teste.txt Old programmers never die, they just branch to a new address.
Agora vamos uuencodar esse arquivo:
$ uuencode arquivo_de_teste.txt arquivo_de_teste.txt begin 644 novo_nome.txt M3VQD('!R;V=R86UM97)S(&YE=F5R(&1I92P@=&AE>2!J=7-T(&)R86YC:"!T 1;R!A(&YE=R!A9&1R97-S+@H` ` end
Esse é o arquivo “criptografado”. O ideal é você já redirecionar a saída do uuencode para outro arquivo:
$ uuencode arquivo_de_teste.txt arquivo_de_teste.txt > arquivo_de_teste.txt.uu
Agora com o comando uudecode e o arquivo arquivo_de_teste.txt.uu podemos recuperar o conteúdo original:
$ uudecode arquivo_de_teste.txt.uu $ cat arquivo_de_teste.txt Old programmers never die, they just branch to a new address.
Pegou? Podemos usar também o uuencode para transferir nossos arquivos binários rejeitados pelo gmail:
$ uuencode arquivo.exe arquivo.exe > arquivo.exe.uu
Agora só anexar o arquivo arquivo.exe.uu e enviar seu e-mail. Claro que o destinatário da mensagem deve saber como recuperar o arquivo.exe de volta, senão nada feito.
Para recuperar o arquivo, o destinatário deve digitar:
$ uudecode arquivo.exe.uu
Pronto! No link [1] você verá que o algoritmo uuencode aumenta o arquivo em aproximadamente 40%. Essa porcentagem é muita alta e é um dos motivos para terem abandonado o uuencode. Para melhorar isso, podemos ainda comprimir o arquivo uuencodado antes de enviá-lo por e-mail. Assim:
$ zip arquivo.exe.uu.zip arquivo.exe.uu
Agora o rementente terá que usar dois comandos para obter o arquivo.exe:
$ unzip arquivo.exe.uu.zip $ uudencode arquivo.exe.uu
Usando o xxd no lugar do uuencode
O xxd é um comando que descobri meio que sem querer na instalação padrão do Slackware 13.1. Você pode obter mais informações sobre ele em um post que fiz em [2]. Bem, o xxd é capaz de converter os bytes de um arquivo em sua representação na base hexadecimal.
$ xxd -p arquivo_de_teste.xt 4f6c642070726f6772616d6d657273206e65766572206469652c20746865 79206a757374206272616e636820746f2061206e65772061646472657373 2e0a
A saída representa o arquivo de entrada “criptografado”. Para obter o arquivo original, basta usarmos a opção -r do comando em cima dessa saída. Cada byte é representado por 2 algarismos hexadecimais. Isso quer dizer que o tamanho da saída do xxd será duas vezes maior, então o jeito é compactar:
$ xxd -p arquivo_de_teste.txt > arquivo_de_teste.txt.xxd $ zip arquivo_de_teste.txt.xxd.zip arquivo_de_teste.txt.xxd
Pronto. Agora envie o arquivo_de_teste.txt.xxd.zip como anexo. O destinatário terá que utilizar os seguintes comandos para o obter o arquivo original:
$ unzip arquivo_de_teste.txt.xxd.zip $ xxd -p -r arquivo_de_teste.txt.xxd > arquivo_de_teste.txt
Qual usar: xxd ou uuencode??
A saída do uuencode é bem menor do que a saída do xxd. Enquanto o uuencode aumenta o arquivo em 40%, o xxd o aumenta em 100% (duplica a quantidade). Vendo isso, podemos pensar que o xxd é muito mais desvantajoso que o uuencoe, mas o interessante vem agora: arquivos gerados pelo xxd possuem mais bytes repetidos e por isso, quando são comprimidos, apresentam tamanho menor do que aqueles retornados pelo uuencode. A desvantagem do xxd é que ele demora mais para realizar a transformação do que o uuencode.
Em geral, prefiro o xxd + zip por apresentar um menor arquivo de saída.
Outros Métodos
Métodos para burlar essa política do Google é o que não falta. Nesse post irei focar somente nesses dois já citados. Demais métodos podem ser encontrados no próprio Google. Que irônico. :S
Conclusão
Alguém poderia dizer que burlar essa política do google é desaconselhável e que alguma retaliação poderia ocorrer por parte da empresa e que você poderia até perder seu e-mail. Creio que isso é bobagem, pois o uso do uuencode já é conhecido faz tempo, e outra, o Google só faz essa linha dura em relação a arquivos executáveis, porque há pessoas que usam seus serviços para propagar malware. No nosso caso, podemos ficar tranquilos, pois nossa intenção não é prejudicar ninguém. ;)
Referências
[1] Uuencoding by wikipedia (Acessado em: Julho/2011)
http://en.wikipedia.org/wiki/Uuencoding
[2] Hexdump com o xxd (Acessado em: Julho/2011)
https://daemoniolabs.wordpress.com/2011/07/07/hex-dump-com-o-xxd/
Post editado em: 17/08/2012
Editado em: 04/12/2012 (s/remetente/destinatário/g :-D)