js逆向之——百度翻譯介面

python小李發表於2024-06-24

逆向目標:

主頁:https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh&ext_channel=Aldtype#auto/zh/

介面URL:https://fanyi.baidu.com/v2transapi?from=en&to=zh

介面引數:ts、token、sign

逆向過程:

  • 1.進入網址
    
  • 2.F12開啟開發者工具,點選網路
    
  • 3.輸入翻譯內容、點選立即翻譯
    
  • 4.因為百度翻譯為區域性重新整理,是Ajax請求,我們點選Fetch/XHR請求,找尋翻譯的介面,最終我們發現介面為v2transapi這個名稱
    
  • 5.發現介面為post請求,觀察表單資料:
    from:en 這個是區分翻譯的是中文還是英文
    to:zh 這個是區分翻譯的是中文還是英文
    query: 這個是要翻譯的內容
    transtype:realtime 這個是固定格式
    simple_means_flag:3 這個是固定格式
    sign: 這個是加密的內容
    token: 這個是加密的內容
    domain:common 這個是固定格式
    ts: 這是加密的內容

獲取引數的加密

  • token 由於token的值每次在一定時間內請求是固定的,所以我們嘗試在網頁原始碼裡搜尋一下token的值

    發現token的值在網頁原始碼裡面,我們只要獲得網頁原始碼裡面的token值就可以,但是token值在script標籤裡,我們點選網頁,使用正則獲得token的值,或者直接複製,將token的值寫死。這裡我使用的是selenium自動化獲取token的值,但不知為什麼,每次token的值都會發生變化,導致請求翻譯介面失敗。最後我將token的值寫死了才請求成功。
  • sign引數加密的獲取過程
    全域性搜尋(ctrl+shift+f)

    使用全域性搜尋():搜尋sign:這個引數 如圖下

    在每個資料夾裡進行搜尋sign: 分別打上斷點 重新發起請求,觀察是否斷住
    最終找到的加密位置如下

    透過觀察sign是由b函式里傳入一個引數e生成的

    透過控制檯列印,發現e的就是我們要翻譯的內容

    接下來我們分析b函式,滑鼠選中b函式,我們直接進去b函式里觀察b函式的方法,透過移除第一次打的斷點,我們將b函式的方法打住斷點,重新發起請求,如圖

    透過控制檯列印發現b函式里面傳入的是我們要翻譯的內容

    分析b函式的方法,我們發現返回值就是sign值,如圖所示
  • 接下來就是扣程式碼環節:

    發現r未定義,我們該怎麼做呢?回到原始碼處,在報錯的地方打斷點,分析r的變化

    第一的r的值

    第二次r的值

    我們發現r的值不會發生變化,所以我們可以在js程式碼裡直接定義r的值
    再次執行,發現n沒有被定義

    老方法:直接去網頁原始碼裡找到報錯地方,打斷點進行分析

    我們發現n是一個方法,直接跳轉,將n函式全部扣下來,在js執行,發現沒有報錯,結果也出來了!

    到這裡,我們的sign引數的加密過程也已經還原了!
  • 最後一個引數是ts。有經驗的人一眼發現,ts就是13位時間戳,所以我們直接模擬請求的時間,直接開始向目標URL發起請求

    到此為止,我們在python中呼叫js檔案需要使用execjs模組,具體呼叫方法我已經寫出來了,可以自行觀看。
    返回的json格式由於我的懶惰,我直接使用jsonpath進行提取。

    最後的結果已經出來了。當然,我們的程式還不是特別完整,我們還可以繼續完善。
    判斷是否輸入的是英文還是中文,使用編碼判斷,如果長度為1:輸入的英文;如果長度為3: 輸入的中文

相關文章