js的逆向解析


過程:

      知道如何尋找登錄的接口

      知道如何確定js的位置

      知道如何觀察js的執行過程

      知道js的執行方法

1. 確定網站的登錄的接口
登錄的form表單中action對應的url地址
通過抓包可以發現,在這個url地址和請求體中均有參數,切換到手機版,參數的個數少,分析js
2. 確定js的位置
通過點擊按鈕,然后點擊Event Listener,部分網站可以找到綁定的事件,對應的,只需要點擊即可跳轉到js的位置
部分網站的按鈕可能並沒有綁定js事件監聽,那么這個時候可以通過搜索請求中的關鍵字來找到js的位置,比如livecell
3. 觀察js的執行過程
找到js的位置之后,我們可以來通過觀察js的位置,找到js具體在如何執行,后續我們可以通過python程序來模擬js的執行,或者是使用類似js2py直接把js代碼轉化為python程序去執行
觀察js的執行過程最簡單的方式是添加斷點
添加斷點之后繼續點擊登錄,每次程序在斷點位置都會停止,通過如果該行有變量產生,都會把變量的結果展示在Scoope中
4. 執行js
觀察代碼知曉需要哪些參數,比如:

我們要登錄需要對密碼進行加密和獲取rkey字段的值
rkey字段的值我們直接發送請求rkey請求就可以獲得
密碼是先反轉然后使用RSA進行加密, js代碼很復雜, 我們希望能通過在python中執行js來實現
實現思路:

使用session發送rKey獲取登錄需要信息
根據獲取信息對密碼進行加密
使用session發送登錄請求

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

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM