JS reverse - craquer les paramètres cryptés oklink et les données cryptées

Déclaration de copyright : l'originalité n'est pas facile, le plagiat et la réimpression sont interdits dans cet article, et la contrefaçon doit faire l'objet d'une enquête !

1. JS Reverse Goal - Sera à la fin

Introduction besoin
oklink est une organisation blockchain, comprenant eth, btc, tron, polygon, bsc et d'autres navigateurs blockchain. La plupart de leurs transactions, adresses, balises et autres données peuvent être trouvées sur ce site Web. Vous avez une tâche, vous avezà oklink : argent adresse, s'il s'agit d'une adresse de pirate, etc. Exemple d'adresse de combat réel inverse JS :




https://www.oklink.com/cn/eth/address/0xdac17f958d2ee523a2206206994597c13d831ec7


Comme mentionné ci-dessus, nous utilisons l'adresse d'Ethereum - c'est- à -dire l'adresse de longueur 42 bits commençant par 0x comme exemple de

page d'exemple de combat réel inversé JS :
insérez la description de l'image ici
Note : la case rouge représente les données que nous voulons

explorer .
paramètre de chiffrement d'en-tête :
insérez la description de l'image ici

données de chiffrement :
insérez la description de l'image ici

2. JS Reverse Analysis - Je ne connais pas le vrai visage du mont Lushan

Il existe généralement plusieurs façons de capturer des données, telles que le positionnement des éléments de page Web (css/xpath/re, etc.), les requêtes d'interface (ajax, fetch, etc.), la simulation automatisée (selenium/palywrigth, etc.), etc. ; les données de balise json renvoyées sont cryptées Oui, à ce stade, nous souhaitons peut-être capturer des données en localisant des éléments de page Web ; mais lors de l'analyse du code HTML de la page Web, nous constaterons que les données d'étiquette ne peuvent pas être localisées. Si les données sont capturé par simulation automatique, le coût performance est trop faible

. S'il y a 100 000 données, alors il faut simuler 100 000 clics. Plus la quantité de données est importante, plus la vitesse de crawling est lente . allons regardez d'abord l'API de cette interface, comme le montre la figure ci-dessus, l'interface API est :




insérez la description de l'image ici

https://www.oklink.com/api/explorer/v1/eth/address/0xdac17f958d2ee523a2206206994597c13d831ec7/more?t=1680606330657

Parmi eux se trouve un paramètre d'URL t, qui est un horodatage de 13 bits

et le paramètre de chiffrement d'en-tête de requête est :

x-apikey: LWIzMWUtNDU0Ny05Mjk5LWI2ZDA3Yjc2MzFhYmEyYzkwM2NjfDI3OTE3MTc0NDE3NjQxNjU=

Le paramètre ressemble au chiffrement base64, utilisons l'outil en ligne pour le déchiffrer :

URL de l'outil de chiffrement et de déchiffrement en ligne :

https://33tool.com/base64/

insérez la description de l'image ici

La chaîne déchiffrée en base64 est :

-b31e-4547-9299-b6d07b7631aba2c903cc|2791717441764165

S'il est directement déchiffré, nous utilisons la chaîne déchiffrée pour demander directement, et la demande échoue, alors le processus de chiffrement doit avoir subi un autre traitement logique de chiffrement ou d'encodage. Utilisez la recherche globale, comme indiqué dans la figure ci-dessous : saisissez le paramètre x-apikey

pour la recherche
insérez la description de l'image ici

globale , puis formatez et affichez le code JS :
insérez la description de l'image ici

Très bien, il semble qu'il puisse être recherché directement. Le nom de la variable et le nom de la méthode n'ont pas été confondus par JS, qui est relativement convivial pour les robots. On peut facilement voir

insérez la description de l'image ici
en observant le code JS que lors de la définition de la valeur du paramètre x-apikey via la méthode setRequestHeader() , c'est Utilisez la méthode getApiKey(), utilisez la touche de raccourci ctrl+f pour rechercher le nom de la méthode getApiKey : Observez la logique du code dans la méthode getApiKey(), vous pouvez facilement voir que le dernier retour est this.comb(e, t) , ceci est similaire à The self en python, la méthode comb a deux paramètres, e est obtenu par la méthode encryptApiKey (), et le paramètre t obtient d'abord l'heure actuelle, qui est un horodatage de 13 bits, puis appelle la méthode encryptTime(t) pour comparer l'heure. Le paramètre t effectue le traitement de la logique de chiffrement, en tant que second paramètre de comb .
insérez la description de l'image ici



{
    
    
    key: "encryptApiKey",
    value: function() {
    
    
        var t = this.API_KEY
          , e = t.split("")
          , n = e.splice(0, 8);
        return t = e.concat(n).join("")
    }
}

La variable initiale t est une chaîne codée en dur :

['a', '2', 'c', '9', '0', '3', 'c', 'c', '-', 'b', '3', ………………]

La variable e divise la variable t et renvoie une liste de caractères uniques :

['a', '2', 'c', '9', '0', '3', 'c', 'c', ………………]

Supprimez ensuite les 8 premiers caractères de la liste e et revenez pour former la variable n, qui est aussi une liste :

['a', '2', 'c', '9', '0', '3', 'c', 'c']

Enfin, avec la liste e devant et la liste n derrière, effectuez une connexion non signée pour obtenir la variable finale t, qui est la variable e dans la méthode getApiKey()

-b31e-4547-9299-b6d07b7631aba2c903cc

Examinons la logique de la méthode encryptTime() :

{
    
    
    key: "encryptTime",
    value: function(t) {
    
    
        var e = (1 * t + a).toString().split("")
          , n = parseInt(10 * Math.random(), 10)
          , r = parseInt(10 * Math.random(), 10)
          , o = parseInt(10 * Math.random(), 10);
        return e.concat([n, r, o]).join("")
    }
}

On peut voir à partir du code JS que la variable t ici est un horodatage entier de 13 bits. Grâce à l'analyse, la variable a ici est également une variable entière codée en dur 1111111111111. Après le calcul, convertissez-la en type str avant de continuer . La division non signée est divisée en une liste pour former la variable e, et les variables n, r et o sont toutes des entiers aléatoires entre 0 et 10. Enfin, les quatre variables sont connectées sans signe pour obtenir la valeur de retour finale, qui est la méthode getApiKey() La variable t dans

le dernier regard sur la méthode finale comb() :

{
    
    
    key: "comb",
    value: function(t, e) {
    
    
        var n = "".concat(t, "|").concat(e);
        return window.btoa(n)
    }
}

Une chose à noter ici, this.comb(e, t), après que les variables e et t sont passées à la méthode comb, la variable de paramètre réelle e devient la variable de paramètre formelle t, et la variable de paramètre réelle t devient le paramètre formel variable e , puis utilisez le connecteur "|" pour vous connecter avec le paramètre formel t d'abord et le paramètre formel e plus tard, et la variable finalement renvoyée est la variable chiffrée par la méthode btoa (), c'est-à-dire la méthode base64. au JS reverse

ici C'est relativement simple, sans obfuscation logique et obfuscation JS, etc. Il peut être complété en écrivant du code en python, et il n'est pas nécessaire d'utiliser execujs, node.js, etc. pour simuler l'exécution de JS Grâce à l'analyse ci-dessus, le code après rétro-ingénierie est le suivant

 :

import requests
import time
import random
import base64

def get_apikey():
    API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
    key1 = API_KEY[0:8]
    key2 = API_KEY[8:]
    new_key = key2 + key1
    current_time = int(time.time() * 1000)
    new_time = str(1 * current_time + 1111111111111)
    random1 = str(random.randint(0, 9))
    random2 = str(random.randint(0, 9))
    random3 = str(random.randint(0, 9))
    current_time = new_time + random1 + random2 + random3
    last_key = new_key + '|' + current_time
    x_apiKey = base64.b64encode(last_key.encode('utf-8'))
    return str(x_apiKey, encoding='utf-8')

Exécutez la méthode get_apikey () :

LWIzMWUtNDU0Ny05Mjk5LWI2ZDA3Yjc2MzFhYmEyYzkwM2NjfDI3OTE3ODQ3MTU2NDMzMjk=

Le code inverse s'écrit

3. JS reverse testing - juste parce que je suis dans cette montagne

Ensuite, il ne reste que le test, car l'interface api et le code inverse utilisent des horodatages.Afin de maintenir la cohérence des horodatages, nous transmettons les horodatages en tant que paramètres à get_apikey(now_time), puis écrivons un code simple pour les tests. le code est le suivant :

# -*- coding: utf-8 -*-
import requests
import time
import random
import base64


def get_apikey(now_time):
    API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
    key1 = API_KEY[0:8]
    key2 = API_KEY[8:]
    new_key = key2 + key1
    new_time = str(1 * now_time + 1111111111111)
    random1 = str(random.randint(0, 9))
    random2 = str(random.randint(0, 9))
    random3 = str(random.randint(0, 9))
    now_time = new_time + random1 + random2 + random3
    last_key = new_key + '|' + now_time
    x_apiKey = base64.b64encode(last_key.encode('utf-8'))
    return str(x_apiKey, encoding='utf-8')

now_time = int(time.time()) * 1000
headers = {
    
    
    'x-apikey': get_apikey(now_time),
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
api = f'https://www.oklink.com/api/explorer/v1/eth/address/0xdac17f958d2ee523a2206206994597c13d831ec7/more?t={
      
      now_time}'
res = requests.get(url=api, headers=headers)
print(res.json())

Sortie de la console (formatez-la):

{
    
    
    'code': 0, 
    'msg': '', 
    'detailMsg': '', 
    'data': 
        {
    
    
            'entityTags': 
                    ['QayvIUbQGpJhs4QOJk7Ccw==: dlWG6vsFQhA+YAnbzdnYNg==. igTdUMG1sXqlL+ISnaIU8Q=='], 
            'propertyTags': 
                    ['BYqzosCjwa3Hdj/jGp99Xg==', 'B3N0UYJLaM9LPazO98GU9Q==']
        }
}

insérez la description de l'image ici

Maintenant, la réponse peut être renvoyée normalement, mais on peut voir à partir de la sortie que même si nous craquons les paramètres de cryptage de l'en-tête de la requête, ses données de balise de réponse sont toujours cryptées, nous devons donc maintenant craquer davantage la logique de cryptage de la balise données ? ?

4. JS anti-retour - Des saules et des fleurs illuminent un autre village

Il est certainement possible d'analyser plus en détail la logique de chiffrement des données du tag dans la réponse, mais réfléchissons-y, quelle que soit la logique de chiffrement adoptée dans JS, sa chaîne initiale reste inchangée :

API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"

Que se passera-t-il si nous utilisons cette chaîne au lieu de x-apikey pour faire une requête directement ? @>_<@

Oui, nous écrivons directement x-apikey dans API_KEY :

now_time = int(time.time()) * 1000
headers = {
    
    
    'x-apikey': 'a2c903cc-b31e-4547-9299-b6d07b7631ab',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
api = f'https://www.oklink.com/api/explorer/v1/eth/address/0xdac17f958d2ee523a2206206994597c13d831ec7/more?t={
      
      now_time}'
res = requests.get(url=api, headers=headers)
print(res.json())

Sortie de la console (formatez-la):

{
    
    
    'code': 0, 
    'msg': '', 
    'detailMsg': '', 
    'data': 
        {
    
    
            'entityTags': 
                    ['DeFi: Tether. USDT Stablecoin'], 
            'propertyTags': 
                    ['ERC20', 'Tether USDT']
        }
}

Observez, cette idée est réalisable, et cela devrait être comme nous le voulons. Nous obtenons non seulement les données réelles décryptées, mais incluons également le type d'adresse de la blockchain : Defi, ERC20, et ce type de données est dans Il est invisible sur le page Web, et ne peut être obtenue qu'en demandant des données via l'interface. Jusqu'à présent, nous avons terminé l'ingénierie inverse JS, pas l'ingénierie inverse JS
insérez la description de l'image ici

. Alors, pourquoi ? Il est possible de demander avec succès des données directement via des chaînes codées en dur, et les données obtenues sont toujours des données non cryptées.La

raison peut être que ce site Web adopte la logique inverse JS inverse, de sorte que ceux qui sont trop concentrés sur les données de code de logique de construction inverse JS capture Le preneur tombera dans un malentendu, mais ne trouvera pas le moyen le plus réel, le plus simple et le plus direct, et sera frappé d'un anti-entourage.

Ce type de logique inversée JS inversée est une existence relativement différente. Bien qu'il soit relativement simple , cela vaut notre attention et notre réflexion

Cinq, oklink inverser le téléchargement complet du code

oklink inverse téléchargement complet du code source

Avis de non-responsabilité : cet article est uniquement à des fins d'étude et de recherche, ne l'utilisez pas de manière illégale !

6. Informations sur l'auteur

Auteur : Routine de pêche de Xiaohong, Objectif : Rendre la programmation plus intéressante !

Concentrez-vous sur les algorithmes, les reptiles, les sites Web, le développement de jeux, l'analyse de données, le traitement du langage naturel, l'IA, etc., dans l'attente de votre attention, laissez-nous grandir et coder ensemble !

Remarque sur les droits d'auteur : cet article interdit le plagiat et la réimpression, et toute violation doit faire l'objet d'une enquête !

Je suppose que tu aimes

Origine blog.csdn.net/qq_44000141/article/details/130251026
conseillé
Classement