13-爬虫之js加密,解密,混淆,逆向破解思路
url:https://www.aqistudy.cn/apinew/aqistudyapi.php
分析思路:
原圖
現(xiàn)圖
1,我們點(diǎn)擊查詢按鈕后發(fā)現(xiàn)抓取到了2個一樣的數(shù)據(jù)包,包含請求url和post的請求方式
2,發(fā)起多次請求發(fā)現(xiàn) 請求參數(shù) d 是動態(tài)加密的數(shù)據(jù)值,我們只要能破解其中一個數(shù)據(jù)包的內(nèi)容剩下的一個也可以同理破解
3,返回的響應(yīng)數(shù)據(jù)就是我們想要捕獲的空氣指標(biāo)數(shù)據(jù)值,我們發(fā)現(xiàn)響應(yīng)數(shù)據(jù)也是一組被加密的密文數(shù)據(jù),我們必須將密文數(shù)據(jù)解密成原文數(shù)據(jù)才可以被我們使用
4,通過類型可以看見發(fā)起的是ajax請求
分析的結(jié)論
請求url Request URL: https://www.aqistudy.cn/apinew/aqistudyapi.php 請求方式 Request Method: POST 動態(tài)變化的參數(shù) d: tdgHOYxwKdDSgYXe+RLPzYCgLvrddahasI5XXklB4gVLYqab+XRPpMD/oSqnJ/aEmFwzVEUhLnPzRy03+X1BIzLvxQKwu4A3YsqR3OemYgNnHqPdBwvJlbxia99YeK+xVtm/KUfxgICnZHiin/ojfqe1ZJXPHKDaOqwKab2iJt6YQRF4WQWYusdfEXhDolRtLCUy8ht8s821u5VxPcU+NezPIcU8U830QPCeWGAkKrHcsmuUaEHoRLJjnqpMnaid8OfacV5HCUeVhK3Uhju9Sr+bGsXveRwJFs5t307AlxFmwOBzCa6T6fmAQK9+1KoOfUz8EtNUEQkMB1LQBarJd9qsFKpe6TnoLFJ9G6xud+YIs8GecqTX4Pf2urDJLQ3LLfmLqMo7H/7LwYcq2BxyJiGqG2Xpp5wdr9L+oCZisZ9yKEBuYIprEM6A9PMUKADaw5ZESt11e9YX/xbkKPbnaw== 返回的加密的響應(yīng)數(shù)據(jù) f9VXvMyFOzW7AzFWZjMa3oW5basBySGVYXbOpPoS6/W7Dh2wAk4bbiAr7xpyn/meJ/Hem3nHWnk4WtHFwrhKIyDSu2SUsVB5a/jusoqnpmDCxqr9YxCavi6qiilWtiVa49+C70wNGkoQqdo5w3hB/g==破解操作
請求得到的數(shù)據(jù)是一組加密數(shù)據(jù),但是web前臺展示的是一組明文數(shù)據(jù),原因是前臺將響應(yīng)回來的密文數(shù)據(jù)進(jìn)行了解密
注:在該網(wǎng)站的相關(guān)數(shù)據(jù)包中是存在這解密方法,我們只需要將其解密方法獲取,就可對密文數(shù)據(jù)進(jìn)行解密
找尋ajax請求的代碼
獲取搜索按鈕對應(yīng)的點(diǎn)擊事件綁定的函數(shù)即可(使用火狐瀏覽器找尋點(diǎn)擊事件的函數(shù)代碼)
點(diǎn)擊搜索按鈕對應(yīng)的點(diǎn)擊事件函數(shù)名叫做getData,進(jìn)入該函數(shù)內(nèi)部扎尋ajax請求代碼
找到了getDate函數(shù)的實(shí)現(xiàn)
-
沒有發(fā)現(xiàn)ajax代碼的實(shí)現(xiàn)
-
發(fā)現(xiàn)函數(shù)內(nèi)部調(diào)用了另外的兩個函數(shù)getAQIData();
getWeatherData(); -
那么ajax代碼的實(shí)現(xiàn)一定是在上訴兩個函數(shù)內(nèi)部
-
有價值的信息: type==“HOUR” 查詢時間是以小時為單位
-
進(jìn)入getAQIData();getWeatherData();函數(shù)內(nèi)部找尋ajax代碼實(shí)現(xiàn)
- 在這兩個函數(shù)內(nèi)部沒有發(fā)現(xiàn)ajax代碼的實(shí)現(xiàn)
- 發(fā)現(xiàn)他兩都調(diào)用了一個名叫g(shù)etServerData()的函數(shù),那么ajax代碼一定存在getServerData()函數(shù)中
進(jìn)入getServerData函數(shù)內(nèi)部找尋ajax代碼
- 通過搜索我們發(fā)現(xiàn)只有2個getServerData的調(diào)用并不是函數(shù)的定義,那么getServerData并不在 city_datail.html中
- 函數(shù)實(shí)現(xiàn)的找尋,需要在抓包工具中進(jìn)行全局搜索
- 找到的結(jié)果是密文
js 混淆
- 在網(wǎng)站后臺,關(guān)鍵的重要的js函數(shù)的實(shí)現(xiàn)為了保密,一般會對這些js函數(shù)代碼進(jìn)行混淆(加密),所以我們需要對js混淆的代碼進(jìn)行反混淆,將js加密的函數(shù)進(jìn)行解密js反混淆
js混淆暴力破解https://www.bm8.com.cn/jsConfusion/
分析getServerData函數(shù)實(shí)現(xiàn)的ajax代碼:
js逆向
我們需要借助于 PyExecJS 庫來實(shí)現(xiàn)模擬JavaScript代碼執(zhí)行獲取動態(tài)加密的請求參數(shù),然后再將加密的響應(yīng)數(shù)據(jù)帶入decodeData進(jìn)行解密即可!
- PyExecJS介紹:PyExecJS 是一個可以使用 Python 來模擬運(yùn)行 JavaScript 的庫。我們需要pip install PyExecJS對其進(jìn)行環(huán)境安裝。
- 以及安裝nodejs的開發(fā)環(huán)境:https://jingyan.baidu.com/article/e4511cf38c05092b845eaf9b.html
- 開始執(zhí)行js:- 1.創(chuàng)建一個jsCode.js文件將反混淆網(wǎng)站中的代碼粘貼進(jìn)去
- 2.在jsCode.js文件中添加一個自定義函數(shù)getPostParamCode,該函數(shù)是為了獲取且返回post請求的動態(tài)加密參數(shù):
- 在py源文件中可以基于PyExecJS模擬執(zhí)行jsCode.js中定義好的自定義函數(shù),獲取動態(tài)加密參數(shù):
- 我們用 requests 庫來模擬 POST 請求
- 接下來我們再調(diào)用一下 JavaScript 中的 decodeData() 方法即可實(shí)現(xiàn)解密:
完整代碼
import execjs import requestsurl = "https://www.aqistudy.cn/apinew/aqistudyapi.php" headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" }#實(shí)例化一個對象 node = execjs.get() # Params method = 'GETCITYWEATHER' city = '北京' type = 'HOUR' start_time = '2020-08-27 00:00:00' end_time = '2020-08-28 23:00:00'# Compile javascript file = 'jsCode.js' #代加載編譯的js源文件 ctx = node.compile(open(file, encoding='utf-8').read())#加載編譯的js源文件中的js代碼 # Get params js = 'getPostParamCode("{0}", "{1}", "{2}", "{3}", "{4}")'.format(method, city, type, start_time, end_time) params = ctx.eval(js)# eval表示執(zhí)行指定js函數(shù) print(params)data = {"d":params } page_text = requests.post(url=url,headers=headers,data=data).text print(page_text)# 返回的是加密的響應(yīng)數(shù)據(jù)# 對加密的響應(yīng)數(shù)據(jù)進(jìn)行解密 js = 'decodeData("{0}")'.format(page_text) decrypted_data = ctx.eval(js) print(decrypted_data) #解密后的真實(shí)數(shù)據(jù)完美結(jié)束
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的13-爬虫之js加密,解密,混淆,逆向破解思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12-基于selenium实现12306
- 下一篇: 14-爬虫之scrapy框架的基本使用0