Parlons d'abord de l'environnement :
Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-52-generic x86_64) PHP 5.5.9-1ubuntu4.19 (cli)
Démarche pratique
J'ai un projet chiffré et une bibliothèque de liens dynamiques étendue PHP (jinhou.so) sous la main.
Le code PHP ressemble à ce qui suit :
<?php /* xxxx技术有限公司版权所有: 2016-09-08 08:18:00 */ jhgo('uGpqefbDEBkqp4preQ2UaAp3RAUeJAZ5s4aERAQMkxbJTgEovHnQw6WxsA99sAhSacJCLGxZL4Q4u6zFyGveuDUoemktHGkMaB5D'); ?>
Selon les conditions connues analysées ci-dessus :
1. La méthode de cryptage est similaire à la méthode de cryptage eval.
2.jhgo contient le code d'exécution et le code de décryptage.
3.jinhou.so contient la fonction jhgo.
Tout d'abord, utilisez VIM pour ouvrir jinhou.so très grossièrement pour voir s'il y a des informations clés.
Malheureusement, la source de la solution est clairement écrite. https://github.com/eixom/zoeeyguard
Après avoir examiné le code, théoriquement, cette extension expose deux méthodes, une pour chiffrer les fichiers et une pour déchiffrer les fichiers. Mais une seule méthode a été réellement exposée, et une autre a été supprimée par le fournisseur astucieux.
Bien sûr, nous avons déjà le code source, donc nous ne nous en soucions pas tellement.
Essayez de le compiler avec le code source officiel, puis décodez-le et constatez qu'il ne fonctionne toujours pas.
Après l'avoir étudié attentivement, j'ai découvert que
contenait une chaîne très magique : 82dsa7dsas32112389uy7aydh8h2h2i412
Je me demandais si c'était sa clé de cryptage. Après avoir relu le code, il s'est avéré que c'était vrai. À l'intérieur du fichier https://github.com/eixom/zoeeyguard/blob/master/src/guard.h
.
L'original est 28dsa7dsas12312389uy7aydh8h1h2i312
. Après avoir effectué les modifications, j'ai constaté que cela ne fonctionnait toujours pas.
Comme prévu, je suis encore Trop Jeune, Trop Simple.
Analyse du point de vue psychologique des programmeurs : généralement, personne ne changera le code, il suffit de changer les paramètres. Y a-t-il d'autres paramètres qui ont été modifiés ? Mais d’autres paramètres sont sous forme de tableau, ce qui est un casse-tête.
/* private key */ #define PRIVATE_KEY "28dsa7dsas12312389uy7aydh8h1h2i312" #define PRIVATE_KEY_LEN sizeof(PRIVATE_KEY) /* order */ static const unsigned char OBFUSCATED_ORDER[] = { 13, 6, 5, 7, 1, 15, 14, 20 , 9, 16, 19, 4, 18, 10, 2, 8 , 12, 3, 11, 0, 17 }; #define ORDER_SIZE sizeof(OBFUSCATED_ORDER) / sizeof(* OBFUSCATED_ORDER) /* alphabet for base64 */ static const unsigned char OBFUSCATED_ALPHABET[] = { 's', '4', 'N', 'E', 'k', 'X', 'c', 'u' , 'J', '2', 'U', 'o', 'O', 'w', 'K', 'v' , 'h', 'H', 'C', '/', 'D', 'q', 'l', 'R' , 'B', 'r', '5', 'Z', 'S', 'Q', '6', 'W' , '3', 'L', 'j', '8', '1', 'z', '0', 'G' , 'n', 'e', 'y', 'b', 'I', 'd', 'i', 'P' , 'A', '9', '7', '+', 'm', 'V', 'M', 'Y' , 'F', 'g', 'f', 'p', 'a', 'T', 't', 'x' }; #define ALPHABET_SIZE 64
À ce stade, vous devez utiliser un outil qui tue : IDA Pro v6.8, un artefact de décompilation. La gauche est la version normale et la droite est jinhou.so.
Modifiez les fichiers dans guard.h en fonction des données. Après recompilation, il a été déchiffré avec succès.
<?php require_cache(APP_PATH.'/Lib/Action/User/AddonAction.class.php'); ?>
Résumé après
1 Ce cracking n'a pas pris beaucoup de temps, principalement grâce au fait que le schéma de cryptage et le code de cryptage nous ont été clairement indiqués.
2. Le moment principal est de tester les paramètres de chiffrement. Heureusement, le fichier .so n'est pas compressé.
3. Au cours du processus de craquage, j'ai également découvert les failles du cryptage PHP.
[Apprentissage recommandé : Tutoriel vidéo PHP]