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:
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:
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:
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 ~