Ferramentas / estratégia de ofuscação do .NET

Meu produto tem vários componentes: ASP.NET, Windows Forms App e Windows Service. 95% ou mais do código está escrito em VB.NET.

Por razões de Propriedade Intelectual, eu preciso ofuscar o código, e até agora eu tenho usado uma versão do dotfuscator que agora tem mais de 5 anos. Estou pensando que é hora de mudar para uma ferramenta de nova geração. O que estou procurando é uma lista de requisitos que devo considerar ao procurar por um novo ofuscador.

O que eu sei que devo procurar até agora:

  • Serialização / desserialização . Na minha solução atual, eu simplesmente digo à ferramenta para não ofuscar quaisquer membros de dados de class porque a dor de não conseguir carregar dados que foram serializados anteriormente é simplesmente muito grande.
  • Integração com o processo de construção
  • Trabalhando com o ASP.NET . No passado, eu encontrei esta problemática devido à mudança de nomes .dll (você geralmente tem um por página) – o que nem todas as ferramentas manipulam bem.

Voltar com .net 1.1 ofuscação era essencial: descompilar código era fácil, e você poderia ir de assembly, para IL, para código C # e tê-lo compilado novamente com muito pouco esforço.

Agora com o .net 3.5 eu não tenho certeza. Tente descompilar uma assembly 3.5; o que você obtém é um longo caminho desde a compilation.

Adicione as otimizações de 3.5 (muito melhor que 1.1) e a forma como tipos anônimos, delegates e assim por diante são manipulados pela reflection (eles são um pesadelo para recompilar). Adicione expressões lambda, o compilador ‘magic’ como o Linq-syntax e o var , e o C # 2 funciona como o yield (que resulta em novas classs com nomes ilegíveis). Seu código descompilado termina um longo caminho de compilável.

Uma equipe profissional com muito tempo ainda pode fazer engenharia reversa de volta, mas o mesmo vale para qualquer código ofuscado. O código que eles tiraram disso seria insustentável e altamente provável que fosse muito buggy.

Eu recomendaria a assinatura de chave de seus assemblies (ou seja, se os hackers podem recompilar um que eles têm que recompilar todos), mas eu não acho que a ofuscação vale a pena.

Nós tentamos um número de obfuscators. Nenhum deles trabalha em um aplicativo cliente / servidor grande que usa o recurso remoto. O problema é que o cliente e o servidor compartilham algumas dlls e não encontramos nenhum ofuscador que possa lidar com isso.

Nós experimentamos o DotFuscator Pro, o SmartAssembly, o XenoCode, o Salamander e vários aplicativos de pequeno porte cujos nomes me escapam.

Francamente, estou convencido de que a ofuscação é um grande truque.

Mesmo os problemas que aborda não são inteiramente um problema real. A única coisa que você realmente precisa proteger são strings de conexão, códigos de ativação, coisas sensíveis à segurança como essa. Essa bobagem de que outra empresa vai fazer engenharia reversa de toda a sua base de código e criar um produto concorrente é algo que vem do pesadelo de um gerente paranóico, não da realidade.

Eu sou ‘Knee Deep’ neste momento, tentando encontrar uma boa solução. Aqui estão minhas impressões até agora.

Xenocode – Eu tenho uma licença antiga para o Xenocode2005 que eu costumava usar para ofuscar meus assemblies .net 2.0. Funcionou bem no XP e foi uma solução decente. Meu projeto atual é .net 3.5 e eu estou no Vista, o suporte me disse para dar uma chance, mas a versão 2005 nem funciona no Vista (travamentos), então eu e agora eu tenho que comprar ‘PostBuild2008’ a um preço de gobsmacking de US $ 1900. Esta pode ser uma boa ferramenta, mas não vou descobrir. Muito caro.

Reactor.Net – Este é um preço muito mais atraente e funcionou bem no meu Standalone Executável. O módulo de licenciamento também foi bom e teria me poupado um monte de esforço. Infelizmente, está faltando um recurso importante e essa é a capacidade de excluir coisas da ofuscação. Isso torna impossível alcançar o resultado que eu precisava (mesclar vários conjuntos juntos, ofuscar alguns, não ofuscar os outros).

