J'ai étudié l'obscurcissement des noms et j'ai récemment lu des choses sur le cryptage des chaînes.
Il existe des fonctions de protection contre le chiffrement de chaînes dans la protection contre l'obscurcissement et le shell de chiffrement.
De manière générale, le chiffrement de chaînes peut être divisé en deux catégories :
La première catégorie est la technologie de cryptage de chaînes dans la protection contre l’obscurcissement. La fonctionnalité principale est de modifier le chemin d'exécution du code.
Le chiffrement de chaîne utilisé par la plupart des outils de protection contre l’obfuscation entre dans cette catégorie.
La deuxième catégorie concerne la technologie de chiffrement de chaînes dans les shells de chiffrement. Cette méthode chiffre directement la chaîne dans les métadonnées sans modifier le code IL.
Cette catégorie est représentée par remotesoft et maxtocode.
Examinons d’abord la première catégorie. La mise en œuvre du chiffrement est à peu près la suivante.
Avant le chiffrement :
MessageBox.Show("Hellow World!");
Après le cryptage :
MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/=="));
Pour faire simple, là où les chaînes étaient utilisées à l'origine, l'utilisation directe des chaînes est remplacée par l'utilisation indirecte des chaînes.
Ici, le logiciel de protection crypte la chaîne « Hellow World ! » et obtient le résultat « A34579dfbbeyu346563345/==".
Helper.Decode est une fonction de décryptage fournie par le logiciel de protection, qui restaure "A34579dfbbeyu346563345/==" dans "Hellow World!".
Parce qu'il s'agit d'une protection contre l'obscurcissement, nous pouvons analyser et obtenir le code décodé. Utilisez ensuite directement le code de cette fonction pour écrire un petit outil permettant de restaurer toutes les chaînes chiffrées dans l'assembly. Générez une table de correspondance de chaînes. Pour faciliter la lecture et le débogage du code.
Si vous allez plus loin, vous pouvez automatiquement restaurer la chaîne dans l'assemblage d'origine.
Regardons le code IL de l'exemple ci-dessus.
Avant le chiffrement :
ldstr "Bonjour tout le monde !"
appelez MessageBox.Show(string)
après le cryptage :
ldstr "A34579dfbbeyu346563345/=="
chaîne d'appel Helper.Decode (chaîne)
l'appel MessageBox.Show(string)
est en fait très simple. Nous connaissons déjà le code de décodage et pouvons déjà décrypter la chaîne. Le tableau de chaînes correspondant est obtenu.
Changez directement
ldstr "A34579dfbbeyu346563345/=="
chaîne d'appel Helper.Decode (chaîne)
Remplacez-le simplement par
ldstr "Hellow World"
. Écrivez simplement un petit outil qui utilise des expressions régulières pour rechercher et remplacer.
Le deuxième type de protection par chiffrement de chaîne :
L'implémentation consiste à chiffrer directement le flux String dans les métadonnées.
Ce type de protection présente un défaut une fois le programme exécuté, le flux String dans les métadonnées sera déchiffré et complètement restauré dans la mémoire. Dans mon article précédent, j'ai présenté le dump des métadonnées. Je ne le répéterai pas ici.
Pour le premier type de protection par chiffrement de chaîne, il existe d'autres formes. Par exemple, la fonction Helper.Decode peut être une fonction native.
Ou bien cela est mélangé au processus.