Proteção anti-pirataria

17 respostas
neofito

Bom dia galera…

Introdução:
Há mais ou menos 1 ano, fui indicado para o desenvolvimento de uma aplicação na empresa onde trabalho atualmente. Essa aplicação devia gerenciar informações previdenciárias de funcionários e gerar um relatório. Pela sua simplicidade, eu decidi implementá-la em VB6. E assim o teria feito se a empresa não tivesse adiado o projeto quando eu estava já em fase final de implementação. Naquela época eu já conhecia Java, mas não o suficiente para fazer o programa nessa linguagem. Mas agora a empresa retomou o projeto, e estou com um forte desejo de implementá-lo em Java, para eliminar limitações que o VB6 ocasionou e outros problemas, além de fazer que ele rode em Windows e Linux, as duas plataformas alvo do programa.

O problema:
Como o programa pode ser largamente usado, deve-se implementar uma lógica para impedir (ou pelo menos restringir) a pirataria. Já tenho a lógica parcialmente planejada, mas o [color=“red”]problema[/color] é que eu preciso, no caso do Windows, ter acesso ao Registro e obter informações sobre o hardware instalado, como por exemplo o “Número de série do volume” do HD e o tipo/nome do processador.

A questão:
Sei que deveria usar JNI para isso, tanto para acessar o Registro como para obter informações sobre o hardware (como no tópico Número de série do volume, como descobrir?). Mas:

1 - Há alguma outra forma de implementar “lógica” anti-pirataria em Java? Mesmo se eu fizesse uma ativação via internet, teria que ter acesso ao Registro do Windows.

2 - Eu consigo invocar DLL’s ActiveX ou controles ActiveX (criadas com VB ou Delphi) com Java? Uma vez não sei onde eu li que SWT consegue invocar tais componentes.

3 - Como eu implemantaria isso em Linux, já que ele não possui um equivalente ao Registro do Windows (ou possui?)?

De qualquer forma, isso vai dar uma boa discussão. É aí isso galera.

17 Respostas

aborges

:arrow: 1 - Há alguma outra forma de implementar “lógica” anti-pirataria em Java? Mesmo se eu fizesse uma ativação via internet, teria que ter acesso ao Registro do Windows.

Acho q vc nao deveria se preocupar tanto com isso, afinal de contas, c o cara realmente quiser piratear seu produto, basta ele decompilar seu codigio e tirar a trava!

:arrow: 2 - Eu consigo invocar DLL’s ActiveX ou controles ActiveX (criadas com VB ou Delphi) com Java? Uma vez não sei onde eu li que SWT consegue invocar tais componentes.

Basta usar o JACOB, q acessa qualquer COM utilizando JNI

:arrow: 3 - Como eu implemantaria isso em Linux, já que ele não possui um equivalente ao Registro do Windows (ou possui?)?

Esta eu fico devendo :wink:

danieldestro

Existe uma forma de vc acessar o Registro do Windows, sem usar JNI, usando classes Java mesmo.

Na Mundo Java saiu um artigo sobre isso.

neofito

“aborges”:
:arrow: 1 - Há alguma outra forma de implementar “lógica” anti-pirataria em Java? Mesmo se eu fizesse uma ativação via internet, teria que ter acesso ao Registro do Windows.

Acho q vc nao deveria se preocupar tanto com isso, afinal de contas, c o cara realmente quiser piratear seu produto, basta ele decompilar seu codigio e tirar a trava!

Eu vou usar um ofuscador de código, o [color=“orange”]ProGuard[/color], e umas técnicas pra difcultar o trabalho de quem queira ainda assim tentar decifrar o código ofuscado. Dê uma olhada neste artigo, do Portal Java.

Valeu pelo [color=“orange”]JACOB[/color], parece ser bem interessante…

neofito

“danieldestro”:
Existe uma forma de vc acessar o Registro do Windows, sem usar JNI, usando classes Java mesmo.

Na Mundo Java saiu um artigo sobre isso.

Valeu Daniel…

Vc deve estar se referindo à Preferences API. Dei uma pesquisadinha e encontrei um artigo interessante no JavaFree…

Mas a pergunta que não quer calar é:

“neófito”:
:arrow: 3 - Como eu implemantaria isso em Linux, já que ele não possui um equivalente ao Registro do Windows (ou possui?)?

