目錄列表
- 過程分析
- headers頭部`M`參數分析
- 載荷`x`參數分析
- 響應數據解密分析
- 代碼實現
一進來還是一個無限debugger
,前面有講怎么過,這里直接過掉~
老規矩,養成習慣,先看請求頭里有沒有加密參數發現好像是有個`M`,它是個32位的,逆的多了就有反應了[doge](可能是MD5)
再看載荷參數,好,也有一個x
。。
然后再看響應結果,還是個密文,好!直接放棄。。。[doge]
那當然不能放棄了[doge],來吧開干~
過程分析
萬事開頭難,那就從頭(headers
)開始[doge]~
headers頭部M
參數分析
老規矩,在發包的位置打個斷點,跟棧分析
然后跟著跟著就發現它是依托。。。
使用解混淆工具,對混淆的代碼進行解混淆,貼到本地node
環境中,然后可以看到設置了axios
的請求攔截器和響應攔截器。(頭部的M
參數,載荷中的x
參數和返回密文解密的生成邏輯都能在這個方法中看到)
邏輯大概就是:字符串xialuo
和時間戳的拼接,傳給了前面window.eeee
方法進行參數加密,最后得到M
的值。由于它結果是一個32位的字母數字的組合,那么猜測是md5
。
OK破案了,
M
的加密方式就是標準的md5
加密算法。
載荷x
參數分析
還是剛剛參數M
生成的位置
可以看到是一個SHA256
的哈希加密算法,可以再往上找一找這個dd.a
是什么東西
然后就會發現是CryptoJS
標準庫。
去網頁驗證一下看看是不是標準的哈希算法
OK破案了,就是標準的SHA256
加密算法,直接調用標準算法庫中加密方法即可。
響應數據解密分析
還是之前定位到的地方,可以看到axios
響應攔截器的邏輯,是把相應的密文丟給了xxxxoooo
方法進行了解密。
然后進入這個解密方法就能看到很清晰的AES
解密邏輯,同時key
和``iv就定義在方法的上面。
然后可以再看一下這個dd.a
是個什么東西,最后發現它就是CryptoJS
這個標準庫。
OK逆向結束~
代碼實現
選擇直接用python
復現JS
的加密解密邏輯
"""
-*- coding: utf-8 -*-
@File : .py
@author : @鯊魚愛兜兜
@Time : 2025/04/05 21:47
"""from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import requests
import binascii
from hashlib import md5, sha256
import json
import timedef myDecrypt(encrypted_hex):"""My Decrypt Func:param encrypted_hex::return:"""key = b'xxxxxxxxoooooooo'iv = b'0123456789ABCDEF'ciphertext = binascii.unhexlify(encrypted_hex)cipher = AES.new(key, AES.MODE_CBC, iv)decrypted = cipher.decrypt(ciphertext)plaintext = unpad(decrypted, AES.block_size)return plaintext.decode()cookies = {'Hm_lvt_b5d072258d61ab3cd6a9d485aac7f183': '1743857254','HMACCOUNT': '你的值','sessionid': 'gaq8bymph3affd623emqto7gtxor6lj4','v': '你的值','Hm_lpvt_b5d072258d61ab3cd6a9d485aac7f183': '1743860809',
}
s = 0
for page in range(1, 21):ts = int(time.time() * 1000)M = md5(f'xialuo{ts}'.encode()).hexdigest()headers = {'accept': 'application/json, text/javascript, */*; q=0.01','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8','cache-control': 'no-cache','m': M,'pragma': 'no-cache','priority': 'u=1, i','referer': 'https://stu.tulingpyton.cn/problem-detail/7/','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','ts': f'{ts}','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','x-requested-with': 'XMLHttpRequest',}params = {'page': f'{page}','x': sha256(f'{M}xxoo'.encode()).hexdigest(),}response = requests.get('https://stu.tulingpyton.cn/api/problem-detail/7/data/', params=params, cookies=cookies,headers=headers)response.raise_for_status()response.encoding = 'utf-8'print(response.json())s += sum(json.loads(myDecrypt(response.json()['r']))['current_array'])
print(s)
第七題,勉強秒了~[doge]
@鯊魚愛兜兜