Estudié la ofuscación de nombres y recientemente leí algunas cosas sobre el cifrado de cadenas.
Hay funciones de protección de cifrado de cadenas en la protección de ofuscación y el shell de cifrado.
En términos generales, el cifrado de cadenas se puede dividir en dos categorías:
La primera categoría es la tecnología de cifrado de cadenas en la protección contra la ofuscación. La característica principal es modificar la ruta de ejecución del código.
El cifrado de cadenas utilizado por la mayoría de las herramientas de protección contra la ofuscación entra en esta categoría.
La segunda categoría es la tecnología de cifrado de cadenas en shells de cifrado. Este método cifra directamente la cadena en los metadatos sin modificar el código IL.
Esta categoría está representada por remotesoft y maxtocode.
Veamos primero la primera categoría. La implementación del cifrado es aproximadamente la siguiente.
Antes del cifrado:
MessageBox.Show ("¡Hola mundo!");
Después del cifrado:
MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/=="));
En pocas palabras, donde se usaban originalmente cadenas, el uso directo de cadenas se cambia al uso indirecto de cadenas.
Aquí, el software de protección cifra la cadena "Hellow World!" y obtiene el resultado "A34579dfbbeyu346563345/==".
Helper.Decode es una función de descifrado proporcionada por el software de protección, que restaura "A34579dfbbeyu346563345/==" a "¡Hola mundo!".
Debido a que es protección contra ofuscación, podemos analizar y obtener el código decodificado. Luego use directamente el código de esta función para escribir una pequeña herramienta para restaurar todas las cadenas cifradas en el ensamblado. Generar una tabla de correspondencia de cadenas. Para facilitar la lectura y depuración del código.
Si profundiza, puede restaurar automáticamente la cadena al ensamblaje original.
Veamos el código IL del ejemplo anterior.
Antes del cifrado:
ldstr "¡Hola mundo!"
llame a MessageBox.Show(string)
después del cifrado:
ldstr "A34579dfbbeyu346563345/=="
llamar a la cadena Helper.Decode (cadena)
la llamada MessageBox.Show(string)
es realmente muy simple. Ya conocemos el código de decodificación y ya podemos descifrar la cadena. Se obtiene la tabla de cadenas correspondiente.
Cambie directamente
ldstr "A34579dfbbeyu346563345/=="
llamar a la cadena Helper.Decode (cadena)
reemplácelo con
ldstr "Hellow World"
. Simplemente escriba una pequeña herramienta que utilice expresiones regulares para buscar y reemplazar.
El segundo tipo de protección de cifrado de cadenas:
La implementación consiste en cifrar directamente el flujo de cadenas en los metadatos.
Este tipo de protección tiene un defecto. Después de ejecutar el programa, el flujo de cadenas en los metadatos se descifrará y se restaurará por completo en la memoria. En mi artículo anterior, presenté el volcado de metadatos. No lo repetiré aquí.
Para el primer tipo de protección de cifrado de cadenas, existen otras formas. Por ejemplo, la función Helper.Decode puede ser una función nativa.
O se mezcla con el proceso.