js逆向-JS加密破解

一、常见五种js加密手段

(一)加密位置:

1.Request Payload 加密

2.Request Headers 加密

3.Request URL params 参数加密

4.Response Data 数据加密

5.JS代码混淆加密

(二)加密算法

base64 编码

哈希算法:md5,SHA

对称加密:AES

非对称加密:RSA

二、Python Js2Py库运行JS代码

1.index.js文件中书写一段js代码

var getCode = function(str){
    prefix = "C13L02"
    timestamp = Math.floor(Date.now())
    return prefix + timestamp + str
}

2.终端安装js2py:pip install js2py

3.创建py文件C13L03.py

import js2py

jsExec = js2py.EvalJs()
with open('./C13L03/index.js', "r") as f:
    jsExec.execute(f.read())
    print(jsExec.getCode("abc"))

    # C13L02 1679589330373 abc
    # C13L02 1679589342156 abc

三、JS逆向一:Js2py 破解基础JS加密

(一)通过书写爬虫代码和网页响应可知,请求头参数中红框内的参数是必须要添加的,并且此参数是可变的,故采用以下操作。

(二)两种方法

1.按住CTRL+SHIFT+F进行全局搜索:sign(参数的名称),之后找出现sign的地方

2.加断点:将此链接Request URL复制到Sources中的XHR断点中,之后刷新。在call stack中往回找到需要的函数位置

(三)定位函数位置后,在文档中搜索:CTRL+F。搜索"mySign"

js逆向-JS加密破解_第1张图片

(四)创建C13L04.js文件将上述js代码复制,并创建函数

var getSign = function() {
    var prefix = "C13L04"
    var timestamp = Math.floor(Date.now())
    var rand = Math.floor((Math.random()*500)+100)
    var mySign = prefix + "-" +timestamp + "-" +  rand
    return mySign
}

(五)创建py文件,调用上述函数重新请求网页

import requests
import js2py

jsExec = js2py.EvalJs()
with open('./C13L04/C13L04.js', 'r') as f:
    jsExec.execute(f.read())
mySign = jsExec.getSign()
print(mySign)
url = "http://127.0.0.1:5000/api/C13L04"
headers = {
    "User-Agent":"xxxxxxx",
    "sign": mySign
}
res = requests.get(url, headers=headers)
print(res.json())

四、JS逆向二:Python 重构 JS加密流程

创建py文件,重构上述JS文件

import requests
import time
import random


prefix = "C13L04"
timestamp = int(time.time() * 1000)
rand = random.randint(100, 599)
mySign = prefix + "-" + str(timestamp) + "-" +  str(rand)
print(mySign)

"""
# JS生成的时间戳为1679650163011,time.time()函数生成为1679650177.857263
var getSign = function() {
    var prefix = "C13L04"
    var timestamp = Math.floor(Date.now())
    var rand = Math.floor((Math.random()*500)+100)
    var mySign = prefix + "-" +timestamp + "-" +  rand
    return mySign
}
"""

url = "http://127.0.0.1:5000/api/C13L04"
headers = {
    "User-Agent":"xxxxxxx",
    "sign": mySign
}
res = requests.get(url, headers=headers)
print(res.json())

五、JS逆向三:重构JS Base64 编码问题,破解JS Base64加密

(一)Base64编码原理

The Base64 Alphabet:

js逆向-JS加密破解_第2张图片

import base64

s1 = "中"
s1_binary = s1.encode("utf-8")
# b'\xe4\xb8\xad'
s1_base64 = base64.b64encode(s1_binary).decode("utf-8")
print(s1_base64)
# 现在为string类型:5Lit
s2 = base64.b64decode(s1_base64).decode("utf-8")
print(s2)
# "中"
s3 = base64.b64decode(s1_base64)
print(s3)
# b'\xe4\xb8\xad'


# b'\xe4\xb8\xad'
# 14 4 11 8  10 13
# 1110 0100 1011 1000 1010 1101
# 111001 001011 100010 101101
print(0b111001, 0b001011, 0b100010, 0b101101)
# 57 11 34 45
# 5 L i t

(二)破解JS Base64加密

上图位置的参数为加密的数据,可变参数。全局搜索“sign"

js逆向-JS加密破解_第3张图片

全局搜索"encode"。

第一种方法(最简单)是用Js2py方法,但这种方法运行效率低一些

js逆向-JS加密破解_第4张图片

第一种方法是用python复写。通过上述代码猜测是base64加密,通过验证确实是base64加密

js逆向-JS加密破解_第5张图片

import requests
import time
import base64

ts = int(time.time()*1000)
msg = "C13L08" + str(ts)
sign = base64.b64encode(msg.encode()).decode()
print(sign)

url = "http://127.0.0.1:5000/api/C13L08"
headers = {
    "User-Agent":"xxxxxxx",
    "Referer": "http://127.0.0.1:5000/api/C13L08",
    "sign": mySign
}
data = {
    "ts": ts,
    "sign":sign
}
res = requests.get(url, headers=headers, data=data)
print(res.json())

六、JS逆向四:破解MD5和SHA哈希加密

(一)Hash哈希算法原理

# 将数据通过算法生成固定长度的字符串
# 不可逆
# 相同数据生成的字符串一定是相同的, 不同的数据生成的字符串一定不同
# MD5, SHA

import hashlib

s1 = "hello"
s1_md5 = hashlib.md5(s1.encode()).hexdigest()
print(s1_md5)
s1_sha256 = hashlib.sha256(s1.encode()).hexdigest()
print(s1_sha256)

(二)破解Md5和SHA哈希加密

此位置为加密位置参数

js逆向-JS加密破解_第6张图片

全局搜索”scode"找到加密的函数,猜测为MD5加密和SHA256加密方式,并用在线工具进行验证

js逆向-JS加密破解_第7张图片

js逆向-JS加密破解_第8张图片

import requests
import time
import hashlib

ts = int(time.time()*1000)
txt = str(ts) + "ABC"
mcode = hashlib.md5(txt.encode()).hexdigest()
scode = hashlib.sha256(txt.encode()).hexdigest()

url = "http://127.0.0.1:5000/api/C13L11"
headers = {
    "User-Agent":"xxxxxxx",
    "Referer": "http://127.0.0.1:5000/api/C13L11",
}
data = {
    "ts": ts,
    "mcode": mcode,
    "scode": scode
}
res = requests.get(url, headers=headers, data=data)
print(res.json())

七、实战:千千音乐-JS逆向破解音乐mp3参数哈希加密

以下为加密参数位置

js逆向-JS加密破解_第9张图片

添加xhr断点,发现函数位置

js逆向-JS加密破解_第10张图片

进入createSign

js逆向-JS加密破解_第11张图片

import requests
import time
import hashlib

secret = "0b50b02fd0d73a9c4c8c3a781c30845f"
appid = "16073360"
TSID = "T10063717602"
ts = int(time.time())
r = "TSID=T10063717602&appid=16073360×tamp={}".format(ts) + secret
sign = hashlib.md5(r.encode()).hexdigest()


url = "https://music.91q.com/v1/song/tracklink?sign={}&appid={}&TSID={}×tamp={}".format(sign, appid, TSID, ts)
headers = {
    "User-Agent": "xxxxxxxxxxxxxxx",
    "Referer": "https://music.91q.com/player"
}
res = requests.get(url, headers=headers)
print(res.json())

你可能感兴趣的:(爬虫,javascript,开发语言,python)