É importante ofuscar o código do aplicativo C ++?

11

No mundo Java, às vezes parece ser um problema, mas e o C ++? Existem soluções diferentes?

Eu estava pensando no fato de que alguém pode substituir a biblioteca C ++ de um sistema operacional específico por uma versão diferente da mesma biblioteca, mas cheia de símbolos de depuração para entender o que meu código faz. É bom usar bibliotecas padrão ou populares?

Isso também pode acontecer com alguma biblioteca DLL no Windows substituída pela "versão de depuração" dessa biblioteca. É melhor preferir compilação estática? Em aplicativos comerciais, vejo que, no núcleo do aplicativo, eles compilam tudo estaticamente e, na maioria das vezes, as dlls (bibliotecas dinâmicas em geral) são usadas para oferecer algumas tecnologias de terceiros, como soluções antipirataria (eu vejo isso em muitos jogos ), Biblioteca da GUI (como Qt), bibliotecas do SO etc.

A compilação estática é equivalente à ofuscação no mundo Java? Em termos melhores, é a solução melhor e mais acessível para proteger seu código?

user827992
fonte
4
Lembre-se, faça o que fizer, alguém com muito tempo será capaz de deobfuscate / decompile-lo
Zavior
13
Muitos compiladores vêm com um /Ocomutador de ofuscação. Alguns até têm vários níveis de ofuscação, até /O3;)
MSalters
@MSalters Não, g ++ tem -O3;)
BЈовић
@Zavior Ou simplesmente faça engenharia reversa, pura e simplesmente. Nem sequer requer o próprio binário, apenas uma análise completa do software.
John Weisz

Respostas:

27

Não perca seu tempo perdendo batalhas

Como observado em muitas outras respostas semelhantes para C ++ e outras linguagens, isso é principalmente inútil .

Leitura adicional

Leituras selecionadas sobre o tópico (nem todas são específicas de C ++, mas os princípios gerais se aplicam):

Respostas StackExchange

Papéis

Citações famosas sobre ofuscação:

Finalmente, existe a questão da privacidade do código. Esta é uma causa perdida. Não há transformação que impeça um determinado hacker de entender seu programa. Isso se aplica a todos os programas em todos os idiomas; é obviamente mais verdadeiro com o JavaScript, porque é entregue na forma de código-fonte. O benefício de privacidade proporcionado pela ofuscação é uma ilusão. Se você não deseja que as pessoas vejam seus programas, desconecte seu servidor. - Douglas Crockford


Nunca?

Não estou dizendo que você nunca deve ofuscar e que não existem boas razões para isso, mas questiono seriamente a necessidade disso na maioria dos casos e sua relação custo-benefício.

Além disso, há situações em que a ofuscação é um requisito de fato. Por exemplo, se você escreve vírus, obviamente a ofuscação (e uma dinâmica, de preferência) é tão importante para a sobrevivência do seu programa quanto sua capacidade de se replicar. No entanto, isso dificilmente constitui um caso "comum" ...

haylem
fonte
Certa vez, usamos um dongle de hardware em que havia um requisito de licenciamento para obscurecer todas as chamadas de função do dongle - e eles forneceram uma ferramenta para fazer isso. Sempre me deixou um pouco desconfiado com a qualidade de sua 'proteção'!
Martin Beckett
@MartinBeckett: um pouco estranho mesmo.
haylem
3

Não, isso não vale a pena, e acho que é completamente desnecessário. As funções que você chama provavelmente podem ser adivinhadas pela funcionalidade que você fornece.

A razão pela qual os ofuscadores existem para Java é porque o mapeamento entre o código de bytes Java e o código-fonte Java está razoavelmente bem definido, e os nomes de todas as funções e variáveis-membro são armazenados no código de bytes (independentemente de serem públicos, privados ou protegidos). ) para que um interpretador de código de byte Java possa apresentar algum Java genérico que mostre a estrutura da fonte original razoavelmente bem para a fonte não ofuscada.

C ++ compila diretamente na linguagem de máquina. Ele pode ser desmontado, mas a linguagem assembly é bastante entediante. A descompilação é muito mais complicada devido a todas as alterações que os otimizadores fazem no código durante a compilação.

James McLeod
fonte
0

Pensando nisso, existem vários tipos diferentes de ofuscação. Vamos começar com a ofuscação do código fonte, que é uma completa perda de tempo; já é difícil de entender sem isso! Então, vamos nos concentrar na ofuscação do pacote de entrega, de como o código é entregue ao usuário.

Ofuscação menor

Ocultação menor existe para impedir que o usuário casual enfie os dedos e quebre as coisas facilmente. Ele não impede o hacker determinado, mas tem valor em ajudar a garantir que as coisas que você é solicitado a apoiar sejam o que realmente entregou. O nível de proteção necessário para esse tipo de coisa é realmente bastante baixo; o pacote de entrega simplesmente não deve parecer legível e editável (sem ferramentas especializadas) e isso é bom o suficiente.

A minificação de Javascript é um exemplo disso, embora não seja comercializada como tal. Ninguém em sã consciência gostaria de ler e editar um arquivo JS minificado, mesmo que seja tecnicamente possível fazê-lo se você for determinado / persistente o suficiente.

Da mesma forma com o fornecimento de aplicativos Java. Apenas o empacotamento do código em um JAR executável interromperá a maioria das tolices, mesmo tendo toda a força de um sinal educado de "Por favor, mantenha a grama" em um parque da cidade.

Mesmo ao fornecer código C ++, retirar os símbolos desnecessários do executável será suficiente para se qualificar como ofuscação menor. A chave é que é estranho ler o resultado como usuário, mas não é um problema executá-lo como um computador.

Ofuscação grave

Ocultação principal é manter o usuário determinado e conhecedor de fora. É também um jogo de perder total; se um computador pode executá-lo, uma pessoa pode separá-lo e descobrir o que faz. O mais próximo que você poderia chegar seria tornar o programa descriptografado a si mesmo continuamente, transformando o que ele faz ao mesmo tempo em algo completamente diferente do que ele faz em outro momento. Criar uma coisa dessas seria bastante difícil e ainda assim não manteria um hacker muito bom de fora (embora eles fiquem realmente irritados com você no final do mesmo, com a quantidade de esforço necessária para descriptografar todo esse código auto-modificável).

É muito melhor pensar em termos de outras soluções. Por exemplo, você pode manter as "jóias da coroa" do código nos servidores que você controla e apenas permitir chamadas de serviço, tornando o cliente uma oferta essencialmente gratuita, que é um front-end para os bits valiosos. Ou você pode seguir a rota mais contratual / legal e entregar os executáveis ​​apenas às organizações que concordam formalmente em não mexer no seu código ou compensá-lo se o fizerem (para que seja algum tipo de NDA). O objetivo seria criar um forte incentivo para o hacker não invadir e para os usuários manterem o código longe de hackers não vinculados pelo contrato.

Mas você não deve assumir que seu código nunca pode ser quebrado. Com a virtualização, qualquer estado de execução de um programa pode ser examinado e rastreado, e qualquer coisa que tente derrotar isso (por exemplo, rastreamento de relógio para uma fonte de tempo externa) terá muito mais probabilidade de causar problemas para usuários legítimos do que hackers. (Veja o histórico do DRM para saber até mesmo os editores de informações muito determinados não conseguem manter seus sistemas seguros quando o código está nas mãos de seus oponentes.) É muito melhor se concentrar em realmente fazer felizes usuários legítimos. As perdas resultantes do crack ocasional não serão nada comparadas ao dinheiro extra trazido pela satisfação adequada dos clientes.

Donal Fellows
fonte