Proteger o código .NET da engenharia reversa?

491

A ofuscação é uma maneira, mas não pode proteger contra a quebra da segurança de proteção contra pirataria do aplicativo. Como garantir que o aplicativo não seja violado e como garantir que o mecanismo de registro não possa sofrer engenharia reversa?

Também é possível converter um aplicativo C # em código nativo e Xenocode é muito caro.

O C # fornece muitos recursos e é a linguagem ideal para o meu código, portanto, escrever toda a base de código novamente em C ++ está fora de questão.

Os certificados seguros podem ser facilmente removidos dos assemblies assinados no .NET.

Peter Mortensen
fonte
@ Andréas: Isso é incrível! Vou tentar. Alguém está usando?
Jack
1
@ Jack é apenas para aplicativos de vitrine. Não há cronograma para aplicativos de desktop (até onde eu sei).
Tyler Longo
Se você quiser nativo sem C ++ arcaico, use Delphi. A facilidade do .Net veio do Delphi de qualquer maneira.
William Egge

Respostas:

671

Você não pode.

Existem etapas que você pode seguir para torná-lo um pouco mais difícil, mas no final qualquer executável na máquina local é decifrável. Eventualmente, esse código deve ser convertido em código de máquina nativo e todos os aplicativos executáveis ​​ficam vulneráveis.

O que você quer fazer é dificultar o suficiente o crack para não valer o problema das pessoas.

Algumas sugestões que tenho para você ajudar a proteger seu aplicativo:

  • Ofusque seu código. Dotfuscator tem uma edição gratuita e vem com o Visual Studio.
  • Use chave pública / privada ou criptografia assimétrica para gerar suas licenças de produto. Isso garante que apenas você possa gerar seus códigos de licença. Mesmo se o seu aplicativo estiver com falhas, você pode ter certeza de que eles não estarão liberando um gerador de chaves para o seu aplicativo, porque é impossível reverter o algoritmo de geração de chaves.
  • Use um empacotador de terceiros para compactar seu executável .NET em um aplicativo de invólucro Win32 criptografado. Themida é um dos melhores. Isso impede que as pessoas reflitam seu aplicativo no .NET Reflector e torna difícil descompactar para reverter.
  • Escreva seu próprio empacotador personalizado . Se os empacotadores de terceiros forem muito caros, considere escrever seus próprios. Às vezes, os empacotadores personalizados podem ser muito eficazes, porque não existem métodos bem publicados sobre como descompactá-los. O tutorial Como escrever seu próprio empacotador fornece muitas informações sobre como escrever seu próprio empacotador Win32.

Em última análise, se as pessoas querem que seu aplicativo seja quebrado, elas o farão. Observe todos os softwares comerciais existentes que possuem uma grande quantidade de recursos para proteger seus aplicativos e, no entanto, eles são quebrados antes mesmo que os aplicativos sejam lançados ao público.

Um engenheiro reverso qualificado pode iniciar o IDA-Pro e cortar sua aplicação como manteiga, não importa o que você faça. Um aplicativo compactado pode ser descompactado e a ofuscação apenas o impede de fazer uma caminhada no parque. Todo o seu trabalho duro com seu código de licença complexo pode ser desfeito com um patch de byte único.

Você só precisa aceitar que há uma chance muito real de as pessoas piratearem seu software. Existem pessoas que nunca estão pagarão pelo seu aplicativo, não importa com o que e essas são as pessoas com as quais você não precisa se preocupar.

No entanto, existem muitas empresas por aí que nunca arriscariam uma ação judicial e comprariam alegremente licenças de software e muitos usuários de computador que não querem arriscar, acham errado ou não têm experiência em tecnologia o suficiente para piratear. Esses são seus verdadeiros clientes, e você deve concentrar seus esforços em proporcionar a eles uma boa experiência do usuário e ignorar as pessoas que estão invadindo seu software.

Eu já tive meu aplicativo pirateado antes e o tomei como uma afronta pessoal. Aqui estava eu, um pequeno desenvolvedor, despejando meu coração e alma em um aplicativo e essas pessoas tiveram a ousadia de me piratar ?! Eles estavam tirando dinheiro diretamente do meu bolso!

Eu imediatamente adicionei um monte de código DRM draconiano e tentei sabotar qualquer pessoa usando uma cópia ilegítima ou quebrada. É claro que eu deveria estar trabalhando para melhorar meu aplicativo em vez de tentar parar o inevitável. Não apenas isso, mas eu estava machucando meus verdadeiros clientes com todas essas proteções extras que eu estava colocando.

Depois de uma longa batalha, percebi que estava lutando contra as marés e todo esse tempo perdido foi em vão. Peguei todo o código da casa telefônica, exceto as funções de licença de barebones, e nunca olhei para trás.

Simucal
fonte
67
Então +1 que é quase +2. Desejo que mais pessoas finalmente entendam que você simplesmente não pode proteger seu software contra um invasor determinado.
Bombe
102
Você alcançou o nirvana de proteção de software: não se trata de adicionar mais proteção, se concentrar no produto e torná-lo tão bom que as pessoas QUEREM pagar por ele. E para aqueles que o piratearam, eles nunca pagariam de qualquer maneira, então é como se nunca existissem.
Arthur Chaparyan /
6
@ Arthur Chaparyan, eu concordo. Demorou muito tempo para chegar aqui, mas finalmente vi a luz. Eu segui o caminho de proteções mais restritivas e lutando contra os biscoitos. Aprendi tudo o que pude sobre engenharia reversa na tentativa de impedir a minha. Eu finalmente descobri a ideologia direita
mmcdole
50
Inferno, eu ficaria honrado em descobrir que alguém pensava que meu software valia a pena piratear ...
Erik Forbes
10
Quando você começa a confiar nas vendas do seu software para grande parte de sua renda, isso muda as coisas. Parece que alguém está roubando de você. Eu entendo o que você está dizendo. Fiquei chocado quando descobri rachaduras no meu software em sites de torrent.
21009 mmcdole
265

