sexta-feira, 26 de maio de 2017

Ferramentas de proteção contra pirataria no .NET

Por André Lima em 24/05/2017.

Uma coisa que deixa muitas empresas com uma baita dor de cabeça é a quantidade de pessoas que tentam piratear as suas soluções. Quanto maior e mais conhecida for a aplicação, maior será a capacidade de atrair potenciais hackers que farão de tudo para quebrar a sua proteção contra pirataria. Empresas grandes investem muito dinheiro para tornar as suas aplicações (e jogos) mais difíceis de serem pirateados.
Todo esse investimento faz muito sentido para empresas que produzem aplicações comerciais para as “massas“. É claro que a Microsoft tem que investir contra a pirataria do Windows e do Office, e é claro que a Adobe não vai querer que alguém utilize o Photoshop sem pagar. Afinal, essas empresas investiram pesado para desenvolver as suas aplicações, então, faz sentido que elas invistam uma quantidade de dinheiro considerável na sua proteção contra pirataria.
Porém, se você chegou nesse artigo, você provavelmente não é uma Microsoft ou Adobe. Possivelmente você é desenvolvedor em uma pequena ou média empresa (ou até mesmo um desenvolvedor autônomo) e está querendo proteger a sua aplicação contra pirataria. Apesar de eu ser da opinião de que você só deve investir dinheiro nisso caso a sua aplicação seja minimamente “famosa“, essa é uma pergunta que eu recebo com uma certa frequência: como proteger os nossos aplicativos desenvolvidos com o .NET contra pirataria?
Depois desse tema ter sido um dos ganhadores da minha pesquisa de temas no semestre passado, eu resolvi testar algumas ferramentas de proteção contra pirataria. Todas as ferramentas apresentadas neste artigo são pagas, porém todas elas têm algum tipo de versão “trial” que você utilizar para testar com o seu aplicativo. Quer ver quais são essas ferramentas e quais são as diferenças entre elas? Então, vamos lá.

IntelliLock

