一、逆向目標
- 目標:獲取pdd商品列表接口數據
- 網址:aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbS9ob21lL2hvbWUv
二、逆向步驟
2.1 anti_content 入口定位
>1 找到需加密參數
>2 全局搜索定位
這里只出來一個結果,很明顯,點進去。
>3 分析出加密點
分析出Object(x.a)()是個Promise對象可在控制臺進行測試得出加密位置
重新打上斷點刷新接口
>4?進入源代碼
繼續進入函數?r.messagePackSync
根據函數返回值情況 結合控制臺分析 進入?ue
可知 只要 ue函數能夠被正常調用 參數anti_content 就可以逆向出來
2.2 webpack模塊加載加補環境
復制粘貼代碼分析,需要調用的 ue函數在雙層webpack模塊自執行函數里面
可知 需要找到外層大的webpack加載器調用fbeZ,調用之后,可以正常執行箭頭所指 i ,i 正常執行之后,i 中第二層webpack加載器調用?function(e, n, r) ,最終可拿?ue函數所執行需要的結果參數 anti_content。
> 全局搜索fbeZ
雖然出來很多個值但通過網頁刷新與斷點調試結合可知箭頭所指正確位置 進入 調用js文件?很容易分析出調度器標準邏輯。
>1 新建 _4loader.js代碼文件 保存下面箭頭js文件
>2 新建 _2mod1.js代碼文件 保存下面箭頭js文件
>3?新建 _3mod2.js代碼文件 保存下面箭頭js文件
>4 新建_1env.js代碼文件
分析這個網頁需要如下環境代碼
window = global;delete global;
delete Buffer;document = {addEventListener: function () {},cookie: '_nano_fp=XpmyX0Eyn0EJXpTon9_ryk2GUF8jzVuDLOQX7_CH; api_uid=U84pHWhY3vxUeUAesdvjAg=='
}screen = {availWidth: 1707,availHeight: 1019
}navigator = {appCodeName: "Mozilla",appName: "Netscape",appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",webdriver: false,userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
}history = {back: function () {}}location = {"ancestorOrigins": {},"href": "https://www.pinduoduo.com/home/home/","origin": "https://www.pinduoduo.com","protocol": "https:","host": "www.pinduoduo.com","hostname": "www.pinduoduo.com","port": "","pathname": "/home/home/","search": "","hash": ""
}
>5 以上4個文件創建完畢 以下代碼執行才不會出錯
加上這行代碼
在??_2mod1.js?加上兩行代碼
require("./_1env")
require("./_2mod1")
require("./_3mod2")
require("./_4loader")function get_anti_content() {// 初始化window.loader("fbeZ")// 更新操作 分析上圖最后一處函數需要加上這行代碼 它在網頁有執行復制粘貼至本地沒有執行// 所以加上下面這行代碼解決window.se['updateServerTime'](new Date().getTime())// 調用uereturn window.ue()
}console.log(get_anti_content())
輸出結果:
2.3 python代碼
import requests
import execjsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',}anti_content = execjs.compile(open("_pdd.js").read()).call("get_anti_content")
print(anti_content)params = {'tf_id': 'TFRQ0v00000Y_13400','page': '1','size': '39',# 'anti_content': '0aqAfa5e-wCEXxjdXUSt_USOOG7GxNhyxhPqgHKqTmZhApN7QjX3nad4X6CtkSyqzgyrjij0jUpPoX5T8X09qnpdYH0danq7dnqdoXqXYO0TLl92SAPbdeGM2XIXxcGDDpZthfiNLHxm8P_id8y02TYoSB-bbm7t3Zst2CkL2FEto9sqgxHs_IXp0Tv69HtmFG0dblNXYhYpE8niEqns0_NQdfNW7Tdm5tqda7mdblqNqdvM0ltT9Jx2tSo9gBsJX_YatfX1fEB5EZ48XSP9iWtQ9n7IJZ4UQoNx3ZZx-o5iy98ZLx1HsP763394QnJeJNlSFvld4PTTHDfRCHUTZyX45q4XxtnxxK4dYXudJOpxIPmYjyOvqfcEboRR3zA2wmE9QYDuFvU2o4A3','anti_content': anti_content
}res = requests.get('對應api url', params=params, headers=headers)print(res.text)
2.4 生成結果
成功。