SmartAssembly – Eu baixei o Eval para isso e funcionou perfeitamente. Consegui alcançar tudo o que queria e a interface era de primeira class. O ponto de preço ainda é um pouco pesado.

Dotfuscator Pro – Não foi possível encontrar o preço no site. Atualmente em discussões para obter uma cotação. Soa sinistro.

Confuser – um projeto de código aberto que funciona muito bem (para confundir ppl, assim como o nome indica). https://confuser.codeplex.com/
(adicionado por jgauffin)

Nota: O ConfuserEx é declarado “quebrado” de acordo com o Problema nº 498 em seu repository do GitHub.

Se você está procurando por um livre você pode tentar DotObfuscator Community Edition que vem com o Visual Studio ou Eazfuscator.NET .


Desde 29 de junho de 2012 , o Eazfuscator.NET agora é comercial. A última versão gratuita disponível é a 3.3.

Eu tenho usado o smartassembly. Basicamente, você escolhe uma dll e ela fica ofuscada. Parece funcionar bem e não tive problemas até agora. Muito, muito fácil de usar.

Eu tentei quase todos os obfuscators no mercado e o SmartAssembly é o melhor na minha opinião.

Eu também tenho usado o SmartAssembly. Eu descobri que o Ezrinz .Net Reactor é muito melhor para mim em aplicativos .net. Ele ofusca, suporta Mono, mescla montagens e também possui um módulo de licenciamento muito interessante para criar uma versão de teste ou vincular a licença a uma máquina específica (muito fácil de implementar). O preço também é muito competitivo e quando eu precisava de apoio, eles eram rápidos. Eziriz

Só para ficar claro, sou apenas um cliente que gosta do produto e não está de forma alguma relacionado com a empresa.

A resposta curta é que você não pode.

Existem várias ferramentas que dificultam a leitura do código por alguém – algumas das quais foram apontadas por outras respostas.

No entanto, tudo isso faz com que seja mais difícil de ler – eles aumentam a quantidade de esforço necessário, isso é tudo. Muitas vezes, isso é suficiente para impedir leitores casuais, mas alguém que esteja determinado a pesquisar seu código sempre poderá fazê-lo.

Temos um aplicativo multicamadas com uma interface asp.net e winform que também suporta o uso remoto. Eu não tive problemas com o uso de qualquer ofuscador com a exceção do tipo de criptografia que gera um carregador que pode ser problemático em todos os tipos de formas inesperadas e simplesmente não vale a pena na minha opinião. Na verdade, meu conselho seria mais ao longo das linhas de “Evite criptografia obfuscators tipo de carregador, como a peste”. 🙂

Na minha experiência, qualquer obfuscator funcionará bem com qualquer aspecto de .net, incluindo asp.net e remoting, você só precisa se tornar íntimo das configurações e saber até onde você pode empurrá-lo em quais áreas do seu código. E aproveite para tentar fazer engenharia reversa sobre o que você obtém e veja como funciona com as várias configurações.

Usamos vários ao longo dos anos em nossos aplicativos comerciais e resolvemos o obfuscator Spices da 9rays.net porque o preço é justo, ele faz o trabalho e eles têm um bom suporte, embora não precisemos mais do suporte em anos, mas para sermos honestos Eu não acho que realmente importa qual obfuscator você usa, os problemas e a curva de aprendizado são todos iguais se você quiser que ele funcione corretamente com remoting e asp.net.

Como outros já mencionaram, tudo o que você está fazendo é o equivalente a um cadeado, mantendo pessoas honestas de fora e ou dificultando a simples recompilation de um aplicativo.

Licenciamento é geralmente a área-chave para a maioria das pessoas e você deve definitivamente estar usando algum tipo de sistema de certificado digitalmente assinado para licenciamento de qualquer maneira. Sua maior perda virá do compartilhamento casual de licenças, se você não tiver um sistema inteligente em funcionamento, as pessoas que quebrarem o sistema de licenciamento nunca comprarão, em primeiro lugar.

É muito fácil levar isso longe demais e ter um impacto negativo em seus clientes e em seus negócios, fazer o que é simples e razoável e não se preocupar com isso.

Nos últimos dois dias, experimentei Dotfuscator Community Edition advanced (um download gratuito após registrar o CE básico que vem junto com o Visual Studio).

