JS Reverse – knacken Sie oklink-verschlüsselte Parameter und verschlüsselte Daten

Urheberrechtserklärung: Originalität ist nicht einfach, Plagiate und Nachdruck sind in diesem Artikel verboten und Verstöße müssen untersucht werden!

1. JS Reverse Goal – Wird am Ende sein

Einführung brauchen
oklink ist eine Blockchain-Organisation, die ETH, BTC, Tron, Polygon, BSC und andere Blockchain-Browser umfasst. Die meisten ihrer Transaktionen, Adressen, Tags und anderen Daten finden Sie auf dieser Website. Sie haben eine Aufgabe, die Siein oklink: handelt Adresse, ob es sich um eine Hacker-Adresse usw. handelt. Beispieladresse für den umgekehrten JS-Kampf:




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


Wie oben erwähnt, verwenden wir die Adresse von Ethereum, also die 42-Bit-Adresse, die mit 0x beginnt, als Beispiel für eine

Beispielseite für den umgekehrten tatsächlichen Kampf von JS:
Fügen Sie hier eine Bildbeschreibung ein
Hinweis : Das rote Kästchen sind die Daten, die wir crawlen möchten.

Verschlüsselungsparameter :
Anfrage Header-Verschlüsselungsparameter:
Fügen Sie hier eine Bildbeschreibung ein

Verschlüsselungsdaten:
Fügen Sie hier eine Bildbeschreibung ein

2. JS Reverse Analysis – Ich kenne das wahre Gesicht des Mount Lushan nicht

Im Allgemeinen gibt es mehrere Möglichkeiten, Daten zu erfassen, z. B. die Positionierung von Webseitenelementen (CSS/XPath/Re usw.), Schnittstellenanforderungen (Ajax, Fetch usw.), automatisierte Simulation (Selenium/Palywrigth usw.) usw. ; Die zurückgegebenen JSON-Tag-Daten sind verschlüsselt. Ja, zu diesem Zeitpunkt möchten wir möglicherweise Daten erfassen, indem wir Webseitenelemente lokalisieren. Bei der Analyse des HTML-Codes der Webseite werden wir jedoch feststellen, dass die Etikettendaten nicht gefunden werden können. Wenn die Daten vorhanden sind Durch die automatische Simulation erfasst, ist die Kostenleistung zu niedrig

. Wenn 100.000 Daten vorhanden sind, müssen 100.000 Klicks simuliert werden. Je größer die Datenmenge, desto langsamer die Crawling- Geschwindigkeit . uns Schauen Sie sich zunächst die API dieser Schnittstelle an. Wie in der Abbildung oben gezeigt, lautet die API-Schnittstelle:




Fügen Sie hier eine Bildbeschreibung ein

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

Darunter ist ein URL-Parameter t, der ein 13-Bit-Zeitstempel ist,

und der Anforderungsheader-Verschlüsselungsparameter lautet:

x-apikey: LWIzMWUtNDU0Ny05Mjk5LWI2ZDA3Yjc2MzFhYmEyYzkwM2NjfDI3OTE3MTc0NDE3NjQxNjU=

Der Parameter sieht aus wie eine Base64-Verschlüsselung. Verwenden wir zum Entschlüsseln das Online-Tool:

URL des Online-Verschlüsselungs- und Entschlüsselungstools:

https://33tool.com/base64/

Fügen Sie hier eine Bildbeschreibung ein

Die mit base64 entschlüsselte Zeichenfolge lautet:

-b31e-4547-9299-b6d07b7631aba2c903cc|2791717441764165

Wenn es direkt entschlüsselt wird, wir die entschlüsselte Zeichenfolge direkt für die Anfrage verwenden und die Anfrage fehlschlägt, muss der Verschlüsselungsprozess einer anderen Verschlüsselungs- oder Kodierungslogikverarbeitung unterzogen worden sein. Verwenden Sie die globale Suche, wie in der folgenden Abbildung gezeigt: Geben Sie den Parameter ein x-apikey

für
Fügen Sie hier eine Bildbeschreibung ein