Você não pode proteger totalmente nenhum aplicativo (gerenciado ou não). Se sistemas como o Playstation e o iPad podem quebrar - onde o fornecedor até controla o hardware - que esperança seu aplicativo tem? Felizmente, você realmente não quer. Na minha opinião, você precisa proteger seu aplicativo apenas o suficiente para que alguém não possa piratear acidentalmente seu produto, e não mais.

Por exemplo, se você usar uma licença por máquina, ela não funcionará apenas quando você a instalar em uma nova segunda máquina. Você deseja uma boa mensagem de erro para impedir chamadas de suporte extras, mas não gaste mais tempo dificultando o trabalho de contornar e não atinja os usuários.

Outro exemplo é um estudo com tempo limitado. Nem se preocupe com coisas simples, como se os usuários pudessem reverter o relógio do sistema. Alguém que faz isso sabe que está violando sua licença e desde que um usuário saiba quando está violando, você já fez o suficiente.

Você precisa fazer isso muito porque os usuários não se importam com sua licença. Licenças são coisas inventadas que ninguém importa até que precisem. Ninguém os lê, e eles realmente não deveriam. Portanto, a melhor maneira de informar ao usuário onde estão os limites é se o comportamento pronto para uso do seu aplicativo estiver em conformidade com a licença. Nesse primeiro caso, isso significa deixar de instalar ou instalar no modo de versão de teste pela segunda vez. Para o último, pode significar apenas verificar uma data em texto sem formatação em um arquivo de configuração. De qualquer maneira, certifique-se de lidar com isso de uma maneira elegante, útil e respeitosa.

Então, isso explica o que significa fazer exatamente isso. Mas por que não ir mais longe? Por que não conectar todos os pequenos orifícios que encontrar? A resposta está em duas partes. Primeiro, se alguém cruzar o limiar ético de quebrar conscientemente os termos da sua licença - mesmo que de maneira simples -, também estará disposto a fazer algo mais difícil ou perigoso, como retirar seu aplicativo de um torrentsite - e há uma certa quantidade de perigo envolvido na execução de aplicativos baixados de fontes não confiáveis. Tornar as coisas mais difíceis é apenas um pequeno aborrecimento para esses usuários e corre o risco de causar problemas aos seus clientes pagantes. Mantê-lo simples pode impedir que alguém penetre no seu aplicativo e libere um crack mais abrangente. Segundo, você tem poucos olhos disponíveis para procurar falhas; os hackers têm muitos e têm mais prática em encontrá-los. Você só precisa perder uma pequena falha, e seu aplicativo terá a mesma distribuição em sites piratas como se você não tivesse feito nada. Você tem que estar certo toda vez; eles só têm que ter sorte uma vez. Portanto, o esforço necessário é muito alto e a probabilidade de qualquer medida de sucesso é muito baixa.

Por fim, se alguém quiser piratear seu aplicativo (em vez de apenas usá-lo), e esse é o objetivo principal, eles o farão. Não há nada que você possa fazer para detê-los. Essa é a natureza do software; uma vez que os arquivos que compõem o seu produto está no computador de um usuário que vai ser capaz de fazer com eles como quiserem. Isso é especialmente relevante em ambientes gerenciados como Java ou .NET , mas definitivamente se aplica também ao código nativo. O tempo está do lado deles e, com tempo suficiente, qualquer segurança digital pode ser violada.

Como você não pode impedir os usuários de piratear seu produto, o melhor caminho a seguir é envolver essa classe de usuários de uma maneira que os use em seu benefício. Muitas vezes, é possível fazê-los trabalhar para você e não contra você. Com isso em mente, não importa qual seja seu aplicativo, provavelmente vale a pena manter uma versão gratuita que é quase completamente funcional e não expira. A diferença entre até um preço de US $ 1 e gratuito é enorme, se por outro motivo, o cliente não precisar confiar em você com seu cartão de crédito. Uma edição gratuita do seu produto não apenas matará efetivamente a distribuição pirateada (por que arriscar uma versão pirateada quando você pode ser legítima pelo mesmo preço?), Mas também tem o potencial de expandir drasticamente seu público.

O resultado é que você pode precisar aumentar o preço da edição paga, para que, no final, em vez de 2.000 usuários por US $ 20 cada, você tenha 100.000 usuários gratuitos, dos quais 500 estão dispostos a pagar US $ 99 pela edição "profissional" . Isso gera mais dinheiro do que se você gastasse muito tempo bloqueando seu produto. Mais do que isso, você pode envolver esses usuários gratuitos e alavancar o relacionamento de várias maneiras importantes.

Um é o apoio. Um pessimista aproveitaria a oportunidade para reclamar do aumento do custo de suporte a 100.000 usuários gratuitos, mas algo surpreendente acontece: seu produto se torna amplamente autossustentável. Você vê isso o tempo todo com grandes projetos de código aberto que não têm dinheiro para custos de suporte. Os usuários irão acelerar e fazer isso acontecer.

Os usuários gratuitos geralmente reduzem as expectativas de suporte, e por boas razões. Tudo o que você precisa fazer é marcar a edição gratuita como qualificada apenas para suporte da comunidade e criar um fórum on-line moderado pelo usuário para esse fim. Sua base de conhecimento de suporte é autogerada, e usuários avançados orientarão aqueles que precisam de assistência extra em seu nome. Ainda mais importante, isso permitirá identificar e corrigir erros mais rapidamente, melhorando a qualidade do seu produto e reduzindo os custos totais de suporte. Isso não era possível antes porque sua base de usuários não era grande o suficiente, mas quando você trata os usuários gratuitos como clientes, pode funcionar muito bem.

Outro é o feedback. Ao assistir ao seu fórum, você aprende idéias importantes de aprimoramento que talvez nunca tenha considerado de outra forma. Isso pode permitir que você transforme mais usuários gratuitos em usuários pagos e crie um produto mais atraente que atraia um público ainda maior.

Finalmente, você precisa considerar o marketing. Todos esses usuários gratuitos agora são fãs e não adversários, e eles agirão de acordo. Não apenas isso, mas quando chegar a hora de lançar sua próxima versão, todos esses usuários passarão pelo seu canal de distribuição aprovado, em vez de algum outro mecanismo desconhecido. Isso significa que, para a sua próxima versão, você começará conectado a um público maior, altamente interessado e solidário.

