JS逆向:斷點調試分析 JS 代碼破解有道詞典加密參數

1. 前言

  • 本篇文章,旨在破解有道翻譯 http://fanyi.youdao.com/ 部分請求參數的 JS 加密方法,從而構造請求訪問站點;

2. 分析

  • 輸入字符 “蘋果”,得到翻譯的結果;
  • 右鍵查看網頁源碼,ctrl + F 彈出搜索框,在網頁源碼中搜索 蘋果,發現網頁源碼中并沒有 蘋果
  • 搜索 apple 同樣也不能找到;
  • 這說明 蘋果apple 這些輸入輸出的字符串,并不是在網頁上的靜態內容,而是動態加載的;
image.png

3. 抓包

  • 右鍵檢查網頁,點擊 Network,調出網頁抓包工具;
  • 在網頁上重新點擊 翻譯 按鈕,在抓到的數據包中找到含有輸出信息的包;
image.png
  • 在網頁輸入框重新輸入 西瓜 并再次抓包,分析數據包的參數,發現參數有如下規律:
    -- i ------------------------------------------------------------------------ 輸入的字符串,例如:西瓜、蘋果;
    -- from: AUTO---------------------------------------------------------- 不變參數;
    -- to: AUTO------------------------------------------------------------- 不變參數;
    -- smartresult: dict --------------------------------------------------- 不變參數;
    -- client: fanyideskweb --------------------------------------------- 不變參數;
    -- salt: 15929685900475 ------------------------------------------ 未知參數
    -- sign: e8aeb3b7429d2198356378746cf291d1 ------------ 未知參數
    -- ts: 1592968590047 ---------------------------------------------- 未知參數
    -- bv: 02a6ad4308a3443b3732d855273259bf -------------- 未知參數,多次抓包發現此參數值固定,換瀏覽器后變化;
    -- doctype: json ------------------------------------------------------ 不變參數;
    -- version: 2.1 -------------------------------------------------------- 不變參數;
    -- keyfrom: fanyi.web ---------------------------------------------- 不變參數;
    -- action: FY_BY_CLICKBUTTION ---------------------------- 不變參數;
image.png

4. 搜索參數,尋找代碼

  • ctrl + shift + F 打開全局搜索,輸入 sign 搜索,按下圖所示步驟尋找代碼;
image.png
  • 說明:
    -- 在 4、5 兩步搜索的過程中,需要結合上下文仔細分析代碼內容;
    -- 很多情況下,目標代碼是以 代碼塊 的形式,集中在一起 出現的;
    -- 一個文件中會有多處代碼有相同關鍵字,對于這類相同的關鍵字,可以多次搜索不同的關鍵字,對比分析不同的代碼塊中,關鍵字的區別,推測可能性最大的代碼塊;

5. 下斷調試

  • 在目標代碼位置下斷點;
  • 在網頁重新點擊 翻譯 按鈕;
    -- 注意:此處動作不可以用 刷新 替代,很多時候 刷新 并不能完成請求的再次發送;
  • 參考下圖,在斷點分析代碼,
image.png
  • 通過分析,得到下面的結果:
    -- i,即代碼中的 e,表示輸入的字符串;
    -- bv,即代碼中的 t,是對瀏覽器版本字符串(注意:需要剔除 Mozilla/ 字符串!!!)的 md5 處理;
    -- ts,即代碼中的 r,是 13 位時間戳;
    -- salt,即代碼中的 i,是 r 值尾部加上一個 0~9 隨機整數;
    -- sign,是對 "fanyideskweb" + e + i + "mmbP%A-r6U3Nw(n]BjuEU" 字符串的 md5 處理;

6. 代碼實現

import requests
import hashlib
import time
import random


def youdao(keyword):
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    headers = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Content-Length": "251",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Cookie": "OUTFOX_SEARCH_USER_ID=794950846@10.169.0.82; JSESSIONID=aaatjBaH10pyw8bRkOHlx; OUTFOX_SEARCH_USER_ID_NCOO=947970453.2625253; ___rl__test__cookies=1592932488300",
        "Host": "fanyi.youdao.com",
        "Origin": "http://fanyi.youdao.com",
        "Referer": "http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest"
    }

    bv = hashlib.md5('5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'.encode("utf-8")).hexdigest()
    print(bv)
    ts = str(int(round(time.time() * 1000)))
    salt = ts + str(random.randint(0, 9))
    sign = hashlib.md5("fanyideskweb{}{}mmbP%A-r6U3Nw(n]BjuEU".format(keyword, salt).encode("utf-8")).hexdigest()

    form_data = {
        "i": keyword,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": salt,
        "sign": sign,
        "ts": ts,
        "bv": bv,
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTlME"
    }
    print(form_data)
    response = requests.post(url=url, headers=headers, data=form_data).text

    return response


def main():
    keyword = '西瓜'
    response = youdao(keyword=keyword)
    print(response)


if __name__ == '__main__':
    main()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370