Eu acho que a razão pela qual mais pessoas não usam ofuscação como uma opção padrão é que é um sério problema comparado ao risco. Em projetos de teste menores, consegui executar o código ofuscado com muito esforço. Implantar um projeto simples via ClickOnce era problemático, mas possível depois de assinar manualmente os manifestos com o mage. O único problema era que, no erro, o rastreamento de pilha era ofuscado e o CE não tinha um des ou um desinfetante.

Eu tentei ofuscar um projeto real que é baseado no VSTO no Excel, com integração Virtual Earth, muitas chamadas de webservice e um contêiner IOC e muita reflection. Era impossível.

Se a obfuscação for realmente um requisito crítico, você deve projetar seu aplicativo com isso em mente desde o início, testando as construções ofuscadas à medida que avança. Caso contrário, se é um projeto bastante complexo, você vai acabar com uma grande quantidade de dor.

O Crypto Obfuscator trata de todas as suas preocupações e cenários. Isto :

  1. Exclui automaticamente os tipos / membros do ofuscamento com base em regras. Tipos / campos serializados são um deles.
  2. Pode ser integrado no processo de compilation usando o MSBUild.
  3. Suporta projetos ASP.Net.

Eu recentemente tentei canalizar a saída de um obfuscator livre para outro ofuscador livre – o Dotfuscator CE e o novo obfuscator da Babel no CodePlex. Mais detalhes no meu blog .

Quanto à serialização, movi esse código para uma DLL diferente e incluí isso no projeto. Eu raciocinei que não havia nenhum segredo lá que não estivesse no XML, então não precisava de ofuscação. Se houver algum código sério nessas classs, o uso de classs parciais na assembly principal deve cobri-lo.

Você deve usar o que for mais barato e mais conhecido por sua plataforma e chamá-la por dia. A ofuscação de linguagens de alto nível é um problema difícil, porque os streams opcode VM não sofrem dos dois maiores problemas que os streams nativos de opcode fazem: identificação de function / método e alias de registro.

O que você deve saber sobre a reversão do bytecode é que já é prática padrão para os testadores de segurança revisar o código X86 direto e encontrar vulnerabilidades nele. No X86 bruto, você não pode necessariamente encontrar funções válidas, quanto mais rastrear uma variável local através de uma chamada de function. Em quase nenhuma circunstância, os reversores de código nativo têm access a nomes de function e variável – a menos que estejam revisando o código da Microsoft, para o qual a MSFT fornece essa informação ao público.

“Dotfuscation” funciona principalmente pela codificação de nomes de funções e variables. Provavelmente, é melhor fazer isso do que publicar código com informações de nível de debugging, em que o Reflector está literalmente desistindo do seu código-fonte. Mas qualquer coisa que você faça além disso provavelmente terá retornos decrescentes.

Eu não tive problemas com o Smartassembly.

Você poderia usar “Dotfuscator Community Edition” – vem por padrão no Visual Studio 2008 Professional. Você pode ler sobre isso em:

http://msdn.microsoft.com/pt-br/library/ms227240%28VS.80%29.aspx
http://www.preemptive.com/dotfuscator.html

A versão “profissional” do produto custa dinheiro, mas é melhor.

Você realmente precisa do seu código ofuscado? Geralmente, há muito pouco erro em seu aplicativo ser descompilado, a menos que seja usado para fins de segurança. Se você está preocupado com as pessoas que “roubam” seu código, não fique; a grande maioria das pessoas que vêem seu código será para fins de aprendizado. De qualquer forma, não existe uma estratégia de ofuscação totalmente eficaz para o .NET – alguém com habilidade suficiente sempre poderá descompilar / alterar sua aplicação.

Evite o reator. É completamente inútil (e sim eu paguei por uma licença). O Xenocode foi o melhor que eu encontrei e comprei uma licença também. O suporte foi muito bom, mas eu não precisei muito, já que funcionou. Eu testei cada obfuscator que eu poderia encontrar e minha conclusão é que o xenocode foi de longe o mais robusto e fez o melhor trabalho (também possibilidade de pós processar seu .NET exe para um exe nativo que eu não vi em nenhum outro lugar).