Os melhores recursos a serem reservados para a edição profissional são ferramentas destinadas a facilitar a implantação e o gerenciamento corporativos. Um cracker não vê isso como uma razão convincente o suficiente para invadir o site para uso próprio, mas para uma empresa que deseja comprar 300 licenças e distribuí-lo para toda a empresa, este é um item obrigatório. É claro que a edição profissional será pirateada de qualquer maneira, mas novamente: não se preocupe, porque você provavelmente não seria capaz de vender o produto para esses piratas, não importa o que você fez, por isso não está lhe custando nenhuma receita.

Embora psicologicamente possa ser difícil doar tanto seu produto, espero que você possa entender como ele realmente é o melhor caminho a percorrer. Não é só isso, é o único caminho a longo prazo. Eu sei que alguém está lá fora, pensando que não quer fazer dessa maneira. Afinal, eles conseguiram vender seu produto bloqueado de US $ 20 por anos. Mas isso é muito ruim, porque se você não fizer dessa maneira, eventualmente alguém o fará . E o produto deles será tão bom quanto o seu, ou perto o suficiente para que eles se safem da alegação disso. De repente, seus preços parecem ultrajantes, as vendas caem drasticamente e não há mais nada que você possa fazer. Você pode optar por uma camada intermediária adicional, se for necessário, mas é improvável que o ajude.

Joel Coehoorn
fonte
1
@ Learning: cresceu meio tempo e passou a conversão automática para o limite CW.
Joel Coehoorn
1
+1 Melhor que a resposta que dei à versão anterior desta pergunta. @ Joel Não sabia que havia um limite.
23470 pipTheGeek
1
Eu não concordo completamente com tudo aqui, e é um +1 fácil de qualquer maneira para a apresentação e o argumento extremamente bem pensados.
23909 Beska
2
Bom argumento, mas perde um ponto sobre a proteção da propriedade intelectual. Se o seu aplicativo tiver algum código que faça algo complexo, a ofuscação pode fornecer a diferença entre copiar e colar códigos simples e tentar interpretar e reprojetar o código para que funcione. Isso é particularmente importante nas atualizações: se alguém copiou seu código ofuscado, quando você libera uma atualização, elas precisam fazer isso novamente - e, no mínimo, isso causa mais sofrimento / despesa / tempo. Se você não o tiver protegido de alguma forma, eles simplesmente copiarão / colarão novamente e funcionará.
gregmac
4
Ótimo post - ele realmente mostra todos os detalhes certos sobre os motivos pelos quais não vale a pena se preocupar em escrever uma complexa proteção contra cópias. Embora a pergunta seja duplicada, vale a pena reabri-la apenas para esta resposta. Talvez um mod possa mesclá-lo?
EMP
45

Na minha experiência, dificultar a quebra de seu aplicativo ou biblioteca prejudica seus clientes honestos, atrasando apenas ligeiramente os desonestos. Concentre-se em criar um excelente produto de baixa fricção, em vez de se esforçar muito para atrasar o inevitável.

Kent Boogaart
fonte
38

Um segredo que você compartilha com muitas pessoas não é um segredo. Se você tem coisas secretas no seu código, ofuscar isso não é proteção; só precisa ser desobstruído uma vez . Se você tem um segredo que não deseja compartilhar com seus clientes, não o compartilhe com seus clientes . Escreva seu código como um serviço da Web e mantenha seu código super secreto em seu próprio servidor, onde somente você poderá vê-lo.

Eric Lippert
fonte
1
Btw estou fazendo um projeto em que eu quero ativar um produto "offline" também (eu fiz um serviço WCF para ativar on-line). Nesse caso, como você manipulará o código? você pode me dar alguns hits?
Piyush
1
Idéia interessante, mas que curso de ação você recomendaria para alguém que desenvolve um aplicativo que deve ser executado sem uma conexão de dados, como um jogo WP7?
Charlie Skilbeck
23

De um modo geral, existem três grupos de pessoas por aí.

  • Aqueles que não compram seu software e recorrem a rachaduras ou, se não encontrarem, não usam o software. Não espere ganhar dinheiro com este grupo. Eles dependem de suas próprias habilidades ou de crackers (que tendem a priorizar seu tempo, dependendo da sua utilidade e do tamanho da sua audiência. Quanto mais útil, mais cedo uma crack estará disponível).

  • O grupo de usuários legítimos que comprarão (pagarão) pelo seu software, independentemente do mecanismo de proteção usado. Não dificulte a vida de seus usuários legítimos, usando um mecanismo de proteção elaborado, pois eles pagarão por isso de qualquer forma. Um mecanismo de proteção complexo pode facilmente estragar a experiência do usuário e você não quer que isso aconteça com esse grupo. Pessoalmente, eu votaria contra qualquer solução de hardware, o que aumenta o custo do seu software.

  • Uma minoria que recorrerá a rachaduras "antiéticas" e pagará apenas pelo seu software porque seus recursos são protegidos por um mecanismo de licenciamento. Você provavelmente não quer facilitar demais esse grupo para contornar sua proteção. No entanto, todo esse esforço que você gasta em proteger seu software será recompensado, dependendo do tamanho desse grupo de pessoas. Isso depende inteiramente do tipo de software que você está construindo.

Dado o que você disse, se você acha que existe uma minoria grande o suficiente para comprar seu software, vá em frente e implemente alguma forma de proteção. Pense em quanto dinheiro você pode ganhar com essa minoria em comparação com o tempo gasto trabalhando na proteção ou o valor gasto em uma API / ferramenta de proteção de terceiros.

Se você gosta de implementar uma solução própria, usar a criptografia de chave pública é uma boa maneira (em oposição aos algoritmos simétricos) para impedir hacks fáceis. Você pode, por exemplo, assinar digitalmente sua licença (número de série ou arquivo de licença). A única maneira de contornar isso seria descompilar, alterar e recompilar o código (o que pode dificultar o uso de técnicas como as sugeridas na resposta de Simucal).

