Análisis JS

Análisis JS

objetivo de aprendizaje:
  1. Comprender el método de posicionamiento de js
  2. Comprender el método de agregar puntos de interrupción para observar el proceso de ejecución de js
  3. 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 js2pyconvertir 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:

  1. 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
  2. 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:
  1. Necesitamos iniciar sesión para cifrar la contraseña y obtener el valor del campo rkey
  2. El valor del campo rkey se puede obtener enviando directamente la solicitud rkey request
  3. 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:
  1. 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
  2. Cifre la contraseña en base a la información obtenida
    2.1 Prepare el nombre de usuario y la contraseña

    2.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

  3. 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

  1. Js se pueden determinar observando el evento vinculante del elemento en chrome
  2. La ubicación de js se puede determinar buscando palabras clave en todos los archivos de búsqueda en Chrome
  3. Observe que el proceso de generación de datos de js se puede observar agregando puntos de interrupción
  4. 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í

Supongo que te gusta

Origin blog.csdn.net/qq_45176548/article/details/111991770
Recomendado
Clasificación