Estudo de segurança do TurboConf

Olá pessoal! Decidi compartilhar com a comunidade informações sobre uma pequena análise de um pequeno utilitário (com um código ofuscado), conhecido em círculos estreitos de apelidos 1s. Este é o meu primeiro artigo sobre Habr, peço que não chute muito, mas digno de criticar.

Isenção de responsabilidade

Tudo o que você vê aqui pode afetar suas habilidades psíquicas, não use para si mesmo o que está descrito no artigo, pois isso pode prejudicá-lo. O autor não assume nenhuma responsabilidade pela precisão, integridade ou qualidade das informações fornecidas.

O que é isso

O TurboConf é um programa "shareware" que amplia os recursos do configurador 1s, não uma palavra mais sobre 1s , que não requer instalação. Você pode baixá-lo no site com o mesmo nome Runet. Todos os estudos foram realizados na versão 5.9.7209.21363 de 27 de setembro de 2019.

Análise inicial

Após o download, obtemos um arquivo zip. Desembalar. Vemos vários arquivos exe. Vejamos o aplicativo principal com um ícone corporativo. Se você o abrir em um editor HEX simples, por exemplo, HxD, poderá entender facilmente que é um assembly no .Net Framework, porque os nomes de classe da biblioteca .Net padrão são visíveis:

TurboConf em HxD
imagem

Em seguida, pegamos o descompilador DotPeek e examinamos esse assembly. O bytecode não é ofuscado, portanto o decompilador produz fontes quase originais:

Código do método recuperado
imagem

É fácil entender aqui que o trabalho do utilitário avança para o aplicativo "TurboConf.Application.exe". Abra-o no DotPeek. Este também é um assembly com código IL. Mas, diferentemente da montagem anterior, alguns dos métodos aqui são ofuscados, provavelmente usando o Confuser. Estudando o código, fica claro que a principal lógica do trabalho está em "TurboConf.Service.dll" - e este também é um assembly para .Net, e também alguns dos métodos são ofuscados. Ótimo, isso é ainda mais interessante!

Pesquisa de Defesa

Ao visualizar a estrutura do assembly, no espaço de nomes “TurboConf.Service.Utils”, encontramos a classe “Crypto” e nela um método com o nome falado “DecryptStringAES”:

Método DecryptStringAES
imagem

Embora seja ofuscado, não é difícil restaurar a lógica do trabalho a partir dele no futuro. Encontre o uso deste método (Shift + F12):

Resultados da pesquisa
imagem

E imediatamente sucesso! Este método é chamado 2 vezes no construtor da classe responsável pelo licenciamento!

Recuperação de origem

O ofuscador criptografou todas as linhas e as colocou em um arquivo de recurso. Você pode obter esse arquivo usando o descompilador Microsoft ildasm.exe incluído no Windows SDK (e não apenas):

Recuperando um arquivo de recurso
imagem

E em vez das linhas originais, o ofuscador substitui a seguinte construção no código: "<Module> .c (random_arithmic_operation)", em que o resultado da operação aritmética é um determinado número, com base no qual o deslocamento para o arquivo de recurso é calculado, a partir do qual os dados criptografados são então extraídos e a string original é restaurada. Para facilitar a tarefa de descriptografar seqüências, criaremos um novo projeto no Visual Studio, transferiremos, com um pouco de refinamento, a classe "<Module>" e o arquivo de recurso "resource". Assim, podemos entender que, na janela DotPeek, o seguinte código

<Module>.c(sizeof (float) - 47, sizeof (int) + 6429, (int) ((uint) k >> 16) >= 0 ? sizeof (int) + 200 : System.Type.EmptyTypes.Length - 1805516213) 

esta é a linha "Usuário:"

Restaure lentamente toda a lógica da classe de licenciamento. Podemos parar com isso, ou seja, fazer um pequeno hack no arquivo investigado “TurboConf.Service.dll”, substituindo a verificação de igualdade de uma licença pela desigualdade, mas isso não é interessante. Indo além ...

Princípio de proteção

Para obter uma licença, você precisa de um identificador exclusivo para o equipamento no qual o programa é executado. Este HardwareID é gerado com base no identificador do processador e no número de série do volume da unidade "Ts". Para obter uma licença de avaliação, o programa faz uma solicitação GET com um identificador de equipamento para o domínio "netlenka1c.ru". E em resposta, vem uma chave indicando a data final do período de avaliação, assinada ... digitalmente. O programa é baseado no algoritmo RSA assimétrico com uma chave de 1024 bits. Nesse estágio, percebi que é impossível fazer isso sem modificar o arquivo original, pois é quase impossível obter a chave privada (não está nos arquivos do utilitário).

Mini Centro de Licenciamento

Tendo entendido como a proteção funciona, decidi me tornar um deus pequeno para este programa, para que eu próprio pudesse gerar chaves. Para isso, foi desenvolvido um patcher, que primeiro substitui a chave pública da assinatura digital no assembly pela própria chave pública gerada:

Patcher
imagem

E o utilitário desenvolvido para gerar chaves (temporárias por um período de validade especificado e permanente), adiciona uma assinatura digital à chave com base na própria chave privada gerada:

Keygen
imagem

Como resultado, temos um programa registrado viável com todas as funcionalidades:

Sobre o programa
imagem

Moral

A ofuscação é um método muito bom para confundir o inverso, mas é apenas uma questão de tempo.

PS

O artigo apresenta lacunas específicas na narrativa, para não substituir o autor do programa. Nenhum código fonte e programa de trabalho estão anexados e não serão. Respeite o trabalho de outras pessoas, especialmente colegas da "loja"!

Obrigado a todos que lêem o post!

Source: https://habr.com/ru/post/pt480280/


All Articles