十七题是一个很经典的字体加密案例,很适合新手入门~
目录列表
- 过程分析
- 代码实现
过程分析
打开开发者工具直接看请求,发现它请求的没有加密参数,以为万事大吉的你迫不及待的点击了响应,然后就会发现依托。。。
返回的数据中字体是加密的,但是浏览器却能正常显示,说明通过JS代码对响应数据进行了解密操作,所以就要找它解密的逻辑咯~
所以直接跟栈分析,发现它的启动器很少,就两个。。
所以就可以开始断点分析了,可以跟到一个decryptFontNumber
方法中,解密的逻辑就在这里~
可以看到是通过取了FONT_DECRYPT_MAP
这个对象中的值,对密文的值进行了一个映射,从而实现了解密的逻辑,所以我们只需要拿到这个FONT_DECRYPT_MAP
的值就好了。。。
在控制台输出一下,后面就直接用python
字典来模拟它映射的逻辑就好了。
OK,逆向结束。。。
代码实现
"""
-*- coding: utf-8 -*-
@File : .py
@author : @鲨鱼爱兜兜
@Time : 2025/04/06 20:51
"""
import requests
def decrypt(arr: list):
"""
My decrypt
:param arr:
:return:
"""
FONT_DECRYPT_MAP = {
'ꙮ': '0',
'ઊ': '1',
'સ': '2',
'ત': '3',
'ধ': '4',
'ન': '5',
'પ': '6',
'ફ': '7',
'બ': '8',
'ભ': '9'
}
for i in range(len(arr)):
arr[i] = ''.join([FONT_DECRYPT_MAP.get(char, char) for char in arr[i]])
return [int(_) for _ in arr]
cookies = {
'sessionid': '你的值',
'Hm_lvt_b5d072258d61ab3cd6a9d485aac7f183': '1743870511,1743871379,1743932867,1743933915',
'HMACCOUNT': '你的值',
'Hm_lpvt_b5d072258d61ab3cd6a9d485aac7f183': '1743942809',
}
headers = {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
'cache-control': 'no-cache',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://stu.tulingpyton.cn/problem-detail/17/',
'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
}
s = 0
for page in range(1, 21):
params = {
'page': f'{page}'
}
response = requests.get('https://stu.tulingpyton.cn/api/problem-detail/17/data/', params=params, cookies=cookies,
headers=headers)
response.raise_for_status()
response.encoding = 'utf-8'
print(response.json())
s += sum(decrypt(response.json()['current_array']))
print(s)
这题还是相对其他题目比较简单的~
第十七题,秒了~[doge]
@鲨鱼爱兜兜