Projecto Obfuscador de código PHP
Eu não era para criar página só para este programa, mas como eu tinha um post antigo no Facebook com muito texto sobre ele, resolvi colocar numa página em separado.
Tal como referi muita vez, para mim Programação é uma ferramenta.
Um dia vi que me dava jeito obfuscar código em PHP, e criei o obfuscador.
Isto porque estava num local a trabalhar num projecto em PHP, e havia o interesse em arrendar o projecto a clientes mas sem dar o código.
O código teria de ser dado, mas há uma grande diferença entre dar um código completo, e um código obfuscado.
Além disso também existiam pessoas na empresa que tinham acesso ao código e que poderiam levá-lo para outras empresas, até porque alguns desejavam sair da empresa. E havia interesse em que essas pessoas pudessem editar algum código mas sem ter acesso a tudo.
Assim, queria um obfuscador de código PHP, e criei um.
Tal como expliquei noutros lados, eu sempre tentei permanecer anónimo até por volta de 2018/2019 quando comecei a partilhar coisas para fora, e este foi partilhado só entre amigos.
Tinha sido criado em .Net, normalmente usava C# ou VB.Net, e andava a usar .Net porque tinha criado várias librarias para .Net, desde o projecto do Network Pinger em que usei .Net para o fazer à pressa, e assim reaproveitava código.
Notem que um obfuscador PHP é mais complexo do que em outras linguagens, porque o PHP até pode ter variáveis tipo “$ola”, dentro de aspas, entre texto normal (dentro de aspas também), entre outras coisas, por isso pode dar mais trabalho interpretar e obfuscar código nele do que se pensa à partida.
Fica aqui o post que partilhei no Facebook entre amigos, em 2013-01-07 sobre o mesmo:
«2013-01-07 – PHP/Javascript Obfuscator, Freeware criado em .Net.
Finalmente acabei o obfuscador de PHP que tenho vindo a desenvolver aos poucos.
Ele pega numa pasta cheia de ficheiros PHP, de algum projecto, e obfusca o código todo.
Basicamente, ele faz parsing do código, reconhece variáveis, funções, classes, constantes, namespaces, reconhece interligações entre ficheiros, ou seja, a variável $bla de um ficheiro é interligada com os restantes ficheiros, e após ter tudo interligado, faz a obfuscação total do código.
Foi testado agora mesmo com um projecto com mais de 150 ficheiros PHP, com dezenas de milhares de linhas de código, e obfuscou tudo na perfeição sem erros.
Faz inclusivé a obfuscação de variáveis e nomes dentro de aspas (no PHP é comum o uso de variáveis dentro de aspas) de forma inteligente, reconhece se são públicos ou privadas, e tem muitas opções de obfuscação, poderá ser feita com encolhimento de nomes, geração de nomes aleatórios, sequencial ou aleatória, e poderá eliminar totalmente enters e espaços ou ordenar o código como se pode ver no ponto à esquerda.
É certo que poderão ainda existir alguns erros.
No exemplo acima, ele obfuscou mais de 100 ficheiros PHP, com dezenas de milhares de linhas de código, com milhares de variáveis, centenas de funções, interligações, classes, públicas e privadas, includes, requires, tudo na perfeição sem bugs.
Ele reconhece o que é variável nossa ou reservada, classes e funções definidas por nós ou não definidas, no fundo este programa que copiei faz praticamente o mesmo que um interpretador PHP, mas em vez de executar o código, obfusca-o.
Poderão ainda existir bugs é certo, mas ficará assim em beta testing, e só daqui a meses quando o pessoal testar e vir que não tem erros, é que lançarei uma versão final e bonita em Freeware na Internet.
Não consegui largar este projecto antes, finalmente terminei, não foi na data simbólica que quis, mas foi no dia 2013-01-07, gosto do número 07 e será hoje que retomarei o projecto “Robin Hood”.
Como resultado, ficam com o código totalmente obfuscado, e ninguém se dará ao trabalho de desobfuscar um código de dezenas de milhares de linhas encolhidas numa só linha com nomes de variáveis e métodos aleatórios, sem comentários, etc. É ideal para proteger código.
Tem também a opção de encolher sílabas de nomes, fazendo com que uma função de nome “dadosDosClientesNovosDoSistema” passe a algo como “dadCliNov”, mnemónicas fáceis de compreender, com limites de tamanhos de sílabas e número das mesmas.
Ele faz parsing e obfuscação de Javascript também se necessário.
Ele não está ainda terminado a 100% no que diz respeito a Namespaces PHP tipo namespace\função, essa parte deixo para daqui a uns meses.
Nem imaginam o trabalho que estes algoritmos deram! Durante uns bons meses não quero voltar a olhar para isto.
Este Freeware beta version tem umas 50 opções de obfuscação/optimização com ele funcionais.
PS: Pode ser usado sem obfuscação, apenas para remoção de lixo no código (comentários etc), cortar espaços e enters em duplicados, alinhar o código, reduzir tamanho, encurtar variáveis muito longas, sem obfuscar. Optimizar.
De momento quem quiser experimentar peça-me.
UPDATE 2013-01-09:
Afinal existiam alguns bugs que corrigi, ele alterava funções e classes sem pensar que são case insensitive (apesar de as variáveis não serem) e daí por vezes obfuscava tudo bem e outras não.
Já corrigi isso, agora fiz obfuscação a um projecto com mais de 100 PHP’s, e correu tudo bem, mesmo com variáveis públicas, interligadas, etc, tudo na perfeição sempre.
Só sobram 2 bugs, dos que vi, um é o número máximo de strings, que se estiver a 1 fica num ciclo infinito, e o outro é algo que quase nunca acontecerá que é ele poder criar uma função com nome de outra que já existe (talvez aconteça 1 num milhão) mas pelo sim pelo não já vou criar forma de o utilizador poder colocar uma lista de funções que não deverão ser assumidas pelo PHP ao gerar novas, e assim será 100% infalível a obfuscação.
O tratamento de Namespaces (não operacionais a 100% quando misturadas com funções) ficará para meses depois e não nesta versão.
Em Javascript as variáveis não seriam encriptadas da mesma forma porque este está preparado para PHP, mas em código C possivelmente não funciona muito mal, talvez mais tarde o adapte para C e Javascript, Javascript seria útil, e quem sabe mais tarde VB.
Quem quiser a nova versão é só alterarem o nome do rar de download que enviei o 07 para 09.
PS2: Há apenas um ponto de falha ainda, ele não tem ainda a lista de funções php existentes ou keywords, e por isso, se ele traduzir uma função de criarDados() para if() ele vai dar erro porque o compilador no servidor vai assumir o if() como um if/then e não como função, daí ser normal poder surgir um “número de argumentos inválido” que se deve ao ele traduzir mal uma função para algo já do sistema. Quando eu inserir a lista no software e não o deixar criar funções com nome de funções já existentes, ele nunca falhará.
De momento para contornar esta situação, se o código der erro, façam obfuscar novamente até que o código fique a 100% (sem usar nomes já existentes). Versão beta-testing final para dentro de dias.
Isto é para código PHP essencialmente. »
2021-04-15.