Esse é um dos softwares de proteção contra pirataria mais conhecidos no mercado. De acordo com a página da empresa desenvolvedora, o IntelliLock é utilizado por uma variedade de empresas renomadas, como Xerox, LG, Siemens e até mesmo a Microsoft. O que eu achei mais legal no IntelliLock é que não é necessário implementar nenhuma linha de código para ativarmos um sistema de licenciamento nas nossas aplicações (a não ser que você queira fazer um controle de licenciamento por funcionalidades, e não um bloqueio geral da aplicação).
Ao abrirmos o IntelliLock, logo na primeira tela nós temos uma opção onde podemos selecionar os assemblies da nossa aplicação:
Em seguida, na próxima etapa do assistente, nós podemos selecionar quais serão as restrições que serão aplicadas no nosso sistema. Nessa etapa nós conseguimos definir diversos tipos de restrição para aplicações “trial” (como tempo de expiração, data de expiração, quantidade de execuções, tempo de execução, etc). Caso nós não queiramos disponibilizar a nossa aplicação em período de testes, basta escolhermos a opção “Custom“. Dessa forma, a aplicação só funcionará caso o usuário tiver uma licença válida:
Ao adicionarmos uma camada de proteção contra pirataria na nossa aplicação .NET, é importante que nós obfusquemos o seu código. Caso contrário, algum usuário mal intencionado poderia simplesmente descompilar a aplicação e remover o código de proteção. Uns tempos atrás eu escrevi um artigo mostrando como podemos obfuscar as nossas aplicações .NET. O IntelliLock, porém, possui um sistema de obfuscação embutido na própria ferramenta:
Uma vez aplicada a proteção contra pirataria pelo IntelliLock, nós teremos um novo assembly com as proteções ativadas (que será gerado no subdiretório “_Locked“). Para destravar o aplicativo, o usuário deverá ter um arquivo de licença válido no mesmo diretório da aplicação. Esse arquivo de licença é gerado diretamente no projeto do IntelliLock:
Note que temos a opção de gerarmos licenças que são atreladas ao hardware do usuário. Sempre é recomendado que você utilize essa opção, caso contrário, qualquer usuário que tenha o arquivo de licença poderá instalar a aplicação em quantos computadores ela quiser.
Outra opção bastante interessante é a possibilidade de forçarmos a validação da licença através de um servidor. Eu não testei essa opção, mas pareceu ser bem tranquila de ser implementada (o SDK possui o código completo do site ASP.NET que implementa o servidor de ativação).
O IntelliLock possui um SDK e projetos de exemplo em diversas plataformas. A sua utilização é muito simples. Por exemplo, caso você precise exibir uma tela com o “Hardware ID” do usuário (para gerar uma licença que só seja válida para o computador dele), o código ficaria assim:
1
2
3
4
5
6
7
8
// C#
var travarCPU = true;
var travarHD = true;
var travarMacAddress = true;
var travarPlacaMae = true;
var travarBios = true;
var travarSO = true;
var hardwareID = IntelliLock.Licensing.HardwareID.GetHardwareID(travarCPU, travarHD, travarMacAddress, travarPlacaMae, travarBios, travarSO);
1
2
3
4
5
6
7
8
' VB.NET
Dim TravarCPU = True
Dim TravarHD = True
Dim TravarMacAddress = True
Dim TravarPlacaMae = True
Dim TravarBios = True
Dim TravarSO = True
Dim HardwareID = IntelliLock.Licensing.HardwareID.GetHardwareID(TravarCPU, TravarHD, TravarMacAddress, TravarPlacaMae, TravarBios, TravarSO)
Caso você queira trabalhar com funcionalidades customizadas no arquivo de licenças (para liberar algumas funcionalidades somente para alguns usuários específicos), você pode checar as informações customizadas da licença da seguinte maneira:
1
2
3
4
5
6
7
8
9
// C#
if ((IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseStatus == IntelliLock.Licensing.LicenseStatus.EvaluationMode) || (IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseStatus == IntelliLock.Licensing.LicenseStatus.Licensed))
{
    for (int i = 0; i < IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseInformation.Count; i++)
    {
        var chaveCustomizada = IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseInformation.GetKey(i).ToString();
        var valorCustomizado = IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseInformation.GetByIndex(i).ToString();
    }
}
1
2
3
4
5
6
7
' VB.NET
If (IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseStatus = IntelliLock.Licensing.LicenseStatus.EvaluationMode) OrElse (IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseStatus = IntelliLock.Licensing.LicenseStatus.Licensed) Then
    For I As Integer = 0 To IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseInformation.Count - 1
        Dim ChaveCustomizada = IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseInformation.GetKey(I).ToString()
        Dim ValorCustomizado = IntelliLock.Licensing.EvaluationMonitor.CurrentLicense.LicenseInformation.GetByIndex(I).ToString()
    Next
End If
Custo: $179
Versão de avaliação: sim, sem restrições, mas adiciona uma mensagem no início da aplicação

Softactivate

A estratégia do Softactivate é um pouco diferente da estratégia do IntelliLock. Com o aplicativo do Softactivate, nós precisamos gerar um template de licença com as opções de bloqueio:
As opções de bloqueio do Softactivate são mais limitadas do que as do IntelliLock, principalmente no que diz respeito às versões de avaliação. Entretanto, nós conseguimos também utilizar valores customizados na licença (para ativar funcionalidades específicas para um grupo de usuários) e servidores de ativação (que eu não testei).
Uma vez gerado o template, nós podemos criar a quantidade de seriais que julgarmos necessário:
Por fim, da mesma forma que podemos fazer com o IntelliLock, nós conseguimos opcionalmente atrelar a licença a um hardware específico. Tendo em mãos o número da licença e o ID do hardware, nós conseguimos gerar o código de ativação para a licença:
O Softactivate conta com diversos projetos demonstrando a sua utilização em C#, VB.NET, C e C++. Eu dei uma olhada neles e, sinceramente, achei bastante complicado de entender. Eles disponibilizam algumas janelas que podemos utilizar para fazer a ativação da licença, mas, aparentemente fica um tanto quanto complicado caso queiramos implementar a nossa própria janela de ativação. Mas, pelo menos os códigos estão compilando e os exemplos funcionando.
Custo: $49 – $399
Versão de avaliação: sim, sem restrições, mas a chave pública é sempre a mesma (ou seja, qualquer um pode desbloquear a aplicação)

