这里是它的网址,使用了base64,有兴趣自行解密
aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vcmFua19jLw==
找到它的搜索部分,我们查看一下搜索的内容,这些就是我们需要的数据,然后我点击第二页看看,发现了一个奇怪的接口,我们尝试阻止这个xhr请求,果然,页面无法加载数据了。
基本上定位到,这个部分就是我们需要的数据。它的b是加密的,kiv不知道是什么,返回内容也是加密的,我们加入一个xhr断点,然后继续进行操作。
看到了原始的数据,然后一步步向上找,最后发现了它的一个位置情况。
它是异步传入参数的,然后再下面的u.request打上断点,一步步往上,最后看到了生成的位置
这里的是
t = (0,
M.mA)(n, {
iv: s
}).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~")));
然后下断点,进去M.mA函数找到了关键的加密位置
非常典型的加密,然后我们前往u函数一看
是cbc加密,pad是pkcs7,key是上面的那个,它是一个固定的内容,其中e就是这一坨
G$$QawckGfaLB97r
iv是自己的一个随机函数,生成一个16字符的随机数,还是比较简单的。
我们开始写代码,复制这个去curl,然后转换成为python,然后进行加密,就成功了。
它的内容也是加密的,我们可以使用JSON.parse,来进行解密,但是它初始化的时候有检验,并且把json.parse给覆盖掉了,我们可以重新打开的时候来看这个JSON.parse,然后植入js hook代码去hook json.parse,定位到相关位置以后,我们发现它也是cbc解密,最后成功得到项目内容。
给出加密解密的代码
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import json
import random
import base64
def getBAndIv(data):
text = json.dumps(data)
# 生成与JavaScript相同方式的IV
def get_iv(e=16):
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
return ''.join(random.choice(chars) for _ in range(e))
iv = get_iv()
key = "G$$QawckGfaLB97r"
# 将IV转换为字节串,用于加密
iv_bytes = iv.encode()
# 使用CBC模式进行AES加密
cipher = AES.new(key.encode(), AES.MODE_CBC, iv_bytes)
encrypted_bytes = cipher.encrypt(pad(text.encode(), AES.block_size))
# 加密后的文本,按照JavaScript的格式化规则进行替换
encrypted_text = base64.b64encode(encrypted_bytes).decode()
encrypted_text = encrypted_text.replace('/', '_').replace('+', '-').replace('=', '~')
return {
"b": encrypted_text,
"kiv": iv
}
def getEncryptedText(text, iv):
text = text.replace('_', '/').replace('-', '+').replace('~', '=')
return getResponse(text, iv)
def getResponse(text, iv: str):
# 你的加密密文,假设它是Base64编码的
encrypted_text_base64 = text
# 转换成bytes
encrypted_text = base64.b64decode(encrypted_text_base64)
key = "G$$QawckGfaLB97r"
# 创建一个AES对象
cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
# 解密并去除PKCS7填充
decrypted_text = unpad(cipher.decrypt(encrypted_text), AES.block_size)
# 转换成字符串形式
decrypted_text_str = decrypted_text.decode('utf-8')
return json.loads(decrypted_text_str)
# print(getEncryptedText(base["b"], base["kiv"]))
至此就成功了。