Análisis JS
objetivo de aprendizaje:
- Comprender el método de posicionamiento de js
- Comprender el método de agregar puntos de interrupción para observar el proceso de ejecución de js
- Método de obtención de js usando js2py
1 Determine la ubicación de js
Para el caso anterior de Renren, sabemos que hay algunos parámetros en la dirección URL, pero ¿cómo se generan los parámetros?
No hay duda de que los parámetros deben ser generados por js, entonces, ¿cómo obtener la ley de estos parámetros? Aprenda a través de lo siguiente
1.1 Observe el evento js obligado del botón
Al hacer clic en el botón y luego hacer clic Event Listener
, algunos sitios web pueden encontrar el evento vinculado, en consecuencia, simplemente haga clic para saltar a la posición de js
1.2 Buscar por buscar todos los archivos
Es posible que algunos botones del sitio web no estén vinculados al monitoreo de eventos de js, entonces, en este momento, puede encontrar la ubicación de js buscando palabras clave en la solicitud, comolivecell
Haga clic en la opción embellecer la salida
Puede continuar buscando palabras clave
2 Observe el proceso de ejecución de js
Después de encontrar la ubicación de js, podemos averiguar cómo se ejecuta js observando la ubicación de js, y luego podemos simular la ejecución de js a través del programa python, o usar similar para js2py
convertir directamente el código js en un programa python para ejecutar
La forma más fácil de observar la ejecución de js es agregar puntos de interrupción
Cómo agregar puntos de interrupción: haga clic en el número de línea a la izquierda para agregar, y todos los puntos de interrupción existentes aparecerán en los puntos de interrupción correspondientes de la derecha
Después de agregar un punto de interrupción, continúe haciendo clic e inicie sesión. Cada vez que el programa se detiene en la posición del punto de interrupción, si hay una variable en la línea, el resultado de la variable se mostrará en Scoope
En la esquina superior derecha de la figura anterior, hay tres funciones 1, 2, 3, que indican respectivamente:
-1: continuar la ejecución hasta el siguiente punto de interrupción
-2: ingresar la función llamada
-3: saltar fuera de la función llamada
3 Uso de js2py
Después de saber cómo js genera los datos que queremos, necesitamos usar el programa para obtener los resultados después de la ejecución de js
3.1 Introducción a js2py
js2py es una herramienta de traducción de js y un intérprete de js implementado a través de python puro . Código fuente y ejemplos en github
3.2 ideas de implementación de js
El modo de ejecución de js se divide aproximadamente en dos tipos:
- Después de comprender el contenido y la secuencia de ejecución de js, complete el proceso de ejecución de js a través de python y obtenga el resultado
- Después de comprender el contenido de js y el orden de ejecución, use un módulo similar a js2py para ejecutar el código js y obtener el resultado
Pero cuando usamos programas de Python para implementar la ejecución de js, cada paso de js que necesita ser observado es muy problemático, por lo que con mayor frecuencia elegiremos usar módulos similares a js2py para ejecutar js, y luego usaremos js2py para implementar Renren.com Obtención de parámetros de inicio de sesión
3.3 Implementación específica
Busque el código js de inicio de sesión
formSubmit: function() {
var e, t = {
};
$(".login").addEventListener("click", function() {
t.phoneNum = $(".phonenum").value,
t.password = $(".password").value,
e = loginValidate(t),
t.c1 = c1 || 0,
e.flag ? ajaxFunc("get", "http://activity.renren.com/livecell/rKey", "", function(e) {
var n = JSON.parse(e).data;
if (0 == n.code) {
t.password = t.password.split("").reverse().join(""),
setMaxDigits(130);
var o = new RSAKeyPair(n.e,"",n.n)
, r = encryptedString(o, t.password);
t.password = r,
t.rKey = n.rkey
} else
toast("公钥获取失败"),
t.rKey = "";
ajaxFunc("post", "http://activity.renren.com/livecell/ajax/clog", t, function(e) {
var e = JSON.parse(e).logInfo;
0 == e.code ? location.href = localStorage.getItem("url") || "" : toast(e.msg || "登录出错")
})
}) : toast(e.msg)
})
}
Por el código sabemos:
- Necesitamos iniciar sesión para cifrar la contraseña y obtener el valor del campo rkey
- El valor del campo rkey se puede obtener enviando directamente la solicitud rkey request
- Primero se invierte la contraseña y luego se encripta con RSA. El código js es muy complicado. Esperamos lograr esto ejecutando js en python
Ideas de implementación:
-
Utilice la sesión para enviar rKey para obtener la información necesaria para iniciar sesión
- url: http://activity.renren.com/livecell/rKey
- Método: obtener
-
Cifre la contraseña en base a la información obtenida
2.1 Prepare el nombre de usuario y la contraseña2.2 Utilice js2py para generar el entorno de ejecución de js: context
2.3 Copie el contenido usado en el archivo js a este proyecto
2.4 Leer el contenido de los archivos js y usar el contexto para ejecutarlos
2.5 Agregar los datos necesarios al entorno de contexto
2.6 Usar contexto para ejecutar la cadena js de contraseña cifrada
2.7 Obtener información de contraseña cifrada a través del contexto
-
Utilice la sesión para enviar una solicitud de inicio de sesión
-
URL: http://activity.renren.com/livecell/ajax/clog
-
Método de solicitud: POST
-
datos:
phoneNum: xxxxxxx password: (加密后生产的) c1: 0 rKey: rkey请求获取的
-
Código específico
Necesita descargar varios archivos js al local de antemano:
BigInt.js
RSA.js
Barrett.js
import requests
import json
import js2py
# - 实现思路:
# - 使用session发送rKey获取登录需要信息
# - url: http://activity.renren.com/livecell/rKey
# - 方法: get
# 获取session对象
session = requests.session()
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Content-Type":"application/x-www-form-urlencoded"
}
# 设置session的请求头信息
session.headers = headers
response = session.get("http://activity.renren.com/livecell/rKey")
# print(response.content.decode())
n = json.loads(response.content)['data']
# - 根据获取信息对密码进行加密
# - 准备用户名和密码
phoneNum = "131..."
password = "****"
# - 使用js2py生成js的执行环境:context
context = js2py.EvalJs()
# - 拷贝使用到js文件的内容到本项目中
# - 读取js文件的内容,使用context来执行它们
with open("BigInt.js", 'r', encoding='utf8') as f:
context.execute(f.read())
with open("RSA.js", 'r', encoding='utf8') as f:
context.execute(f.read())
with open("Barrett.js", 'r', encoding='utf8') as f:
context.execute(f.read())
# - 向context环境中添加需要数据
context.t = {
'password': password}
context.n = n
# - 执行加密密码的js字符
js = '''
t.password = t.password.split("").reverse().join(""),
setMaxDigits(130);
var o = new RSAKeyPair(n.e,"",n.n)
, r = encryptedString(o, t.password);
'''
context.execute(js)
# - 通过context获取加密后密码信息
# print(context.r)
password = context.r
# - 使用session发送登录请求
# - URL: http://activity.renren.com/livecell/ajax/clog
# - 请求方法: POST
# - 数据:
# - phoneNum: 15565280933
# - password: (加密后生产的)
# - c1: 0
# - rKey: rkey请求获取的
data = {
'phoneNum': '131....',
'password': password,
'c1':0,
'rKey':n['rkey']
}
# print(session.headers)
response = session.post("http://activity.renren.com/livecell/ajax/clog", data=data)
print(response.content.decode())
# 访问登录的资源
response = session.get("http://activity.renren.com/home#profile")
print(response.content.decode())
resumen
- Js se pueden determinar observando el evento vinculante del elemento en chrome
- La ubicación de js se puede determinar buscando palabras clave en todos los archivos de búsqueda en Chrome
- Observe que el proceso de generación de datos de js se puede observar agregando puntos de interrupción
- Uso de js2py
- Necesito preparar contenido js
- Generar entorno de ejecución js
- Ejecute la cadena js en el entorno de ejecución, pase los datos y obtenga el resultado
Este es el final, si te ayuda, bienvenido a gustar y seguir, tus me gusta son muy importantes para mí