die globale Suche . Formatieren Sie dann den JS-Code und zeigen Sie ihn an:
Fügen Sie hier eine Bildbeschreibung ein

Sehr gut, es scheint, dass es direkt durchsucht werden kann. Der Variablenname und der Methodenname wurden von JS nicht verwechselt, was für Crawler relativ freundlich ist.

Fügen Sie hier eine Bildbeschreibung ein
Aus der Beobachtung des JS-Codes ist leicht ersichtlich, dass beim Festlegen des Werts des Parameters x-apikey durch die Methode setRequestHeader () , es ist Verwenden Sie die Methode getApiKey (), verwenden Sie die Tastenkombination Strg + F, um nach dem Methodennamen getApiKey zu suchen: Beachten Sie die Codelogik in der Methode getApiKey (), das können Sie leicht erkennen Die letzte Rückgabe ist this.comb(e, t) , dies ähnelt The self in Python. Die Methode comb hat zwei Parameter, e wird durch die Methode encryptApiKey () abgerufen und der Parameter t erhält zuerst die aktuelle Zeit ist ein 13-Bit-Zeitstempel und ruft dann die Methode encryptTime(t) auf, um die Zeit zu vergleichen. Der Parameter t führt als zweiter Parameter von comb die Verarbeitung der Verschlüsselungslogik durch. Schauen wir uns zunächst an, wie encryptApiKey() die Verschlüsselung durchführt:
Fügen Sie hier eine Bildbeschreibung ein



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

Die Anfangsvariable t ist eine fest codierte Zeichenfolge:

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

Die Variable e teilt die Variable t und gibt eine Liste einzelner Zeichen zurück:

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

Löschen Sie dann die ersten 8 Zeichen der Liste e und kehren Sie zurück, um die Variable n zu bilden, die ebenfalls eine Liste ist:

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

Führen Sie abschließend mit der Liste e vorne und der Liste n hinten eine vorzeichenlose Verbindung durch, um die endgültige Variable t abzurufen, bei der es sich um die Variable e in der Methode getApiKey() handelt.

-b31e-4547-9299-b6d07b7631aba2c903cc

Werfen wir einen Blick auf die Logik in der encryptTime()-Methode:

{
    
    
    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("")
    }
}

Aus dem JS-Code ist ersichtlich, dass die Variable t hier ein 13-Bit-Ganzzahl-Zeitstempel ist. Durch Analyse ist die Variable a hier auch eine fest codierte Ganzzahlvariable 1111111111111. Konvertieren Sie sie nach der Berechnung in den Typ str, bevor Sie fortfahren Die vorzeichenlose Aufteilung wird in eine Liste unterteilt, um die Variable e zu bilden, und die Variablen n, r und o sind alle zufällige ganze Zahlen zwischen 0 und 10. Schließlich werden die vier Variablen vorzeichenlos verbunden, um den endgültigen Rückgabewert zu erhalten Die Methode getApiKey() Die Variable t im

letzten Blick auf die endgültige Methode comb():

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

Hier ist Folgendes zu beachten: this.comb(e, t): Nachdem die Variablen e und t an die Methode comb übergeben wurden, wird die tatsächliche Parametervariable e zur formalen Parametervariablen t und die tatsächliche Parametervariable t wird zum formalen Parameter Variable e , und verwenden Sie dann den Connector „|“, um zuerst eine Verbindung mit dem formalen Parameter t und später mit dem formalen Parameter e herzustellen. Die schließlich zurückgegebene Variable ist die Variable, die mit der btoa()-Methode, also der base64-Methode, verschlüsselt wurde. Fällig zur JS- Rückseite

hier Es ist relativ einfach, ohne Logikverschleierung und JS-Verschleierung usw. Es kann durch Schreiben von Code in Python vervollständigt werden, und es ist nicht erforderlich, execujs, node.js usw. zu verwenden, um die Ausführung von JS zu simulieren Code. Durch die obige Analyse sieht der Code nach dem Reverse Engineering wie folgt aus

:

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')

Führen Sie die Methode get_apikey () aus:

LWIzMWUtNDU0Ny05Mjk5LWI2ZDA3Yjc2MzFhYmEyYzkwM2NjfDI3OTE3ODQ3MTU2NDMzMjk=