Existem duas diferenças principais entre reator e xenocódigo. O primeiro é que o Xenocode realmente funciona. A segunda é que a velocidade de execução de suas montagens não é diferente. Com o reator foi cerca de 6 milhões de vezes mais lento. Eu também tenho a impressão de que o reator era uma operação de um homem.

Eu achei o Agile.Net fornecer uma proteção muito boa para o seu .Net Assembly, pois oferece não apenas ofuscação, mas também criptografia. Baixe uma trilha grátis.
http://secureteam.net/NET-Code-Protection.aspx http://secureteam.net/downloads.aspx

Eu tenho ofuscado código no mesmo aplicativo desde .net 1, e tem sido uma grande dor de cabeça de uma perspectiva de manutenção. Como você mencionou, o problema de serialização pode ser evitado, mas é realmente fácil cometer um erro e ofuscar algo que você não queria ofuscado. É fácil quebrar a compilation ou alterar o padrão de ofuscação e não conseguir abrir arquivos antigos. Além disso, pode ser difícil descobrir o que deu errado e onde.

Nossa escolha foi o Xenocode, e se eu fosse fazer a escolha novamente hoje eu preferiria não ofuscar o código, ou usar Dotfuscator.

Aqui está um documento da Microsoft. Espero que ajude …, é de 2003, mas ainda pode ser relevante.

Estamos usando o SmartAssembly no nosso cliente Windows. Funciona muito bem.

Adiciona alguns problemas extras também. Imprimir seus nomes de class em arquivos de log / exceções deve ser desofuscado. E claro, não é possível criar uma turma pelo nome. Portanto, é uma boa ideia dar uma olhada no seu cliente e ver quais problemas você pode obter ofuscando.

Tudo depende da linguagem de programação que você usa. Leia o artigo: código ofuscado

o caminho livre seria usar dotfuscator de dentro do visual studio, caso contrário você teria que sair e comprar um obfuscator como Postbuild ( http://www.xenocode.com/Landing/Obfuscation.aspx )

Eu tive que usar um obfuscation / proteção de resources em meu último rpoject e achei Crypto Obfuscator como uma ferramenta agradável e simples de usar. O problema de serialização é apenas uma questão de configurações nesta ferramenta.

Há uma boa versão de código aberto chamada Obfuscar. Parece funcionar bem. Tipos, propriedades, campos, methods podem ser excluídos. O original está aqui: https://code.google.com/p/obfuscar/ , mas como parece não ser mais atualizado, alguém o botou aqui: https://obfuscar.codeplex.com/

Você também pode querer olhar para novas tecnologias de proteção de código, como Metaforic e ViLabs e novas tecnologias de proteção contra cópia de software, como ByteShield . Divulgação: Eu trabalho para o ByteShield.

Eu também uso o smartassembly. No entanto, não sei como funciona para um aplicativo da web. No entanto, gostaria de salientar que, se o seu aplicativo usa proteção de tipo shareware, verifique se ele não verifica uma licença com um retorno booleano. é muito fácil de quebrar. http://blogs.compdj.com/post/Binary-hack-a-NET-executable.aspx

O SmartAssembly é ótimo, eu fui usado na maioria dos meus projetos

Eu tentei versão demo Eziriz …. eu gostei. Mas nunca trouxe o software.

Ofuscação não é uma proteção real.

Se você tiver um arquivo .NET Exe, existe uma solução melhor .

Eu uso Themida e posso dizer que funciona muito bem.

A única desvantagem de Themida é que ele não pode proteger o .NET Dlls. (Ele também protege o código C ++ no Exe e DLLs)

Themida é de longe mais barata do que os obfuscators aqui mencionados e é o melhor em proteção anti- pirataria no mercado. Ele cria uma máquina virtual onde partes críticas de seu código são executadas e executa vários threads que detectam manipulação ou pontos de interrupção definidos por um cracker. Ele converte o .NET Exe em algo que o Reflector nem reconhece mais como um assembly .NET.

Por favor, leia a descrição detalhada em seu site: http://www.oreans.com/themida_features.php

Eu tentei um produto chamado Rummage e ele faz um bom trabalho em dar-lhe algum controle … Embora lhe faltem muitas coisas que Eziriz oferece, mas o preço para Rummage é muito bom …