Pergunta

Existe uma maneira de implantar um programa Java em um formato que não é inversa-engineerable?

Eu sei como converter meu aplicativo em um arquivo JAR executável, mas eu quero ter certeza de que o código não pode ser a engenharia reversa, ou pelo menos, não facilmente.

Obfuscation do código-fonte não conta ... torna-se mais difícil de entender o código, mas não escondê-lo.

Uma pergunta relacionada é como bloquear compilado classes Java para evitar decompilation?


Depois de ter completado o programa, eu ainda teria acesso à fonte original, mantendo assim a aplicação não seria o problema. Se o aplicativo é distribuído, eu não gostaria que qualquer um dos usuários para ser capaz de decompor-lo. não ofuscação não conseguir isso, como os usuários ainda seria capaz de decompor-lo, e enquanto eles teriam dificuldade em seguir a ação flui, eles seriam capazes de ver o código, e, potencialmente, levar informações para fora do mesmo.

O que eu estou preocupado é se existe qualquer informação no código relativo ao acesso remoto. Há um host para o qual o aplicativo se conecta usando um user-id e senha fornecidos pelo usuário. Existe uma maneira de esconder o endereço do anfitrião do usuário, se esse endereço está localizado dentro do código fonte?

Foi útil?

Solução

Você poderia ofuscar seu arquivo JAR com YGuard . Não ofuscar seu código-fonte , mas as classes compiladas, por isso não há problema em manter o código mais tarde.

Se você quer esconder alguma corda, você pode criptografá-lo, tornando mais difícil para obtê-lo através do olhar para o código-fonte (que é ainda melhor se você ofuscar o arquivo JAR).

Outras dicas

A resposta curta é "Não, não existe".

A engenharia reversa é um processo que não implica a olhar para o código em tudo . É basicamente tentando entender os mecanismos subjacentes e, em seguida, imitá-los. Por exemplo, isso é como JScript aparece a partir do MS laboratórios, copiando o comportamento JavaScript do Netscape, sem ter acesso ao código. A cópia foi tão perfeita que até mesmo os erros foram copiados.

Se você sabe quais plataformas que são alvo, obter algo que compila o Java em código nativo, como Excelsior JET ou GCJ .

Curto disso, você nunca vai ser capaz de esconder o código-fonte, uma vez que o usuário sempre tem o seu bytecode e pode Jad -lo.

Você está escrevendo em uma língua que tem introspecção como parte da linguagem núcleo. Ele gera arquivos .class cujas especificações são amplamente conhecidos (permitindo assim outros fornecedores para produzir implementações de sala limpa de compiladores de Java e intérpretes).

Isto significa que existem decompilers publicamente disponíveis. Só é preciso algumas pesquisas no Google, e você tem algum código Java que faz a mesma coisa que o seu. Só que sem os comentários, e alguns dos nomes de variáveis ??(mas os nomes das funções permanecem as mesmas).

Realmente, ofuscação é sobre tudo que você pode obter (embora o código compilado já estará ligeiramente ofuscado) sem ir a C ou alguma outra linguagem totalmente compilada, de qualquer maneira.

Não use uma linguagem interpretada? O que você está tentando proteger de qualquer maneira? Se é bastante valioso, qualquer coisa pode ser a engenharia reversa. As chances de alguém cuidar suficiente para reverter a maioria dos projetos de engenharia é mínima. Obfuscation fornece pelo menos um obstáculo mínimo.

Certifique-se de que o seu propriedade intelectual (IP) é protegida através de outros mecanismos. Particularmente para código de segurança, é importante que as pessoas sejam capazes de inspecionar implementações, de modo que a segurança está no algoritmo, não na fonte.

Estou tentado a perguntar por que você iria querer fazer isso, mas eu vou deixar isso sozinho ...

O problema que vejo é que a JVM, como o CLR, precisa ser capaz de intrepert você código para compilação JIT e executá-lo. Você pode torná-lo mais "complexo", mas dado que a especificação de bytecode é muito bem documentado, e existe em um nível muito mais elevado do que algo como a especificação x86 assembler, é improvável que você pode "esconder" o processo de fluxo, já que ele tem para estar lá para o programa de trabalho em primeiro lugar.

Ele não pode ser feito.

Qualquer coisa que pode ser compilado pode ser de-compilado. O melhor que você pode fazer é Ofuscação o inferno fora dele.

Dito isto, há algumas coisas interessantes acontecendo em Quantum Cryptography. Essencialmente, qualquer tentativa de ler a mensagem muda-lo. Eu não sei se isso poderia ser aplicado ao código-fonte ou não.

Mesmo se você compilar o código em linguagem de máquina nativa, existem todos os tipos de programas que permitem essencialmente decompile-lo em linguagem assembly e seguir o fluxo do processo (OlyDbg, IDA Pro).

Faça-o em um serviço web. Então você é o único que pode ver o código fonte.

Ele não pode ser feito. Este não é um problema Java. Qualquer linguagem que pode ser compilado pode ser compilado para Java, é apenas mais fácil.

Você está tentando mostrar a alguém uma imagem sem realmente mostrá-los. Não é possível. Você também não pode esconder seu anfitrião, mesmo se você esconde no nível do aplicativo. Alguém ainda pode grap-lo via Wireshark ou qualquer outro sniffer de rede.

Como alguém disse acima, engenharia reversa poderia sempre descompilar seu executável. A única maneira de proteger o seu código fonte (ou algoritmo) é não distribuir seu executável.

separar seu aplicativo em um código do servidor e um aplicativo cliente, esconder a parte importante de seu algoritmo em seu código de servidor e executá-lo em um servidor de nuvem, apenas distribuir o código do cliente que funciona apenas como um getter de dados e senter.

Por isso mesmo o seu código de cliente é compilado. Você não está perdendo nada.

Mas com certeza isso irá diminuir o desempenho ea conveniência do usuário.

Eu acho que isso pode não ser a resposta que você está procurando, mas apenas para levantar diferente ideia de proteger o código fonte.

Com nada interpretados em algum momento ele tem que ser processado "às claras". A corda iria aparecer claro como o dia uma vez que o código é executado através JAD. Você poderia implementar uma chave de criptografia com seu aplicativo ou fazer uma cifra básica ceasar para criptografar o anfitrião informações de conexão e descriptografar em tempo de execução ...

Mas em algum momento durante o processamento das informações de conexão de host deve ser colocado em claro para que seu aplicativo se conecte ao host ...

Assim, você poderá estaticamente escondê-lo, mas você não pode escondê-lo durante o tempo de execução, se a execução de um depurador

Isso é impossível. A CPU terá que executar o seu programa, ou seja, o programa deve estar em um formato que uma CPU pode entender. CPUs são muito mais burro do que seres humanos. Ergo, se uma CPU pode entender o seu programa, um ser humano pode.

Ter preocupações sobre ocultando o código, eu correria ProGuard de qualquer maneira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top