Der umgekehrte Code wird geschrieben

3. JS-Reverse-Test – nur weil ich in diesem Berg bin

Als nächstes bleibt nur noch der Test übrig, da sowohl die API-Schnittstelle als auch der umgekehrte Code Zeitstempel verwenden. Um die Konsistenz der Zeitstempel aufrechtzuerhalten, übergeben wir die Zeitstempel als Parameter an get_apikey(now_time) und schreiben dann einfachen Code zum Testen Der Code lautet wie folgt:

# -*- 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())

Konsolenausgabe (formatieren):

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

Fügen Sie hier eine Bildbeschreibung ein

Jetzt kann die Antwort normal zurückgegeben werden, aber aus der Ausgabe geht hervor, dass selbst wenn wir die Verschlüsselungsparameter des Anforderungsheaders knacken, seine Antwort-Tag-Daten immer noch verschlüsselt sind, sodass wir jetzt die Verschlüsselungslogik des Tags weiter knacken müssen Daten? ?

4. JS Anti-Reverse – Weiden und Blumen erstrahlen in einem anderen Dorf

Es ist sicherlich möglich, die Verschlüsselungslogik der Tag-Daten in der Antwort weiter zu analysieren, aber denken wir darüber nach: Unabhängig davon, welche Verschlüsselungslogik in JS übernommen wird, bleibt die Anfangszeichenfolge unverändert:

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

Was passiert, wenn wir diese Zeichenfolge anstelle von x-apikey verwenden, um eine Anfrage direkt zu stellen? @>_<@

Ja, wir schreiben x-apikey direkt in 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())

Konsolenausgabe (formatieren):

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

Beachten Sie, dass diese Idee machbar ist und dies auch so sein sollte, wie wir es wollen. Wir erhalten nicht nur die entschlüsselten realen Daten, sondern schließen auch die Art der Blockchain-Adresse ein: Defi, ERC20, und diese Art von Daten ist in Es ist unsichtbar auf dem Webseite und kann nur durch Anfordern von Daten über die Schnittstelle abgerufen werden. Bisher haben wir das JS-Reverse-Engineering abgeschlossen, nicht das JS-Reverse-Engineering
Fügen Sie hier eine Bildbeschreibung ein

. Warum ist das so? Es ist möglich, Daten erfolgreich direkt über hartcodierte Zeichenfolgen anzufordern, und die erhaltenen Daten sind immer noch unverschlüsselte Daten. Der

Grund dafür kann sein, dass diese Website die umgekehrte JS-Umkehrlogik verwendet, sodass diejenigen, die sich zu sehr auf die umgekehrte Konstruktionslogik von JS-Codedaten konzentrieren, dies tun Capture Der Abnehmer gerät in ein Missverständnis, kann aber nicht den realsten, einfachsten und direktesten Weg finden und wird von einer Anti-Surrounding-Methode getroffen.

Diese Art von umgekehrter JS-Umkehrlogik ist eine relativ andere Existenz. Obwohl sie relativ einfach ist , es lohnt sich. Aufmerksamkeit und Reflexion

Fünftens: Oklink Reverse Complete Code herunterladen

Oklink Reverse, vollständiger Quellcode-Download

Haftungsausschluss: Dieser Artikel dient nur zu Studien- und Forschungszwecken. Verwenden Sie ihn nicht auf illegale Weise!

6. Autoreninformationen

Autor: Xiaohongs Angelroutine, Ziel: Programmieren interessanter machen!

Konzentrieren Sie sich auf Algorithmen, Reptilien, Websites, Spieleentwicklung, Datenanalyse, Verarbeitung natürlicher Sprache, KI usw. und freuen Sie sich auf Ihre Aufmerksamkeit. Lassen Sie uns gemeinsam wachsen und programmieren!

Urheberrechtshinweis: Dieser Artikel verbietet Plagiate und Nachdrucke und Verstöße müssen untersucht werden!

Ich denke du magst

Origin blog.csdn.net/qq_44000141/article/details/130251026
Empfohlen
Rangfolge