:?: :!:

danieldestro

Exato!

smota

Sei sei, implementar é muito legal, bacana e tudo mais … mas já que isso é tão importante porque você não usa um produto testado e aprovado para isso?

O Google te ajuda!

Luca

Olá

  1. Contra a pirataria você deve ter:
    a) Um bom contrato
    b) Particularidades customizadas no sistema
    c) Trava de hardware no servidor
    d) Autenticação dos clientes no servidor
    e) Código obfuscado e ClassLoader com criptografia para dificultar o leigo++
    f) Amarrar em dispositivos com número serial por hardware (Registry e HD não servem)
    g) O que a imaginação do profissional quiser
    h) Usar a dica do mota.

  2. Esqueça ActiveX. Para acessar DLLs use JNI que é bem fácil para quem conhece C.

  3. Para Linux tudo que está em (1) funciona

Cuidado com muita proteção porque a vítima será você no dia a dia de deployments mais complexos.

[]s
Luca

neofito

“Luca”:

f) Amarrar em dispositivos com número serial por hardware (Registry e HD não servem)

O que vc quer dizer com isso, mais especificamente?

“Luca”:

2) Esqueça ActiveX. Para acessar DLLs use JNI que é bem fácil para quem conhece C.

Eu quero usar ActiveX porque sou um ex-programador VB/Delphi. Conheci C, mas não o uso já faz uns 3 anos… então, se houver alguma API do Windows que eu possa usar, já vai ficar mais fácil pra mim.

Eu sei que isso tira a portabilidade da aplicação, mas a minha idéia é desenvolver uma espécie de componente pra que eu possa garantir um mínimo de segurança para a aplicação…

kuchma

“neófito”:
Mas a pergunta que não quer calar é:

“neófito”:
:arrow: 3 - Como eu implemantaria isso em Linux, já que ele não possui um equivalente ao Registro do Windows (ou possui?)?

:?: :!:

De uma estudada nos arquivos do /proc. Geralmente ai ficam diversas informacoes do sistema (nao sei se tem o numero que voce precisa). P.ex.: cat /prob/cpuinfo traz diversas informacoes sobre o processador, memória, etc.

Marcio Kuchma

Luca

Olá

“neófito”:
O que vc quer dizer com isso, mais especificamente?

Que registry e HD não servem porque qualquer um pode mudar o número.

Já com MAC-Address isto não é possível

Use DLLs escritas em VC++. Não se importe com sua experiência anterior, contrate quem saiba fazer. Afinal o mais importante você também vai ter que contratar fora que é o advogado para escrever um bom contrato.

[]s
Luca

kuchma

Apenas para complementar (no caso especifico de procurar informacoes do HD): /proc/ide/hdX tem diversos arquivos com informacoes do disco onde X eh “a” (IDE mestre primario), “b” (IDE escravo primario), etc.

Marcio Kuchma

M

Tambem estou trabalhando num projeto desse tipo.
Alem de verificar Hd e essas coisas, voce pode usar ofuscadores de codigo, digitais de sistema (uma propriedade que identifique o computador/sistema, como o numero do HD, MAC, estrutura de diretorios, etc), verificadores de codigo (estou utilizando um verificador de codigo feito por mim mesmo que consiste em uma thread que verifica se o programa nao foi alterado), codigo mutavel, auditoria e upgrades.
Importante observer que, como alguem jah disse, nao dah pra garantir 100%, uma vez que o cara pode reverter o codigo e remover a trava. A ideia eh soh dificultar o maximo possivel. Pesquise por essas tecnicas e voce vai achar uma porcao de coisas interessantes.

louds

Se o software não for para produção em larga escala empacote ele unicamente para cada cliente.

Quando o cliente assinar o contrato voce gera 1 certificado digital com poucos meses de duração e entrega tua aplicação criptografada contra esse certificado. Não esqueça de assinar e selar todos jar da aplicação.

Dessa forma se o cliente “emprestar” o software, ele vai ter que entregar 1 arquivo escrito “copia do cliente XXX”. Esse argumento é bem interessante pq assinaturas digitais tem valor legal e voce vai poder esfolar o cara se encontrar uma copia pirata do tal software.