místico
fonte
O uso de criptografia robusta para proteger / verificar suas licenças é completamente inútil se alguém extrair o código que interrompe o aplicativo se a licença não sair. :)
Bombe
Concordo, mas como eu estava dizendo, a proteção não é para os grupos de usuários que irão recorrer ao uso de rachaduras (uma suposição que eu fiz existirá).
Mystic
criptografia de chave pública = criptografia assimétrica. Eu acho que você quis dizer simétrico.
mmcdole 03/02/09
1
Para ser justo, o terceiro ponto é tendencioso, pois pressupõe que uma porção de pessoas é sempre uma minoria. Tenho certeza de que, sob certas estruturas, é uma clara maioria. Tenho em mente jogos online com recursos multijogador maciços porque a) a maioria dos usuários são crianças com padrões éticos muito baixos b) o custo pode ser significativo para esses usuários se for uma taxa mensal que se arrasta por meses etc.
j riv
19

Você não pode impedir as pessoas de invadir seu software.

No entanto, você pode fazê-los criar rachaduras que prejudicarão menos suas vendas. Os geradores de chaves que podem emitir um código de registro válido para o seu software são muito piores que os patches simples que removem os incentivos de registro do seu software. Isso ocorre porque um crack funcionará apenas para uma versão do software e deixará de funcionar com a próxima atualização de software lançada. O gerador de chaves continuará funcionando até que você altere seu algoritmo de chave de registro, e isso é algo que você não deseja fazer com frequência, porque adiará seus clientes honestos.

Portanto, se você estiver procurando um método para combater geradores de chaves ilegais para o seu software e não quiser usar criptografia assimétrica devido aos longos códigos de registro gerados, consulte a Verificação Parcial de Chaves.

A Verificação parcial de chave garante que cada gerador de chave ilegal funcione apenas para uma versão específica do seu software. Basicamente, o que você faz é garantir que cada versão do seu software esteja vinculada apenas ao código para verificar ALGUNS dígitos do código de registro. Quais dígitos são exatamente aleatórios, portanto, os crackers teriam que fazer engenharia reversa de muitas versões diferentes do seu software e combinar tudo isso em um gerador de chaves, a fim de liberar um gerador de chaves que funcione para todas as versões do seu software.

Se você lança novas versões de software regularmente, isso leva a numerosos geradores de chaves espalhados por todos os tipos de arquivos de pirataria de software que não estão mais funcionando. Os piratas em potencial de software geralmente procuram um crack ou keygen para a versão mais recente, portanto provavelmente tentarão alguns deles e desistirão eventualmente.

Eu usei a Verificação de chave parcial nos meus jogos shareware (C ++) mais recentes e foi muito eficaz. Antes tínhamos muitos problemas com geradores de chaves que não podíamos combater. Depois disso, houve muitas falhas e alguns geradores de chaves que funcionavam apenas para essa versão específica do jogo, mas nenhum gerador de chaves que funcionasse com todas as versões. Lançamos regularmente pequenas atualizações do jogo e tornamos inúteis todas as falhas anteriormente existentes.

Parece haver uma estrutura .NET de código aberto para verificação parcial de chave , embora eu ainda não tenha tentado.

Adrian Grigore
fonte
1
como a idéia, você também pode usar senhas diferentes para criptografia assimétrica em diferentes versões.
Priyank Bolia 03/02/09
Idéia interessante, mas qual é exatamente o problema de um longo código de registro? Hoje em dia, ninguém entra nele manualmente - todo mundo copia e cola, por isso, se são 10 ou 100 caracteres, não deve fazer diferença.
EMP
4
@ Evgeny: Isso só é verdade se seus usuários são usuários avançados. Nós criamos jogos shareware / casuais há muitos anos e posso dizer que a maioria dos nossos usuários não pode copiar e colar. A janela de registro ainda vem com um manual sobre como copiar e colar, e alguns nem o fazem depois de ler.
Adrian Grigore
Uau! OK, bem, obviamente você tem mais experiência do que eu nisso, então não posso argumentar, só posso dizer que estou surpreso. Mas eu diria que, se eles não souberem copiar e colar, você deverá aumentar o comprimento do código para 200 caracteres, para que eles aprendam uma habilidade geral útil em informática. :)
EMP
1
@Evgeny: Mesmo com os códigos de registro curtos, ainda recebemos muitos e-mails de pessoas que digitaram incorretamente seus códigos e, portanto, pensaram que o código não pode ser válido porque nunca cometeriam um erro como esse várias vezes em um linha. Eu prefiro deixar o ensino de TI para outras empresas ... :-)
Adrian Grigore
16
  • Use a atualização online para bloquear as cópias não licenciadas.

  • Verifique o número de série de diferentes módulos do seu aplicativo e não use uma única chamada de função para fazer a verificação (para que os crackers não possam ignorar a verificação facilmente).

  • Não apenas verifique o número de série na inicialização, faça a verificação ao salvar os dados, faça-o toda sexta-feira à noite, faça-o quando o usuário estiver ocioso ...

  • Verifique a soma de verificação do arquivo do aplicativo, armazene sua soma de verificação de segurança em locais diferentes.

  • Não exagere nesse tipo de truque, verifique se o seu aplicativo nunca falha / entra em mau funcionamento ao verificar o código de registro.

  • Criar um aplicativo útil para os usuários é muito mais importante do que criar um
    binário inquebrável para crackers.

rIPPER
fonte
14

Você pode..

Serviços Microsoft SLP O potencial de software da InishTech oferece a capacidade de ajudar a proteger o código sem afetar a funcionalidade dos seus aplicativos.

ATUALIZAÇÃO: (Divulgação: Trabalho no Eazfuscator.NET) O que torna o potencial do software Microsoft SLP Services diferente é a capacidade de virtualizar o código, para que você possa definitivamente . Vários anos se passaram desde que a pergunta foi feita originalmente; hoje existem mais produtos disponíveis que também funcionam de maneira semelhante, como:

ogggre
fonte
2
precificando meu amigo, comprar um software de licenciamento da Microsoft é muito caro para ISV normais
Priyank Bolia
Eu tentei, funciona muito bem, mas apenas criptografa o código dentro de um método, não todo o conjunto ou projeto, para que um cracker possa alterar facilmente o fluxo do programa com injeção de IL
Mohsen Afshin
@ogggre Ao adicionar links de fornecedores, você realmente precisa divulgar suas conexões na postagem. Também a versão atualmente disponível de SLPS (que eu trabalho em: D) faz genéricos de apoio. Naturalmente todas as soluções têm seus prós e contras individuais que só um eval pode corretamente contextualizar para as pessoas
Ruben Bartelink
@MohsenAfshin Não entendo o que você está dizendo - o ponto é que você precisa proteger qualquer método em que a adição / remoção / alteração de IL represente uma violação de licenciamento. Como as coisas de virtualização não podem ser gratuitas, simplesmente não faz sentido "proteger magicamente tudo", como você está sugerindo. Voltando ao ponto principal: o objetivo da Proteção do SP é impedir alterações de IL nos métodos que você seleciona, com base na sua sensibilidade (além de outros em geral como ruído para evitar o plantio, você precisa quebrar esse bit aqui -> assinar )
Ruben Bartelink 19/10/14
1
@RubenBartelink Concordo com você. Infelizmente, esta discussão é muito grande com várias páginas de conteúdo. No começo, eu queria adicionar uma nova resposta, mas o StackOverflow sugeriu que é melhor estender a existente. Então eu fiz. Espero que meu pequeno pedaço de informação seja útil. Obrigado por uma atualização do suporte genérico no SLPS e suas correções.
ogggre
10

O .NET Reflector pode abrir apenas "código gerenciado", que basicamente significa "código .NET". Então você não pode usá-lo para desmontar arquivos COM DLL, C ++ nativo, Visual Basic 6.0 clássico código etc. A estrutura do código .NET compilado o torna muito conveniente, portátil, detectável, verificável etc. O .NET Reflector tira proveito isso permite que você espreite os assemblies compilados, mas os descompiladores e desmontadores não são de forma alguma específicos do .NET e existem desde que os compiladores existem.

Você pode usar ofuscadores para tornar o código mais difícil de ler, mas não pode impedir exatamente que seja descompilado sem também torná-lo ilegível para o .NET. Existem alguns produtos por aí (geralmente caros) que afirmam "vincular" seu aplicativo de código gerenciado a um aplicativo de código nativo, mas, mesmo que funcionem, uma pessoa determinada sempre encontrará uma maneira.

No entanto, quando se trata de ofuscação, você obtém o que paga. Portanto, se seu código é tão proprietário que você deve se esforçar tanto para protegê-lo, você deve investir dinheiro em um bom ofuscador.

No entanto, nos meus 15 anos de experiência na escrita de código, percebi que a proteção excessiva do seu código-fonte é uma perda de tempo e tem pouco benefício. Apenas tentar ler o código fonte original sem documentação de suporte, comentários, etc., pode ser muito difícil de entender. Acrescente a isso os nomes de variáveis ​​sem sentido criados pelos decompiladores e o código de espaguete que os ofuscadores modernos criam - você provavelmente não precisa se preocupar muito com pessoas roubando sua propriedade intelectual.

Josh Einstein
fonte
9

Isso realmente vale a pena? Todo mecanismo de proteção pode ser quebrado com determinação suficiente. Considere seu mercado, preço do produto, quantidade de clientes etc.

Se você quer algo mais confiável, siga o caminho das chaves de hardware, mas isso é bastante problemático (para o usuário) e mais caro. As soluções de software provavelmente seriam um desperdício de tempo e recursos, e a única coisa que elas forneceriam a você é o falso senso de "segurança".

Mais algumas idéias (nenhuma é perfeita, pois não há uma perfeita).

  • AntiDuplicate
  • Mude o idioma, use os bons truques que os autores do Skype usaram
  • Servidor de licença

E não perca muito tempo com isso, porque os crackers têm muita experiência com as técnicas típicas e estão alguns passos à sua frente. A menos que você queira usar muitos recursos, provavelmente mude a linguagem de programação (faça da maneira do Skype).

Jeff Atwood
fonte
Não esqueça que é bem possível atacar a parte do software da trava de hardware.
217 Magnus Hoff
Sim, é verdade, a única opção real seria ter o aplicativo parcialmente implementado em hardware (uma mistura estranha de aplicativo VHDL por software), por exemplo. Isso também seria embora atacada ...
Anônimo
E os dongles que implementam uma estratégia de chave pública / privada. Somente a chave privada do dongle pode descriptografar o aplicativo e executá-lo.
mmcdole
É o que a chave de hardware geralmente faz. Mas você pode atacar o dongle - cloná-lo ou o software responsável por conversar com o dongle (contornar, desativar, etc).
anônimo
1
No meu caso, realmente valeu a pena. Depois de implementar a Verificação parcial de chave e alterar o esquema de chave de registro para um produto existente, as vendas aumentaram de maneira significativa. Todo o software pode ser quebrado, a questão é até que ponto você eleva a fasquia para o pirata de software casual.
239 Adrian Grigore
9

Se você deseja que as pessoas possam executar seu código (e se não, então por que você o escreveu em primeiro lugar?), Então a CPU deles precisa poder executar seu código. Para poder executar o código, a CPU precisa entender .

Como as CPUs são burras e os humanos não, isso significa que os humanos também podem entender o código.

Há apenas uma maneira de garantir que seus usuários não obtenham seu código: não forneça seu código.

Isto pode ser alcançado de duas maneiras: Software como um serviço (SaaS), ou seja, você executar o seu software em seu servidor e só permitir que seus usuários acessá-lo remotamente. Este é o modelo que o Stack Overflow usa, por exemplo. Tenho certeza de que o Stack Overflow não ofusca o código deles, mas você não pode descompilá-lo.

