Límite de cifrado JS del sitio web del juego, use Python para superar el límite y realizar el descifrado inverso ~

Ya estoy de vuelta. Hace mucho que no actualizo, pero parece que nadie lee el artículo. ¿
Es posible ver el vídeo para aprender?

La línea de hoy es aburrida para compartir y compartir. Si usa Python para romper el límite de cifrado JS y realiza un descifrado inverso para lograr el inicio de sesión automático ~

objetivo inverso

  • Objetivo: un inicio de sesión de 7 juegos en línea
  • Página de inicio: aHR0cHM6Ly93d3cuMzcuY29tLw==
  • Interfaz: aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA==
  • Parámetros inversos: Parámetros de cadena de consulta: contraseña:
    SlVEOThrcjgzNDNjaUYxOTQzNDM0eVM=

proceso inverso

Análisis de paquetes

Vaya a la página de inicio de un determinado juego en línea, ingrese una contraseña de cuenta casualmente, haga clic en iniciar sesión, capture el paquete y ubique la interfaz de inicio de sesión como aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA==, OBTENER solicitud:

inserte la descripción de la imagen aquí

Analice los parámetros principales en Parámetros de cadena de consulta:

La devolución de llamada es un parámetro de devolución de llamada. El valor de este parámetro no afecta el resultado de la solicitud. Su formato es jQuery + número de 20 dígitos + _ + marca de tiempo de 13 dígitos. Es fácil de construir usando Python:

import time
import random

timestamp = str(int(time.time() * 1000))
jsonp = ''
for _ in range(20):
    jsonp += str(random.randint(0, 9))
callback = 'jQuery' + jsonp + '_' + timestamp
print(callback)

login_account es el nombre de la cuenta de inicio de sesión;

la contraseña es la contraseña cifrada;

_ es la marca de tiempo de 13 bits.

Inversión de parámetros

El parámetro que debemos invertir es solo una contraseña. Intentamos buscar directamente esta palabra clave globalmente y encontraremos que hay muchos resultados, lo que no es propicio para el análisis. Aquí hay un pequeño truco, agregue un signo igual, Y busque contraseña =, lo cual es muy útil. El rango de búsqueda se acorta enormemente. Por supuesto, también puede buscar contraseña:, también puede agregar un espacio entre la palabra clave y el símbolo, y también puede buscar var contraseña .Simplemente cámbielo por otro.

En este caso, buscamos contraseña =, podemos ver la declaración h.password = td(f) en el archivo sq.login2015.js, donde se sospecha que la contraseña está cifrada, podemos enterrar un punto de interrupción aquí para depurar. y podemos ver que el valor devuelto es de hecho la contraseña cifrada:

inserte la descripción de la imagen aquí

Continuando con el seguimiento de la función td, podemos ver que se utiliza un cifrado RSA autoescrito, es muy simple y claro, podemos copiarlo directamente y llamarlo con Python:

Por favor agregue una descripción de la imagen.

El código completo se puede obtener directamente de la tarjeta de presentación al final del artículo.

Código de clave de cifrado JS del parámetro

var ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function __rsa(str) {
    
    
    var out, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
    
    
        c1 = str.charCodeAt(i++) & 0xff;
        if (i == len) {
    
    
            out += ch.charAt(c1 >> 2);
            out += ch.charAt((c1 & 0x3) << 4);
            out += "==";
            break
        }
        c2 = str.charCodeAt(i++);
        if (i == len) {
            out += ch.charAt(c1 >> 2);
            out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
            out += ch.charAt((c2 & 0xF) << 2);
            out += "=";
            break
        }
        c3 = str.charCodeAt(i++);
        out += ch.charAt(c1 >> 2);
        out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
        out += ch.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
        out += ch.charAt(c3 & 0x3F)
    }
    return out
}

function getEncryptedPassword(a) {
    
    
    var maxPos = ch.length - 2
      , w = [];
    for (i = 0; i < 15; i++) {
    
    
        w.push(ch.charAt(Math.floor(Math.random() * maxPos)));
        if (i === 7) {
    
    
            w.push(a.substr(0, 3))
        }
        if (i === 12) {
    
    
            w.push(a.substr(3))
        }
    }
    return __rsa(w.join(""))
}

// 测试样例
// console.log(getEncryptedPassword("34343434"))

Código clave de inicio de sesión de Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import random

import execjs
import requests


login_url = '脱敏处理,完整代码领取Q裙 592539176'


def get_encrypted_password(password):
    with open('encrypt.js', 'r', encoding='utf-8') as f:
        www_37_js = f.read()
    encrypted_pwd = execjs.compile(www_37_js).call('getEncryptedPassword', password)
    return encrypted_pwd


def login(username, encrypted_password):
    timestamp = str(int(time.time() * 1000))
    jsonp = ''
    for _ in range(20):
        jsonp += str(random.randint(0, 9))
    callback = 'jQuery' + jsonp + '_' + timestamp
    params = {
    
    
        'callback': callback,
        'action': 'login',
        'login_account': username,
        'password': encrypted_password,
        'ajax': 0,
        'remember_me': 1,
        'save_state': 1,
        'ltype': 1,
        'tj_from': 100,
        's': 1,
        'tj_way': 1,
        '_': timestamp
    }
    headers = {
    
    
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36',
        'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"'
    }
    response = requests.post(url=login_url, headers=headers, params=params)
    print(response.text)


def main():
    username = input('请输入登录账号: ')
    password = input('请输入登录密码: ')
    encrypted_password = get_encrypted_password(password)
    login(username, encrypted_password)


if __name__ == '__main__':
    main()

Bien, lo anterior es el artículo compartido hoy.

Si está interesado, puede hacer clic en la tarjeta de presentación al final del artículo para obtener el código y probarlo después de obtenerlo.

Nos vemos en el próximo artículo ~

Supongo que te gusta

Origin blog.csdn.net/yxczsz/article/details/130729293
Recomendado
Clasificación