Se você estiver especialmente maldoso vai usar OCSP e verificar online a validade do certitificado.

Dependendo da sua paranóia, uma media muito mais eficaz que usar obfuscadores é usar um offline compiler, como o gcj ou o excelsiorJ (acho que é isso).

Mas como o Luca falou, o MAIS importante é um bom contrato, que esse é assinado por um gerente. Um bicho muito mais facil de assustar com coisas como “nosso software usa a tecnologia patenteada de ‘digital eletrônica’, que nos permite saber a qualquer momento onde e quem está usando ele. Voce sabia que a IBM está estudando licenciar essa tecnologia para usar com o websphere?”.

M

O que significa exatamente “selar” um jar? Evita que eu possa abrir e decompilar?

Outra coisa, a assinatura nao serve apenas para o cliente se certificar de que o software realmente eh seu? Por exemplo, rodando um aplicativo que tenha a asssinatura da IBM, eu simplesmente sei que eh da IBM, mas nao impede que eu pirateie, certo?

louds

“mtakeda”:
O que significa exatamente “selar” um jar? Evita que eu possa abrir e decompilar?

Outra coisa, a assinatura nao serve apenas para o cliente se certificar de que o software realmente eh seu? Por exemplo, rodando um aplicativo que tenha a asssinatura da IBM, eu simplesmente sei que eh da IBM, mas nao impede que eu pirateie, certo?

Sela uma jar significa tornar o conteúdo dele inalteravel, se alterar deixa de ser válido e a VM tem que recursar. Selar os packages costuma ser um boa idéia também. Packages selados não podem ser usados por classes fora do jar.

Um certificado digital pode ser usado para assinar e criptografar documentos.

Minha sugestão foi gerar 1 certificado digital por cliente e entregar o programa criptografado pro certificado dele.

Ou seja, somente ele, com a copia privada do certificado pode abrir os arquivos.

M

Esse negocio de selar parece interessante. Sabe me explicar como funciona? Por exemplo, como a VM sabe que eu alterei o Jar?
Se quiser que eu procure no google eh soh falar! (mas me diz por qual termo tenho que procurar: “selar jar” mesmo?) :oops:

Quanto ao certificado, nao acaba dando no mesmo? Deixa eu ver se entendi: voce criptografa a aplicacao e o certificado decriptografa na hora de rodar (ou algum esquema assim). Mas, aih nao acaba dando no mesmo, soh que agora o cara precisa quebrar o certificado e depois o sistema (no fundo, aumentou o trabalho, mas nao impediu de fato)? Eh isso ou eu nao entendi alguma coisa?

Tah ficando interessante esse topico! :wink:

louds

“mtakeda”:
Esse negocio de selar parece interessante. Sabe me explicar como funciona? Por exemplo, como a VM sabe que eu alterei o Jar?
Se quiser que eu procure no google eh soh falar! (mas me diz por qual termo tenho que procurar: “selar jar” mesmo?) :oops:

Quanto ao certificado, nao acaba dando no mesmo? Deixa eu ver se entendi: voce criptografa a aplicacao e o certificado decriptografa na hora de rodar (ou algum esquema assim). Mas, aih nao acaba dando no mesmo, soh que agora o cara precisa quebrar o certificado e depois o sistema (no fundo, aumentou o trabalho, mas nao impediu de fato)? Eh isso ou eu nao entendi alguma coisa?

Tah ficando interessante esse topico! :wink:

Sobre certificados acho a documentação do JDK mais indicada que o google, olhe pela documentalção das ferramentas jar e keytool.

Quanto a “quebrar o certificado”, digamos assim, que a dificuldade vai ser a mesma que de violar a segurança de transações financeiras de muito $$$.

Provavelmente um forma melhor que usar certificados digitais seria distribuir sua aplicação somente com um obfuscador e usar estenografia para colocar “marcas d´agua digitais nos arquivos do cliente”. Não sei do valor legal desse método mas é interessante.

Acho que a única verdade que voce pode tirar desse tópico é que com java não é nem mais dificil nem mais facil combater pirataria. Visto que a única maneira de realmente controlar é tendo suporte do hardware e sistema operacional.

Criado 17 de setembro de 2004
Ultima resposta 21 de set. de 2004
Respostas 17
Participantes 8