日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

13-爬虫之js加密,解密,混淆,逆向破解思路

發(fā)布時間:2024/9/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 13-爬虫之js加密,解密,混淆,逆向破解思路 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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/

function getServerData(method, object, callback, period) {const key = hex_md5(method + JSON.stringify(object));const data = getDataFromLocalStorage(key, period);if (!data) {var param = getParam(method, object);$.ajax({url: '../apinew/aqistudyapi.php', #請求urldata: {d: param #加密且動態(tài)變化的請求參數(shù)},type: "post",#請求方式#data請求到的加密的響應(yīng)數(shù)據(jù)success: function (data) {data = decodeData(data);#將data這個加密的響應(yīng)數(shù)據(jù)進(jìn)行解密obj = JSON.parse(data);if (obj.success) {if (period > 0) {obj.result.time = new Date().getTime();localStorageUtil.save(key, obj.result)}callback(obj.result)} else {console.log(obj.errcode, obj.errmsg)}}})} else {callback(data)}}
分析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ù):

function getPostParamCode(method, city, type, startTime, endTime){var param = {};param.city = city;param.type = type;param.startTime = startTime;param.endTime = endTime;return getParam(method, param); }


- 在py源文件中可以基于PyExecJS模擬執(zhí)行jsCode.js中定義好的自定義函數(shù),獲取動態(tài)加密參數(shù):

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)#返回的是加密變化的請求參數(shù)

  • 我們用 requests 庫來模擬 POST 請求
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ù)

  • 接下來我們再調(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。