A outra maneira é o modelo de dispositivo: em vez de fornecer aos usuários o seu código, você fornece a eles um computador contendo o código. Este é o modelo usado pelos consoles de jogos, a maioria dos telefones celulares e o TiVo . Observe que isso só funciona se você "possui" todo o caminho de execução: você precisa construir sua própria CPU, seu próprio computador, escrever seu próprio sistema operacional e sua própria implementação da CLI . Então, e somente então, você pode proteger seu código. (Mas observe que mesmo o menor erro inutilizará todas as suas proteções. Microsoft, Apple, Sony, indústria fonográfica e indústria cinematográfica podem atestar isso.)

Ou você pode simplesmente não fazer nada, o que significa que seu código será automaticamente protegido pela lei de direitos autorais.

Jörg W Mittag
fonte
8

Infelizmente, você não vai fugir disso. Sua melhor aposta é escrever seu código em C e P / Invocá- lo.

Existe um pequeno problema, alguém pode simplesmente descompilar seu aplicativo no CIL e eliminar qualquer código de verificação / ativação (por exemplo, a chamada para sua biblioteca C). Lembre-se de que os aplicativos escritos em C também são submetidos a engenharia reversa pelos hackers mais persistentes (basta ver a rapidez com que os jogos são quebrados atualmente). Nada protegerá seu aplicativo.

No final, funciona muito como a sua casa, proteja-a o suficiente para que seja muito esforço (o código do espaguete ajudaria aqui) e para que o agressor se mova para o seu vizinho (competição :)). Olhe para o Windows Vista, deve haver 10 maneiras diferentes de quebrá-lo.

Existem pacotes por aí que criptografam o arquivo EXE e o descriptografam quando o usuário tem permissão para usá-lo, mas mais uma vez, isso está usando uma solução genérica que sem dúvida foi quebrada.

Os mecanismos de ativação e registro são direcionados para o 'Joe médio': pessoas que não possuem conhecimento técnico suficiente para contorná-lo (ou, nesse caso, sabem que podem ignorá-lo). Não se preocupe com biscoitos, eles têm muito tempo em suas mãos.

Jonathan C Dickinson
fonte
1
Se você realmente se preocupa em terceirizar seu código de registro em uma dll, verifique se a DLL precisa ser diferente a cada nova versão do seu software. Caso contrário, você ficará ainda mais fácil para as pessoas decifrarem seu software. Tudo o que eles precisam fazer é quebrar sua DLL uma vez e usá-la em todas as versões posteriores. Até usuários finais podem fazer isso quando encontrarem uma DLL antiga e quebrada, e isso é ainda pior do que colocar o mecanismo de registro no seu código gerenciado.
Adrian Grigore
8

Além de adquirir proteção, você (ou seus desenvolvedores) pode aprender a proteger contra cópias.

Estas são as idéias:

Primeiro, tente escrever um programa que se escreve no console. Esse é um problema famoso. O objetivo principal desta tarefa é praticar a escrita de código de auto-referência.

Segundo, você precisa desenvolver uma tecnologia que reescreva algum código de maneira confiável no CIL de outros métodos .

Você pode escrever uma máquina virtual (ainda no .NET ). E coloque algum código lá. Por fim, a máquina virtual executa outra máquina virtual que executa o código. Isso é parte de funções raramente chamadas para não diminuir muito o desempenho.

Reescreva alguma lógica no C ++ / CLI e misture o código gerenciado com o não gerenciado. Isso vai endurecer a desmontagem. Nesse caso, não esqueça de fornecer binários x64 também.

modosansreves
fonte
Não entendi, você pode explicar em detalhes.
Priyank Bolia 04/02/09
7

Sim. É verdade. O código .NET é extremamente fácil de fazer engenharia reversa se o código não for ofuscado.

A ofuscação adicionará uma camada de aborrecimento às pessoas que tentam fazer engenharia reversa do seu software. Dependendo da versão obtida, você obterá diferentes níveis de proteção.

O Visual Studio inclui uma versão do Dotfuscator . Como é uma versão em pacote, você definitivamente não está obtendo a ofuscação mais forte possível. Se você olhar para as listas de recursos, verá exatamente o que está faltando (e exatamente o que o aplicativo fará para tornar seu código mais seguro).

Existem alguns outros ocultadores .NET gratuitos ou de código aberto por aí (mas não posso comentar sobre a qualidade ou os vários métodos que eles usam):

No final, nada é perfeito. Se alguém realmente quiser ver como o seu software funciona, ele o fará.

Justin Niessner
fonte
11
Não é apenas "se eles realmente querem ver como o seu software funciona, eles o farão". Se eles se importam, provavelmente podem adivinhar sem olhar. 99,9% + do software não possui algoritmos mágicos de pó de duende. A parte mais difícil da programação não é uma técnica secreta especial. É só fazer com que todas as peças se alinhem e funcionem.
Ken
9
@Ken - Shhhh! Você não pode deixar o resto do mundo saber que na maioria das vezes não estamos usando algoritmos mágicos de poeira de duende.
Justin Niessner
9
Justin: O amor conta como um algoritmo mágico? O amor é o que torna meus programas especiais. Eu não acho que você pode desmontar o amor.
Ken
Babel.NET não é mais gratuito. Você pode encontrar uma lista dos ofuscadores mais comuns (gratuitos e comerciais) aqui .
InputOutput
6

Bem, você não pode proteger TOTALMENTE seu produto contra rachaduras, mas pode maximizar / aprimorar os níveis de segurança e dificultar um pouco a quebra por novatos e crackers intermediários.

