Il y a quelques jours, dans le groupe d'échange Python Star Yao et The Strongest King, plusieurs personnes ont posé des questions sur les vidéos d'ingénierie inverse JS et les codes associés. Il semble qu'ils apprennent tous des connaissances avancées. Je ne fais plus défiler. Il se trouve que j'ai lu du matériel d'apprentissage JS ces jours-ci et que j'ai vu un très bon cas. J'aimerais le partager avec vous et l'enregistrer ici.
Concernant la recherche du code JS, il est assez difficile d'écrire un article pour l'expliquer. Il serait préférable d'enregistrer une explication vidéo Ici, le code JS prêt à l'emploi est directement organisé. Il est assez difficile de trouver ce code de cryptage JS au début. Il faut constamment casser des points, trouver les règles de cryptage et éplucher l'oignon couche par couche pour le savoir. Le code de cryptage JS utilisé dans cet article provient d'un petit site Web de vidéos. La fonction de cryptage présentée sur la page Web est la suivante :
La méthode de cryptage n'est pas trop difficile, et le code de base du decodeMp4.decode () La fonction de cryptage est la suivante.
define("tool", function(a, b, c) { var d = a("jquery") , e = a("support") , f = a("constants") , g = a("base64") , h = "substring" , i = "split" , j = "replace" , k = "substr"; b.decodeMp4 = { getHex: function(a) { return { str: a[h](4), hex: a[h](0, 4)[i]("").reverse().join("") } }, getDec: function(a) { var b = parseInt(a, 16).toString();# 对应Python中的str(int(a, 16)) return { pre: b[h](0, 2)[i](""), tail: b[h](2)[i]("") } }, substr: function(a, b) { var c = a[h](0, b[0]) , d = a[k](b[0], b[1]); return c + a[h](b[0])[j](d, "") }, getPos: function(a, b) { return b[0] = a.length - b[0] - b[1], b }, decode: function(a) { var b = this.getHex(a) , c = this.getDec(b.hex) , d = this[k](b.str, c.pre); return g.atob(this[k](d, this.getPos(d, c.tail))) } };
Vous pouvez voir que la fonction decode() dans decodeMp4 est appelée et que la fonction decode() appelle getHex(a), getDec(b.hex), g.atob(), getPos(d, c. tail) et d'autres fonctions, et ce que nous devons faire est de convertir ces fonctions en écriture Python, puis de construire la méthode de cryptage correspondante, d'obtenir le résultat crypté et de compléter l'effet inverse.
La variable a ici est une longue chaîne passant par des points d'arrêt. Ici, la variable suivante est utilisée comme exemple.
a = "c0b1Ly9tdnPflQ3cQpPZpZGVvMTAubWVpdHVkYXRhLmNvbS82MWM0NDNlOGI1MmFmMTYzMi5tcDkBOyQ"
Organisons brièvement à l'avance les fonctions qui seront utilisées plus tard, afin qu'il soit plus facile pour tout le monde de les vérifier plus tard.
Décomposons chaque fonction tour à tour, comme suit :
var h = "substring",i = "split"; getHex: function(a) { return { str: a[h](4), hex: a[h](0, 4)[i]("").reverse().join("") } },
Ce qui précède est le code JS correspondant de la fonction getHex(). Vous pouvez voir qu'un dictionnaire est directement renvoyé. , les clés du dictionnaire sont respectivement str et hex, où la valeur correspondante de str est a[h](4), et la définition de h est substring. La signification de cette fonction est que la chaîne commence à partir de l'indice spécifié jusqu'à. il atteint la fin de la chaîne. La traduction ici est a.substring(4), c'est-à-dire que la chaîne a commence à l'indice 4 et se termine par a[h](0, 4)[i]("").reverse ; ().join("" ) C'est un peu plus compliqué à comprendre. Tout d'abord, la valeur de la chaîne est prise entre 0 et 4. Ensuite, la fonction i est appelée, qui est la fonction de fractionnement. ("") comme split. La fonction reverse() est appelée pour trier dans l'ordre inverse. Ensuite, appelez join("") pour concaténer les chaînes, et ce sera beaucoup plus simple après le démontage. L'étape suivante consiste à construire le code Python. Après avoir écrit la comparaison, il ressemblera à ceci :
def getHex(a): return { "str": a[4:],# JS中的substring(4)指的是从4开始取值到字符串末尾 "hex": "".join(list(a[0:4])[::-1])# [::-1]代表的是反向取值 }
Est-ce que cela vous semble familier ? C'est exactement la même chose que le code JS ci-dessus.
Le code JS est le suivant :
getDec: function(a) { var b = parseInt(a, 16).toString(); return { pre: b[h](0, 2)[i](""), tail: b[h](2)[i]("") } },
Selon la relation correspondante, le code Python correspondant peut s'écrire comme suit :
def getDec(a): b = str(int(a, 16)) print(b) return { "pre": list(b[:2]), "tail": list(b[2:]) }
Le JS Le code est le suivant :
substr: function(a, b) { var c = a[h](0, b[0]) , d = a[k](b[0], b[1]); return c + a[h](b[0])[j](d, "") },
Selon la relation correspondante, le code Python correspondant peut être écrit comme suit :
def substr(a, b): c = a[0: int(b[0])] print(c) d = a[int(b[0]):int(b[0])+int(b[1])] print(d) return c + a[int(b[0]):].replace(d, '')
Le code JS est le suivant. :
getPos: function(a, b) { return b[0] = a.length - b[0] - b[1], b },
Selon la relation correspondante, le code Python correspondant peut s'écrire comme suit : Le code Python correspondant est le suivant :
def getPos(a, b): b[0] = len(a) - int(b[0]) - int(b[1]) print(b[0]) return b
Le code JS est le suivant :
decode: function(a) { var b = this.getHex(a) , c = this.getDec(b.hex) , d = this[k](b.str, c.pre); return g.atob(this[k](d, this.getPos(d, c.tail))) }
Selon la relation correspondante, le code Python correspondant peut être écrit comme suit :
b = getHex(a) # print(b) c = getDec(b['hex']) print(c) # d = k(str(b), c.pre) d = substr(b['str'], c['pre']) # print(d) return base64.b64decode(substr(d, getPos(d, c['tail'])))
Si vous faites une demande directement via un robot d'exploration Web, vous n'obtiendrez pas l'adresse cryptée finale. demandez-le, vous ne l'obtiendrez pas. Vous ne pouvez obtenir que data-src, qui est la variable de chaîne mentionnée ci-dessus. Ce n'est qu'après avoir inversé, grâce à l'analyse ci-dessus et exécuté le code, que vous pouvez obtenir la même adresse de requête que sur a. page Web, comme le montre la figure ci-dessous, l'inverse est réussi !
Mettez cette adresse dans le navigateur et elle pourra être lue, puis faites une demande de téléchargement pour télécharger la vidéo.
Bonjour à tous, je suis un utilisateur avancé de Python. Cet article est principalement basé sur le problème inverse JS dans le robot d'exploration Web Python et propose une explication de cas. Si la page Web est chargée avec JS, si vous la demandez directement via un robot d'exploration Web, vous ne pourrez pas obtenir l'adresse cryptée finale. Pour résoudre ce problème inverse, nous avons créé un exemple simple de processus de mise en œuvre inversé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!