一、常见五种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"
(四)创建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:
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"
全局搜索"encode"。
第一种方法(最简单)是用Js2py方法,但这种方法运行效率低一些
第一种方法是用python复写。通过上述代码猜测是base64加密,通过验证确实是base64加密
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哈希加密
此位置为加密位置参数
全局搜索”scode"找到加密的函数,猜测为MD5加密和SHA256加密方式,并用在线工具进行验证
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参数哈希加密
以下为加密参数位置
添加xhr断点,发现函数位置
进入createSign
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())