javascript
【JS 逆向百例】cnki 学术翻译 AES 加密分析
關注微信公眾號:K哥爬蟲,QQ交流群:808574309,持續分享爬蟲進階、JS/安卓逆向等技術干貨!
聲明
本文章中所有內容僅供學習交流,抓包內容、敏感網址、數據接口均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關,若有侵權,請聯系我立即刪除!
逆向目標
- 目標:cnki 學術翻譯 AES 加密
- 主頁:aHR0cHM6Ly9kaWN0LmNua2kubmV0L2luZGV4
- 接口:aHR0cHM6Ly9kaWN0LmNua2kubmV0L2Z5enMtZnJvbnQtYXBpL3RyYW5zbGF0ZS9saXRlcmFsdHJhbnNsYXRpb24=
- 逆向參數:Request Payload:words: "kufhG_UJw_k3Sfr3j0BLAA=="
逆向過程
本期逆向素材來源于K哥爬蟲交流群里某位群友的求助,目標是 cnki 學術翻譯,粉絲想實現兩個功能:1、突破英文1000個字符的限制;2、逆向加密過程。
來到翻譯首頁,抓包定位到翻譯接口,可以看到 Request Payload 里,待翻譯文本會被加密處理,如下圖所示:
這里如果直接搜索關鍵字 words,會發現結果非常多,不太好找,注意到 Payload 參數里還有個 translateType,那么就可以直接搜索 translateType,因為這兩個參數一般都是挨著的,當然也可以使用 XHR 斷點的方式來找,只不過麻煩一些,搜索結果都在 app.9fb42bb0.js 里,注意到最后一個結果里有 encrypto,加密的意思,基本上就是加密的地方了:
控制臺打印一下 (0, h.encrypto)(this.inputWord),正是加密結果:
繼續跟進一下 h.encrypto,很明顯的 AES 加密,n = "4e87183cfd3a45fe",n 就是 key,模式 ECB,填充 Pkcs7,最后做了一些字符串的替換處理,如下圖所示:
知道了加密算法,key 等關鍵參數,那么直接引用 crypto-js 模塊來實現就 OK 了,JavaScript 代碼如下:
// 引用 crypto-js 加密模塊 var CryptoJS = require('crypto-js')function s(t) {var n = "4e87183cfd3a45fe"var e = {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}, i = CryptoJS.enc.Utf8.parse(n), s = CryptoJS.AES.encrypt(t, i, e), r = s.toString().replace(/\//g, "_");return r = r.replace(/\+/g, "-"),r }console.log(s("測試"))// kufhG_UJw_k3Sfr3j0BLAA==使用 Python 翻譯的一個小 demo:
# ================================== # --*-- coding: utf-8 --*-- # @Time : 2021-11-05 # @Author : 微信公眾號:K哥爬蟲 # @FileName: cnki.py # @Software: PyCharm # ==================================import execjs import requeststoken_url = "https://dict.cnki.net/fyzs-front-api/getToken" translation_api = "https://dict.cnki.net/fyzs-front-api/translate/literaltranslation" UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"session = requests.session()def get_token():headers = {"User-Agent": UA}response = session.get(url=token_url, headers=headers).json()token = response["data"]return tokendef get_encrypted_word(word):with open('cnki_encrypt.js', 'r', encoding='utf-8') as f:cnki_js = f.read()encrypted_word = execjs.compile(cnki_js).call('s', word)return encrypted_worddef get_translation_result(encrypted_word, token):payload = {"translateType": None,"words": encrypted_word}headers = {"Token": token,"User-Agent": UA}response = session.post(url=translation_api, headers=headers, json=payload).json()result = response["data"]["mResult"]return resultdef main():word = input("請輸入待翻譯字符串: ")token = get_token()encrypted_word = get_encrypted_word(word)result = get_translation_result(encrypted_word, token)print("翻譯結果為: ", result)if __name__ == "__main__":main()粉絲還有一個問題就是字符數限制問題,看能不能突破,實測英文限制1000字符,中文限制500字符,如下圖所示:
這種限制其實大概率不僅僅是前端的限制,服務端應該也是有限制的,我們可以攜帶超過500字符的中文去請求一下,前面的字符是“測試1”,最后三個字符是“測試2”,此時已超過了500個字符,我們看到翻譯結果里并沒有出現 Test 2,所以想要翻譯很多字符串,只能將其分割成幾份來處理了。
總結
以上是生活随笔為你收集整理的【JS 逆向百例】cnki 学术翻译 AES 加密分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 满满印度风!iPhone 14 Pro全
- 下一篇: 手机更新了会变卡?看完恍然大悟