Mas lembre-se de que nada é intransponível, apenas o software no servidor está bem protegido e não pode ser quebrado. De qualquer forma, para aprimorar os níveis de segurança em seu aplicativo, você pode executar algumas etapas simples para impedir que alguns crackers "nem todos" quebrem seus aplicativos. Essas etapas farão com que esses biscoitos fiquem loucos e talvez desesperados:

  • Ofusque seu código-fonte, obviamente isso fará com que seu código-fonte pareça uma bagunça e ilegível.
  • Acione várias rotinas de verificação aleatória dentro do aplicativo, como a cada duas horas, 24 horas, um dia, semana etc. ou talvez após cada ação que o usuário executar.
  • Salve a soma de verificação MD5 do seu aplicativo lançado no servidor e implemente uma rotina que possa verificar a soma de verificação MD5 do arquivo atual com a real do lado do servidor e torná-lo acionado aleatoriamente. Se a soma de verificação MD5 foi alterada, significa que esta cópia foi pirateada. Agora você pode simplesmente bloqueá-lo ou lançar uma atualização para bloqueá-lo etc.
  • Tente criar uma rotina que possa verificar se alguns dos seus códigos (funções, classes ou rotinas específicas) foram realmente modificados, alterados ou até removidos. Eu chamo isso (verificação de integridade do código).
  • Use empacotadores desconhecidos gratuitos para embalar seu aplicativo. Ou, se você tiver dinheiro, opte por soluções comerciais como o Thamida ou o .NET Reactor . Esses aplicativos são atualizados regularmente e, uma vez que um cracker descompacta seu aplicativo, você pode obter uma nova atualização dessas empresas e, depois de obter a nova atualização, apenas compacta seu programa e lança uma nova atualização.
  • Libere atualizações regularmente e force o seu cliente a baixar a atualização mais recente.
  • Por fim, faça sua aplicação muito barata. Não faça isso muito caro. Acredite, você terá mais clientes satisfeitos e os crackers deixarão seu aplicativo, porque não vale a pena gastar um tempo com um aplicativo muito barato.

Esses são apenas métodos simples para impedir que novatos e crackers intermediários quebrem seu aplicativo. Se você tiver mais idéias para proteger seu aplicativo, não tenha vergonha de implementá-las. Isso dificultará a vida dos crackers, e eles ficarão frustrados e, eventualmente, deixarão seu aplicativo, porque não vale o tempo deles.

Por fim, você também precisa considerar gastar seu tempo codificando aplicativos de boa qualidade. Não perca seu tempo codificando camadas de segurança complicadas. Se um bom cracker quiser quebrar seu aplicativo, ele / ela fará o que você fizer ...

Agora vá e implemente alguns brinquedos para os biscoitos ...

Robin Van Persi
fonte
5

Há o Salamander , que é um compilador .NET nativo e vinculador do Remotesoft que pode implantar aplicativos sem a estrutura .NET. Eu não sei o quão bem ele cumpre suas reivindicações.

Matthew Olenik
fonte
A resposta é bastante fácil: é uma pena que a maioria das respostas fale sobre ofuscação. A ofuscação é boa para parar a primeira tentativa (semelhante ao refletor) de procurar no seu código, só isso. Isso não é ruim. E, é claro, não há nada que impeça hackers reais que entendem o código de montagem, além de escrever um aplicativo SAAS (mesmo assim, eles podem tentar invadir seu servidor). Mas há mais, existem ferramentas como Salamander, .NET Reactor e outras mencionadas, que fornecem (talvez) quase a mesma forma de segurança descompilável que um Win32 .exe compilado em C ++. Qual dessas ferramentas é melhor, ainda não posso julgar.
Philm
5

Se a Microsoft conseguir uma solução, não teremos versões piratas do Windows, então nada é muito seguro. Aqui estão algumas perguntas semelhantes do Stack Overflow e você pode implementar sua própria maneira de protegê-las. Se você estiver lançando versões diferentes, poderá adotar técnicas diferentes para versões diferentes. Assim, quando uma primeira falha, o segundo pode assumir o controle.

Shoban
fonte
5

Reator .NET

Atualizar

Jared apontou que o de4dot afirma ser capaz de descompilar.

O .NET Reactor fornece proteção completa para sua propriedade intelectual confidencial convertendo seus assemblies .NET em processos não gerenciados que não podem ser entendidos como CIL e que nenhuma ferramenta existente pode descompilar. Os hackers não têm acesso a nenhuma forma inteligível da sua fonte.

Poderosos e flexíveis, os recursos de licenciamento do .NET Reactor permitem impor suas condições de licença e proteger seu fluxo de receita usando bloqueios de hardware e software. O gerenciador de licenças pode criar licenças de avaliação ou permanentes em questão de segundos. Um kit de desenvolvimento de software (SDK) totalmente documentado, completo com exemplos, permite que você chame o sistema de licenciamento diretamente do seu código, permitindo criar extensões personalizadas para o sistema de licenciamento.

loraderon
fonte
3
Eu tentei entrar em contato com esses caras com alguma dúvida, eu tinha sobre o produto deles, mas eles nunca responderam. Você tentou o produto deles? Eu fui com montagem inteligente e o produto e o suporte são muito bons. Mas, como eu já disse na pergunta, ofuscação é uma maneira, mas não uma prova completa.
Priyank Bolia 03/02/09
1
Tive alguns problemas com o produto deles anteriormente e, em seguida, fiz algumas perguntas sobre ícones de alta resolução em groups.google.se/group/net-reactor-users e recebi uma resposta e uma correção, mas agora parece que é difícil se apossar. Ao mau - é um grande produto e eu ainda estou usando-o
loraderon
2
Se "nenhuma ferramenta existente pode descompilar", por que ela está listada como um ofuscador / empacotador suportado na página de recursos do de4dot ?: bitbucket.org/0xd4d/de4dot
Jared Thirsk
Provavelmente porque é uma declaração antiga e eles não atualizaram sua página da web. Não sou mais usuário de nenhuma ferramenta de ofuscação.
Loraderon #
de4dot é uma ferramenta muito poderosa. Eu tentei contra vários ofuscadores e faz um ótimo trabalho. No entanto, não foi possível manipular arquivos protegidos pelo .NET Reactor (v6.0). Talvez o de4dot não esteja atualizado.
InputOutput
4

Aqui está uma idéia: você pode ter um servidor hospedado por sua empresa ao qual todas as instâncias do seu software precisam se conectar. Simplesmente fazer com que eles se conectem e verifiquem uma chave de registro não é suficiente - eles apenas removerão a verificação. Além da verificação da chave, você também precisa que o servidor execute uma tarefa vital que o cliente não pode executar por si próprio, por isso é impossível removê-lo. É claro que isso provavelmente significaria muito processamento pesado por parte do servidor, mas dificultaria o roubo do software e, assumindo que você tenha um bom esquema de chaves (verifique a propriedade etc.), as chaves também serão difíceis de serem roubadas. roubar. Isso provavelmente é mais invasivo do que você deseja, pois exigirá que seus usuários estejam conectados à Internet para usar seu software.