XHEO DeployLX

Vou falar para você que eu fiquei impressionado depois de testar o XHEO DeployLX. Tudo bem, o preço é salgado (é a ferramenta mais cara que vou apresentar nesse artigo), mas a facilidade de utilização é incrível.
Uma vez aberta a ferramenta, nós conseguimos selecionar a opção “Protect Project“. Aí é só seguir o assistente, que fará todas as alterações no nosso projeto para que ele seja protegido:
Com a licença criada, nós podemos ajustá-la conforme a nossa necessidade. Podemos criar períodos de trial, extensões de trial, bloqueio por hardware, etc. Além disso, nós conseguimos adicionar também informações customizadas na licença, tornando possível a ativação de funcionalidades específicas somente para alguns usuários ou clientes.
Sério, você precisa assistir ao vídeo disponibilizado na página do produto, onde o apresentador adiciona proteção em um aplicativo desktop em menos de 5 minutos. Eu salvei o vídeo e estou disponibilizando aqui, caso a XHEO venha a tirá-lo do ar no futuro:
Custo: $699 – $1299
Versão de avaliação: sim, 45 dias

Ellipter

Essa foi a opção com o pior custo / benefício de todas as que eu encontrei. Esse software tem apenas a funcionalidade de gerar chaves as privadas e públicas e seus respectivos seriais para ativação. A única opção de customização “out of the box” que recebemos dessa ferramenta é a possibilidade de configurarmos uma data de expiração para o serial.
Com o Ellipter, nós utilizamos a sua aplicação desktop para gerarmos as chaves de criptografia e os seriais:
Tendo essas informações em mãos, nós adicionamos a referência para a biblioteca do Ellipter no nosso projeto e verificamos se um determinado serial é válido ou não, com base na chave pública:
1
2
3
4
5
6
7
8
9
10
11
12
13
// C#
var manager = new SeriousBit.Ellipter.SerialsManager("NomeDesenvolvedor", "ChaveAtivacaoEllipter", SeriousBit.Ellipter.KeyStrength.Use128Bits);
manager.PublicKey = "WQ5UMNN7RZRVB5UKAR2RVSFZDCJ6BTWSPNBNNRQD9GME7TUKHR6ZE";
 
if (manager.IsValid("QT5GQ3-87NB4A-VV9FMF-EUXK2D-L87A1Q-QQA"))
    MessageBox.Show("QT5GQ3-87NB4A-VV9FMF-EUXK2D-L87A1Q-QQA é válido");
else
    MessageBox.Show("QT5GQ3-87NB4A-VV9FMF-EUXK2D-L87A1Q-QQA é inválido");
 
if (manager.IsValid("XPTO"))
    MessageBox.Show("XPTO é válido");
else
    MessageBox.Show("XPTO é inválido");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' VB.NET
Dim Manager = New SeriousBit.Ellipter.SerialsManager("NomeDesenvolvedor", "ChaveAtivacaoEllipter", SeriousBit.Ellipter.KeyStrength.Use128Bits)
Manager.PublicKey = "WQ5UMNN7RZRVB5UKAR2RVSFZDCJ6BTWSPNBNNRQD9GME7TUKHR6ZE"
 
If Manager.IsValid("QT5GQ3-87NB4A-VV9FMF-EUXK2D-L87A1Q-QQA") Then
    MessageBox.Show("QT5GQ3-87NB4A-VV9FMF-EUXK2D-L87A1Q-QQA é válido")
Else
    MessageBox.Show("QT5GQ3-87NB4A-VV9FMF-EUXK2D-L87A1Q-QQA é inválido")
