Estudei ofuscação de nomes e li recentemente algumas coisas sobre criptografia de strings.
Existem funções de proteção de criptografia de string na proteção de ofuscação e no shell de criptografia.
De modo geral, a criptografia de string pode ser dividida em duas categorias:
A primeira categoria é a tecnologia de criptografia de string na proteção contra ofuscação. A principal característica é modificar o caminho de execução do código.
A criptografia de string usada pela maioria das ferramentas de proteção contra ofuscação se enquadra nesta categoria.
A segunda categoria é a tecnologia de criptografia de strings em shells de criptografia. Este método criptografa diretamente a string nos metadados sem modificar o código IL.
Esta categoria é representada por remotesoft e maxtocode.
Vejamos primeiro a primeira categoria. A implementação da criptografia é aproximadamente a seguinte.
Antes da criptografia:
MessageBox.Show("Hellow World!")
;
MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/=="));
Simplificando, onde strings foram originalmente usadas, o uso direto de strings foi alterado para o uso indireto de strings.
Aqui, o software de proteção criptografa a string "Hellow World!" e obtém o resultado "A34579dfbbeyu346563345/==".
Helper.Decode é uma função de descriptografia fornecida pelo software de proteção, que restaura "A34579dfbbeyu346563345/==" para "Hellow World!".
Por se tratar de proteção contra ofuscação, podemos analisar e obter o código decodificado. Em seguida, use diretamente o código desta função para escrever uma pequena ferramenta para restaurar todas as strings criptografadas no assembly. Gere uma tabela de correspondência de strings. Para facilitar a leitura e depuração do código.
Se você for mais fundo, poderá restaurar automaticamente a string para a montagem original.
Vejamos o código IL do exemplo acima.
Antes da criptografia:
ldstr "Olá, mundo!"
chame MessageBox.Show(string)
após a criptografia:
ldstr "A34579dfbbeyu346563345/=="
chamar string Helper.Decode(string)
a chamada MessageBox.Show(string)
é realmente muito simples. Já conhecemos o código de decodificação e já podemos descriptografar a string. A tabela de strings correspondente é obtida.
Altere diretamente
o ldstr "A34579dfbbeyu346563345/=="
chamar string Helper.Decode(string)
substituí-lo por
ldstr "Hellow World"
. Basta escrever uma pequena ferramenta que use expressões regulares para pesquisar e substituir.
O segundo tipo de proteção de criptografia de string:
A implementação consiste em criptografar diretamente o fluxo String nos metadados.
Este tipo de proteção apresenta uma falha. Após a execução do programa, o fluxo de String nos metadados será descriptografado e completamente restaurado na memória. Em meu artigo anterior, apresentei o despejo de metadados. Não vou repetir aqui.
Para o primeiro tipo de proteção de criptografia de string, existem outras formas. Por exemplo, a função Helper.Decode pode ser uma função nativa.
Ou está misturado com o processo.