rmeador
fonte
5
e se o servidor estiver inoperante ou os usuários nem sempre tiverem acesso à Internet, seu método simplesmente frustrará os clientes, com tantas ida e volta frequentes aos servidores da Internet apenas para usar um aplicativo.
Priyank Bolia 17/03/09
Eu concordo completamente. Foi por isso que eu disse "isso é provavelmente mais invasivo do que você deseja ..." na minha última linha. Eu estava apenas oferecendo o OP a melhor solução que eu achava que era tecnicamente viável, não é a melhor abordagem para manter os clientes felizes :)
rmeador
No primeiro trimestre de 2010 (vários meses depois que essa resposta foi escrita), a empresa de desenvolvimento de jogos Ubisoft tentou isso, e aparentemente a carga nos componentes do servidor era tão grande que os jogos não eram jogáveis. Impressão geral do SW: "dificuldade para instalar, não pode ser usada offline, invasiva e não confiável ". Portanto, se você decidir que o processamento no servidor é o caminho a seguir, verifique se realmente pode ser dimensionado conforme a demanda.
Piskvor saiu do prédio em
3

Qualquer coisa em execução no cliente pode ser descompilada e quebrada. A ofuscação apenas torna mais difícil. Não conheço sua inscrição, mas 99% das vezes não acho que valha a pena.

Kendrick
fonte
3

É impossível proteger totalmente um aplicativo, desculpe.

Fredou
fonte
3

Ofuscar o código! Há um exemplo em Ofuscando código C # .

ligaoren
fonte
2

Lembre-se de que mais de 99% dos usuários não terão interesse em examinar seu executável para ver como ele funciona.

Dado que poucas pessoas se incomodam em tentar e que a maioria dos ofuscadores pode ser contornada, vale a pena o seu tempo e esforço?

É melhor investir tempo na melhoria do seu produto para que mais pessoas o desejem.

ChrisF
fonte
2

Apenas para adicionar um aviso: se você vai usar ofuscação, verifique se tudo ainda funciona! A ofuscação pode mudar coisas como nomes de classes e métodos. Portanto, se você usar a reflexão para chamar certos métodos e / ou classes (como em uma arquitetura de plug-in), seu aplicativo poderá falhar após ofuscar. Também os rastreamentos de pilha podem ser inúteis para rastrear erros.

Hans Keing
fonte
2

Se for escrito em .NET e compilado no CIL , poderá ser refletido. Se a segurança é uma preocupação e a ofuscação deve ser evitada, recomendo que você escreva seu aplicativo usando uma linguagem não gerenciada, que é, por natureza, mais difícil de fazer engenharia reversa.

Peter Mortensen
fonte
2

Como garantir que o aplicativo não seja violado e como garantir que o mecanismo de registro não possa sofrer engenharia reversa.

Ambos têm a mesma resposta muito simples: não forneça código de objeto a terceiros não confiáveis, como (aparentemente) seus clientes. A viabilidade de hospedar o aplicativo em suas máquinas depende apenas do que ele faz.

Se não for um aplicativo da web , talvez você possa permitir o login SSH com o encaminhamento do X para um servidor de aplicativos (ou Conexão de Área de Trabalho Remota , eu acho, para Windows).

Se você der código de objeto a pessoas do tipo nerd e elas acharem que seu programa pode ser divertido de quebrar, ele será quebrado. De jeito nenhum.

Se você não acredita em mim, aponte um aplicativo de alto perfil que não tenha sido quebrado e pirateado.

Se você usar as chaves de hardware, a produção ficará mais cara e seus usuários o odiarão por isso. É uma verdadeira besteira rastejar no chão conectando e desconectando suas 27 coisinhas USB diferentes, porque os fabricantes de software não confiam em você (imagino).

Existem pacotes por aí que criptografam seu EXE e descriptografam quando o usuário tem permissão para usá-lo

Obviamente, a maneira de contornar isso é decifrar o teste "can-I-use-it" para que ele sempre retorne verdadeiro.

Um truque desagradável pode ser usar os valores de bytes dos opcodes que executam o teste em algum outro lugar do programa de maneira suja, que fará com que o programa trave com alta probabilidade, a menos que o valor esteja correto. Faz com que você esteja vinculado a uma arquitetura específica :-(

Jonas Kölker
fonte
Não é fácil depurar um ponto de falha e substituir o código no .NET para ignorar essa verificação. Além disso, como você alterará os códigos de código no .NET, você pode elaborar isso?
Priyank Bolia 03/02/09
Oh. Eu tinha truques em mente; digamos, pegue o endereço da função de validação, adicione os 10 primeiros bytes nesse array de caracteres (faça o ponteiro da função); escolha qualquer função f e armazene [o endereço de f menos a soma anterior] em fptr. Sempre chame f como * (fptr + essa soma). Precompute "essa soma"
Jonas Kölker
2

Basta fazer uma boa aplicação e codificar um sistema de proteção simples. Não importa qual proteção você escolher, ela será revertida ... Portanto, não perca muito tempo / dinheiro.

knoopx
fonte
2

Quando se trata de .NET, se você estiver lançando um Windows Forms aplicativo (ou qualquer aplicativo em que o cliente tenha o arquivo Executável Portátil), ele poderá ser quebrado.

Se você deseja manter o .NET e minimizar a chance de obter seu código-fonte, considere implantá-lo como um aplicativo ASP.NET em um servidor Web, em vez de torná-lo um aplicativo Windows Forms.

Peter Mortensen
fonte
2

Francamente, às vezes precisamos ofuscar o código (por exemplo, registrar classes de licença e assim por diante). Nesse caso, seu projeto não é gratuito. OMI, você deve pagar por um bom obfucator.

O Dotfuscator oculta seu código e o .NET Reflector mostra um erro quando você tenta descompilá-lo.

Peter Mortensen
fonte