End If
 
If Manager.IsValid("XPTO") Then
    MessageBox.Show("XPTO é válido")
Else
    MessageBox.Show("XPTO é inválido")
End If
No próprio site do Ellipter eles disponibilizam alguns códigos de exemplo em C#, porém a funcionalidade não vai muito além do que eu mostrei no código de exemplo acima. A única outra coisa que podemos checar com os seriais gerados pelo Ellipter é uma string com “informação do produto“. Nessa string nós poderíamos, por exemplo, armazenar alguma informação que indicaria quais funcionalidades seriam liberadas para o usuário que tivesse aquele serial.
E é isso. Sem servidor de ativação, sem bloqueio por hardware (pelo menos não de forma intuitiva), e tudo isso por, no mínimo, $499. Não sei você, mas eu achei bastante caro, principalmente se compararmos com os valores das outras ferramentas apresentadas.
Custo: $499 – $2499
Versão de avaliação: sim, sem restrições, mas só funciona no computador de desenvolvimento

LimeLM

Vou te falar que eu achei essa ferramenta muito interessante. Todo o gerenciamento das licenças funciona completamente online. Você cria o seu produto e seus respectivos seriais (que podem ser enviados por e-mail). Aí você distribui junto com a aplicação o arquivo de licença (que identifica o aplicativo que está sendo distribuído) e um “assistente de ativação“, que é assustadoramente parecido com a ativação do Windows, Office, etc:
Uma vez que o usuário tiver ativado a aplicação, as informações são gravadas em disco, porém, via código nós podemos implementar um mecanismo que fará uma re-checagem da licença a cada X dias, para ver se o serial não foi revogado.
Quando trabalhamos com proteção contra pirataria atrelada ao hardware do usuário, é muito comum que alguns clientes instalem a aplicação em máquinas virtuais. Dessa forma, uma vez ativada a aplicação na máquina virtual, o cliente pode replicar essa máquina virtual N vezes e terá acesso à nossa aplicação em todas as cópias que tiverem sido criadas. O LimeLM tem até um esquema (opcional) que detecta se o usuário está utilizando o sistema em máquinas virtuais e bloqueia a ativação nesse cenário:
O código para verificarmos se a aplicação está ativada ou não é muito simples. No próprio site do LimeLM temos à nossa disposição um tutorial bem completo em C#, mas se quisermos fazer uma simples checagem se a aplicação já foi ativada, este seria o código:
1
2
3
4
5
6
// C#
var ta = new wyDay.TurboActivate.TurboActivate("GUID_DA_APLICACAO");
if (ta.IsGenuine(90, 14) == wyDay.TurboActivate.IsGenuineResult.Genuine && ta.IsActivated())
{
    // Aplicação ativada...
}
1
2
3
4
5
' VB.NET
Dim Ta = New wyDay.TurboActivate.TurboActivate("GUID_DA_APLICACAO")
If Ta.IsGenuine(90, 14) = wyDay.TurboActivate.IsGenuineResult.Genuine AndAlso Ta.IsActivated() Then
    ' Aplicação ativada...
End If
Como cada serial pode ser revogado a qualquer momento no gerenciador central do LimeLM, é importante implementarmos uma re-checagem da ativação de tempos em tempos. No código apresentado acima, através do método “IsGenuine” nós implementamos re-checagem da ativação a cada 90 dias, com um período de carência de 14 dias (para os casos em que o acesso à Internet não estiver disponível para fazer a re-checagem). A ativação funciona também sem acesso à Internet, através de um arquivo de ativação.
Custo: gratuito – $349 por mês
Versão de avaliação: sim, limitado a um produto, 10 usuários ativados e 200 usuários em período trial

Qual é a melhor opção?

