Acredito que este é o melhor forum para perguntar isto.
Por favor, vamos deixar de lado todo o papo conceitual sobre software livre, venda de serviços e etc…
Preciso proteger de descompilação as classes da minha aplicação que rodam no servidor. Ou pelo menos, evitar que qualquer pessoa simplesmente baixe um descompilador e tenha acesso ao fonte original. Estou falando de dificultar as coisas e restringir o numero de pessoas capazes de conseguir o codigo fonte.
A minha idéia :idea: é criar uma biblioteca C++ que valide alguns parametros de instalação e faça uma criptografia de um bytearray (byte[]).
Esta biblioteca seria chamada por uma classe java.lang.instrument.Transformer via JNI.
A tal classe Transformer recebe como parametro um bytearray contendo a classe a ser instancia pela JVM. Este transformer é chamado pelo parametro da JVM5, -javaagent indicando um JAR com a classe PreMain.
Ou seja, para cada classe que será instanciada, será chamado a biblioteca C++ que irá validar a permissão de execução (por exemplo quem assinou o JAR da PreMain) e depois descriptografar a classe e devolve-la para a JVM carregar.
Assim, as minhas classes estariam criptografadas no servidor.
As únicas classes abertar seriam a PreMain e a Transformer. Como a rotina de permissão de execução e descriptografia estão dentro da biblioteca C++, não tem problema descompilar apenas estas duas.
O ponto negativo é o deploy. 
Será necessário criptografar as classes antes de enviar para o servidor e será necessário compilar uma biblioteca para cada servidor destino.
O que acham deste “padrão de projeto” ? :?:
A simples descompilação não funciona.
Testando o signer da classe chamadora evita re-compilação e depuração via IDE.
Qual a outra maneira de tentar descompilar uma classe ?
Será que consigo diminuir o numero de pessoas que irão descompilar a minha aplicação ?
Todos os comentário serão bem-vindos ! :!:
Juliano
Muito iniciante em JAVA

