Quero criar um aplicativo JavaScript que não seja de código aberto e, portanto, desejo aprender como ofuscar meu código JS? Isso é possível?
Quero criar um aplicativo JavaScript que não seja de código aberto e, portanto, desejo aprender como ofuscar meu código JS? Isso é possível?
Respostas:
Ofuscação:
Experimente o Compressor YUI . É uma ferramenta muito popular, criada, aprimorada e mantida pela equipe de interface do usuário do Yahoo.
Você também pode usar:
ATUALIZAÇÃO: Esta pergunta foi feita originalmente há mais de 10 anos e a YUI não é mais mantida. O Google Closure Compiler ainda está em uso e o UglifyJS pode ser executado localmente através do gerenciador de pacotes do nó:npm install -g uglify-js
Dados da sequência privada:
Manter os valores das strings em sigilo é uma preocupação diferente, e a ofuscação não trará muitos benefícios. Obviamente, ao empacotar sua fonte em uma bagunça distorcida e minificada, você tem uma versão leve da segurança através da obscuridade . Na maioria das vezes, é o usuário que está visualizando a fonte, e os valores da cadeia de caracteres no cliente destinam-se a seu uso, de modo que esse tipo de valor de cadeia particular nem sempre é necessário.
Se você realmente tivesse um valor que nunca desejaria que um usuário visse, teria algumas opções. Primeiro, você pode fazer algum tipo de criptografia, que é descriptografada no carregamento da página. Essa provavelmente seria uma das opções mais seguras, mas também muito trabalho que pode ser desnecessário. Você provavelmente poderia codificar em base64 alguns valores de string, e isso seria mais fácil .. mas alguém que realmente queria esses valores de string poderia decodificá-los facilmente . A criptografia é a única maneira de impedir verdadeiramente alguém de acessar seus dados, e a maioria das pessoas acha que é mais segurança do que precisa.
Nota:
Sabe-se que a ofuscação em Javascript causa alguns erros. Os obfuscators estão ficando um pouco melhor sobre isso, mas muitos equipamentos decidir que eles vêem benefício suficiente de minifying e gzipping , e as economias adicionais de ofuscação nem sempre vale a pena . Se você está tentando proteger sua fonte, talvez decida que vale a pena, apenas para tornar seu código mais difícil de ler. JSMin é uma boa alternativa.
--preserve-semi
. Reescrever as variáveis privadas para a, b, c etc geralmente é seguro. Outra coisa que faço é fazer com que o minificador coloque uma quebra de linha após cada ponto e vírgula no código --line-break 0
. Em seguida, na produção, se houver erro, tenho pelo menos uma linha de referência válida para trabalhar e posso encontrar esse código na minha cópia de desenvolvimento. Caso contrário, você acaba com um erro em uma enorme linha de código e não faz ideia de onde está o erro.
Estou surpreso que ninguém tenha mencionado o Closure Compiler do Google . Ele não apenas minimiza / compacta, mas analisa para encontrar e remover código não utilizado e reescreve para obter a máxima minimização. Ele também pode fazer a verificação de tipo e avisa sobre erros de sintaxe.
O JQuery mudou recentemente do YUI Compresser para o Closure Compiler e viu uma " melhoria sólida "
Ofuscação nunca pode realmente funcionar. Para quem realmente deseja obter o seu código, é apenas um lance de velocidade. Pior ainda, impede os usuários de corrigir bugs (e enviar as correções de volta para você) e dificulta o diagnóstico de problemas em campo. É um desperdício de seu tempo e dinheiro.
Converse com um advogado sobre leis de propriedade intelectual e quais são suas opções legais. "Código aberto" não significa "as pessoas podem ler o código". Em vez disso, o Open Source é um modelo de licenciamento específico que concede permissão para usar e modificar livremente seu código. Se você não conceder essa licença, as pessoas que copiam seu código violam e (na maior parte do mundo) você tem opções legais para detê-los.
A única maneira de realmente proteger seu código é não enviá-lo. Mova o código importante do lado do servidor e faça com que seu código Javascript público faça o Ajax chamar.
Você pode ofuscar a fonte de javascript tudo o que quiser, mas ela sempre terá engenharia reversa apenas por exigir que todo o código-fonte seja realmente executado na máquina cliente ... a melhor opção que posso pensar é fazer todo o processamento com código do lado do servidor, e todo o código do cliente que o javascript faz é enviar solicitações de processamento para o próprio servidor. Caso contrário, qualquer pessoa sempre poderá acompanhar todas as operações que o código está executando.
Alguém mencionou base64 para manter as cordas seguras. Esta é uma péssima ideia. O Base64 é imediatamente reconhecível pelo tipo de pessoa que deseja fazer engenharia reversa do seu código. A primeira coisa que eles farão é descriptografar e ver o que é.
Existem várias ferramentas de ofuscação de JavaScript disponíveis gratuitamente; no entanto, acho importante observar que é difícil ofuscar o JavaScript ao ponto em que não pode ser feito com engenharia reversa.
Para esse fim, existem várias opções que usei em algum grau de horas extras:
Compressor YUI . O compressor JavaScript do Yahoo! Faz um bom trabalho ao condensar o código que melhorará seu tempo de carregamento. Há um pequeno nível de ofuscação que funciona relativamente bem. Essencialmente, o Compressor altera os nomes das funções, remove os espaços em branco e modifica as variáveis locais. É isso que eu uso com mais frequência. Esta é uma ferramenta baseada em Java de código aberto.
JSMin é uma ferramenta escrita por Douglas Crockford que busca minificar sua fonte de JavaScript. Nas próprias palavras de Crockford, "o JSMin não ofusca, mas se agrava". Seu principal objetivo é reduzir o tamanho da sua fonte para carregamento mais rápido nos navegadores.
Obfuscator JavaScript grátis . Essa é uma ferramenta baseada na Web que tenta ofuscar seu código, na verdade, codificando-o. Eu acho que as compensações de sua forma de codificação (ou ofuscação) podem custar o tamanho do arquivo; no entanto, isso é uma questão de preferência pessoal.
[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]
vars em pelo menos [var1, var2,..]
dentro de um minuto. Eu posso literalmente desglomerar, re-indentar e pesquisar / substituir nomes de var dentro de dois minutos. E não, sou mais esperto do que um Jr. Dev comum. O simples fato é que não há como ocultar o JS do lado do cliente. Você pode comprar 5 minutos, MAX, mas isso não serve para nada. Esse material é realmente apenas para vender alguém que não conhece o código na "Segurança" adicionada. Ninguém que já escreveu uma linha de JS compraria essa porcaria.
O que eu faria:
A. Troll o hacker!
Esta será a segunda parte do meu código javascript secreto falso / ofuscado LAUNCHER. O que você vê no código fonte.
O que esse código?
var ajax=function(a,b,d,c,e,f){
e=new FormData();
for(f in d){e.append(f,d[f]);};
c=new XMLHttpRequest();
c.open('POST',a);
c.setRequestHeader("Troll1","lol");
c.onload=b;
c.send(e);
};
window.onload=function(){
ajax('Troll.php',function(){
(new Function(atob(this.response)))()
},{'Troll2':'lol'});
}
B. Ofusque o código um pouco
O que é isso?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C Crie um arquivo php difícil de exibir com o código real dentro
O que esse código php?
Se tudo estiver ok, ele mostrará o código certo, ou um código falso ou ban ban, feche a página.
<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>
referenciador base64 = http://here.is/my/launcher.html
SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';
FAKE = window.open('', '_self', '');window.close();
Agora .. se você definir manipuladores de eventos no javascript SECRET, provavelmente estará acessível .. precisará defini-los fora com o código de inicialização e apontando para uma função SECRET aninhada.
SO ... existe uma maneira fácil de obter o código?
document.body.appendChild(document.createElement('div')).innerText='Awesome';
Não tenho certeza se isso funciona, mas estou usando o chrome e verifiquei Elementos, Recursos, Rede, Fontes, Linha do tempo, Perfis, Auditorias, mas não encontrei a linha acima.
note1: se você abrir o URL Troll.php em Inspecionar elemento-> rede no chrome, você obterá o código falso.
note2: todo o código foi escrito para navegadores modernos. O polyfill precisa de muito mais código.
EDITAR
launcher.html
<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
Troll.php
<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
Tente JScrambler . Eu dei uma volta recentemente e fiquei impressionado com isso. Ele fornece um conjunto de modelos para ofuscação com configurações predefinidas para aqueles que não se importam muito com os detalhes e só querem fazê-lo rapidamente. Você também pode criar ofuscação personalizada escolhendo as transformações / técnicas desejadas.
O problema com as linguagens interpretadas é que você envia a fonte para fazê-las funcionar (a menos que você tenha um compilador para o bytecode, mas, novamente, é bastante trivial descompilar).
Portanto, se você não quer sacrificar o desempenho, você só pode atuar em nomes de variáveis e funções, por exemplo. substituindo-os por a, b ... aa, ab ... ou a101, a102, etc. E, é claro, remova o máximo de espaço / novas linhas possível (é o que os chamados compressores JS fazem).
Seqüências ofuscantes terão um impacto no desempenho, se você precisar criptografá-las e descriptografá-las em tempo real. Além disso, um depurador JS pode mostrar os valores finais ...
Ao contrário da maioria das outras respostas que sugiro contra o YUI Compressor; você deve usar o Google Closure .
Não muito porque comprime mais, mas principalmente porque ele captura erros de javascript, como o a = [1,2,3,];
que faz o IE dar errado.
Um aplicativo baseado em Javascript não de código aberto é bastante tolo. Javascript é uma linguagem interpretada do lado do cliente. Ocultação não é muita proteção.
A ofuscação de JS geralmente é feita para reduzir o tamanho do script, em vez de "protegê-lo". Se você estiver em uma situação em que não deseja que seu código seja público, o Javascript não é o idioma certo.
Existem muitas ferramentas disponíveis, mas a maioria tem a palavra "compressor" (ou "minificador") em seu nome por um motivo.
Você não pode proteger o código do lado do cliente: basta pressionar F12 no Google Chrome, pausar a execução do javascript e você obterá todas as strings, mesmo as criptografadas. Embeleze -o e renomeie as variáveis e você obterá quase o código original.
Se você estiver escrevendo javascript no servidor (ou seja, NodeJS), tem medo de alguém invadir seu servidor e deseja dificultar o trabalho do hacker, oferecendo mais tempo para recuperar o acesso e use os compiladores javacript :
Você precisa usar o Closure Compiler na compilação avançada, pois é a única ferramenta que renomeia todas as suas variáveis, mesmo que sejam usadas em vários arquivos / módulos. Mas só tem um problema: só funciona se você escrever no seu estilo de codificação .
Eu posso recomendar o JavaScript Utility por Patrick J. O'Neil. Ele pode ofuscar / compactar e compactar e parece ser muito bom nisso. Dito isto, nunca tentei integrá-lo em um script de construção de qualquer tipo.
Quanto à ofuscação x minificação - eu não sou um grande fã da primeira. Isso torna a depuração impossível (erro na linha 1 ... "espere, existe apenas uma linha") e eles sempre levam tempo para descompactar. Mas se você precisar ... bem.
Gostaria de sugerir primeiro minify com algo como YUI Compressor e, em seguida, converter todas as seqüências e números em valores HEX usando algo como http://www.javascriptobfuscator.com/
Com isso, o código ficaria quase impossível de entender e acho que, nesta fase, levará mais tempo para um hacker reencenar seu código do que realmente se ele reescrevesse do zero. Reescrever e Clonar é o que você realmente não pode parar. Afinal, somos pessoas livres!
O Dean Edward's Packer é um excelente ofuscador, embora ofusque principalmente o código, não quaisquer elementos de string que você possa ter dentro do seu código.
Consulte: Ferramenta de compactação Javascript on - line e selecione Packer (Dean Edwards) na lista suspensa.
Experimente esta ferramenta Javascript Obfuscator
Eu o usei no meu jogo HTML5, não apenas reduziu o tamanho de 950 KB para 150, mas também tornei o código fonte ilegível. Compiladores e minificadores de fechamento são reversíveis. Pessoalmente, não sei como reverter essa ofuscação.
Eu uso Jasob há anos e é sem dúvida o melhor ofuscador por aí.
Ele possui uma interface avançada, mas ainda é intuitivo e fácil de usar.
Ele também manipula arquivos HTML e CSS.
A melhor maneira de usá-lo é prefixar todas as suas variáveis privadas com algo como um sublinhado; depois, use o sort
recurso para agrupá-las e marcá- las como alvos para ofuscação.
Os usuários ainda podem visualizar sua fonte, mas é muito mais difícil decifrar quando suas variáveis privadas são convertidas de algo como _sUserPreferredNickName
para a
.
O mecanismo contabilizará automaticamente o número de variáveis direcionadas e as priorizará para obter a compressão máxima.
Eu não trabalho para Jasob e não ganho nada em promovê-los, apenas oferecendo alguns conselhos amigáveis.
A desvantagem é que não é gratuito e é um pouco caro, mas ainda vale a pena quando comparado a alternativas - as opções 'gratuitas' nem chegam perto.
Você já experimentou o Bananascript ? Produz código altamente compactado e completamente ilegível.
eval()
na última linha para console.log()
e seu console vai cuspir fora a coisa toda
Estou usando o utilitário Closure-Compiler para a ofuscação de java-script. Minifica o código e tem mais opções de ofuscação. Este utilitário está disponível no código do Google no URL abaixo:
Ferramentas de fechamento
Mas hoje em dia estou ouvindo muito do UglifyJS. Você pode encontrar várias comparações entre o Closure Compiler e o UglifyJS, nas quais o Uglify parece ser um vencedor.
UglifyJS: um novo e rápido compressor JavaScript para Node.js que está a par do fechamento
Em breve eu daria chance ao UglifyJS.
Como ofuscador / compressor JavaScript / HTML / CSS, você também pode experimentar o Patu Digua .
Este minimiza, mas não ofusca. Se você não quiser usar o Java da linha de comando, cole seu javascript em um formulário da web.
Você definitivamente deve considerar dar uma olhada no Obfuscriptor .
Vou além dos truques típicos de redução de Javascript que vimos em outras ferramentas, como o YUI Compressor ou o Google Closure .
O código ofuscado parece mais com criptografado. Diferente de tudo que eu já vi antes.
Se você usar uma biblioteca JavaScript, considere o Dojo Toolkit que é compatível (após pequenas modificações) com a compilação do modo Avançado do Closure Compiler.
Dojo - a única biblioteca JavaScript compatível com o compilador de fechamento
O código compilado com o modo Closure Advanced é quase impossível de realizar engenharia reversa, mesmo passando por um embelezador, pois toda a base de código (incluindo a biblioteca) é ofuscada. Também é 25% pequeno, em média.
O código JavaScript que é apenas minificado (YUI Compressor, Uglify etc.) é fácil de fazer engenharia reversa depois de passar por um embelezador.
Eu usei isso no passado, e faz um bom trabalho. Não é gratuito, mas você definitivamente deve dar uma olhada.
Obfuscator e codificador JavaScript