Apresentadas as 5 principais opções comerciais de proteção contra pirataria no .NET, a pergunta que fica é: qual dessas 5 ferramentas seria a melhor opção para proteger a minha aplicação? A resposta é, como sempre, “depende“.
Caso a sua aplicação seja pequena e com poucas ativações, a versão gratuita do LimeLM é um excelente começo. Com ela, você conseguirá gerenciar o licenciamento de somente um produto, podendo ativá-lo em até 10 clientes e/ou 200 versões trials do produto.
Caso a sua aplicação cresça um pouco, na minha opinião, ainda sim valeria o investimento de $11 por mês da assinatura mais básica do LimeLM, que permite o gerenciamento de um produto, com 300 ativações e 6000 trials. Com o LimeLM todo o gerenciamento das ativações é feito de maneira centralizada e você pode facilmente revogar seriais de qualquer usuário a qualquer momento (muito útil quando algum cliente resolve atrasar o pagamento).
Se o gerenciamento centralizado não é importante para você e se você conseguir investir pelo menos um pouco de dinheiro, talvez, eu recomendaria a edição básica do Softactivate, que sai atualmente por $49. Essa é a ferramenta mais em conta que você conseguirá encontrar no mercado e já possui boas opções para protegermos as nossas aplicações.
Porém, se você conseguir guardar um pouquinho mais de dinheiro, eu recomendaria fortemente a aquisição do IntelliLock. Como eu mencionei no artigo, a quantidade de opções disponibilizadas pelo IntelliLock é impressionante. Pagando uma vez os $179 da ferramenta você teria acesso a uma infinidade de opções para proteger a sua aplicação contra pirataria, inclusive servidor de ativação (cujo código é distribuído junto com o IntelliLock).
Para grandes empresas com um orçamento mais generoso, o XHEO DeployLX me pareceu uma opção bem interessante. Dá para ter uma boa ideia do que essa ferramenta é capaz assistindo o vídeo apresentado anteriormente neste artigo, onde a proteção contra pirataria é adicionada em um projeto Windows Forms em menos de 5 minutos.
Por fim, a opção que eu particularmente não recomendaria seria o Ellipter. O custo / benefício dessa ferramenta não é nada atrativo. Com os $499 do custo do Ellipter nós conseguiríamos pagar quase um ano e meio de assinatura do LimeLM (que na minha opinião é muito superior ao Ellipter) com suporte a três produtos e 1200 ativações.

Dá para criar o seu próprio sistema de licenciamento?

Uma última pergunta que pode estar surgindo na sua cabeça nesse momento é: será que eu não consigo criar o meu próprio sistema de licenciamento? E a resposta é: sim! Você pode criar o seu próprio sistema de proteção contra pirataria!
Para implementar um esquema de proteção mais simples (como o disponibilizado pelo Ellipter), você só precisa gerar duas chaves (uma privada e uma pública). Aí você gera os seriais utilizando as duas chaves (em um executável à parte, que será o seu “gerador de seriais“) e, na aplicação principal, você checa a validade do serial apresentado pelo usuário através da chave pública.
Eu não vou mostrar isso neste artigo porque ele já está ficando muito longo, mas já coloquei esse tópico na minha lista de temas para abordar no futuro. Se você se interessar por isso, deixa um comentário para me motivar a escrever esse artigo o quanto antes. Enquanto isso não acontece, você pode ir dando uma olhada nesta thread do StackOverflow (opção 1) e na biblioteca Rhino Licensing(opção 2).

Concluindo

A proteção contra pirataria é uma preocupação frequente para os desenvolvedores de aplicações. Afinal, depois de gastar tanto tempo e dinheiro desenvolvendo uma aplicação, ninguém vai querer que ela seja copiada para lá e para cá sem controle nenhum.
Ao invés de ficar gastando o seu precioso tempo desenvolvendo o seu próprio sistema de licenciamento, vale a pena dar uma olhada em ferramentas comerciais que são especializadas nessa área. No artigo de hoje você viu 5 opções de ferramentas de proteção contra pirataria que você pode utilizar na sua aplicação .NET. Por fim, você viu também a minha opinião sobre qual ferramenta utilizar dependendo do cenário da sua aplicação e orçamento disponível.

Nenhum comentário:

Postar um comentário