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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【JS 逆向百例】PEDATA 加密资讯以及 zlib.gunzipSync() 的应用

發(fā)布時間:2023/12/10 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JS 逆向百例】PEDATA 加密资讯以及 zlib.gunzipSync() 的应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)注微信公眾號:K哥爬蟲,持續(xù)分享爬蟲進(jìn)階、JS/安卓逆向等技術(shù)干貨!


文章目錄

    • 聲明
    • 逆向目標(biāo)
    • 抓包分析
    • 加密逆向
    • 完整代碼
      • JavaScript 加密代碼
      • Python 示例代碼


聲明

本文章中所有內(nèi)容僅供學(xué)習(xí)交流,抓包內(nèi)容、敏感網(wǎng)址、數(shù)據(jù)接口均已做脫敏處理,嚴(yán)禁用于商業(yè)用途和非法用途,否則由此產(chǎn)生的一切后果均與作者無關(guān),若有侵權(quán),請聯(lián)系我立即刪除!

逆向目標(biāo)

  • 目標(biāo):某投資領(lǐng)域 SAAS 系統(tǒng) PEDATA MAX 資訊,返回結(jié)果加密
  • 主頁:aHR0cHM6Ly9tYXgucGVkYXRhLmNuL2NsaWVudC9uZXdzL25ld3NmbGFzaA==
  • 接口:aHR0cHM6Ly9tYXgucGVkYXRhLmNuL2FwaS9xNHgvbmV3c2ZsYXNoL2xpc3Q=
  • 逆向參數(shù):請求返回的加密結(jié)果,data: "L+o+YmIyNDE..."

抓包分析

我們在首頁,點擊查看全部24小時資訊,往下拉,資訊是以 Ajax 形式加載的,我們選中開發(fā)者工具 XHR 進(jìn)行篩選,很容易找到一個 list 請求,其返回值 data 是一串經(jīng)過加密后的字符串,exor 不知道是啥,但是后面可能有用,ts 是時間戳,如下圖所示:

Payload 里的參數(shù)沒有什么特別的,就是一些翻頁信息,我們再看看請求 header,這里注意 Cookie 和 HTTP-X-TOKEN 兩個參數(shù),訪問這個頁面需要登錄賬號,一般來說,Cookie 是用來標(biāo)識不同用戶的,但經(jīng)過 K 哥測試發(fā)現(xiàn),此案例中,這個 HTTP-X-TOKEN 參數(shù)才是用來識別用戶的,所以不需要 Cookie 也行,隨便提一嘴,Cookie 中我們經(jīng)常看到有 Hm_lvt_xxx 和 Hm_lpvt_xxx 是用于百度聯(lián)盟廣告的數(shù)據(jù)統(tǒng)計的,與爬蟲無關(guān)。

加密逆向

我們注意到返回的是一個字典,在獲取到加密數(shù)據(jù)后,肯定會有一個取值的過程,所以我們直接搜索鍵,搜索 exor 結(jié)果只有一個:

這里 e.data 就是返回的字典,e.data.data、e.data.exor 依次取加密值和 exor,這里就可以猜測是將加密值取出來進(jìn)行解密操作了,我們在此函數(shù)結(jié)尾處也打個斷點,看看這段代碼執(zhí)行完畢后,data 的值是否變成了明文:

不出所料,Object(p["y"])(e.data.data, e.data.exor) 這段代碼就是解密函數(shù)了,Object(p["y"]) 其實是調(diào)用了 M 方法,跟進(jìn)去看看:

傳入的 t 和 n 分別是加密值和 exor,最后返回的 JSON.parse(c) 就是解密結(jié)果:

關(guān)鍵代碼:

function M(t, n) {var a = L(Object(s["a"])(), n), r = Y(B(t), a), c = o.a.gunzipSync(e.from(r)).toString("utf-8");return JSON.parse(c) }

挨個函數(shù)扣下來,簡單的就不講了, 其中 Object(s["a"]),選中它,其實是調(diào)用了 c 方法,跟進(jìn) c 方法,實際上是取了 loginToken,這個 loginToken 就是我們前面分析的請求頭中的 HTTP-X-TOKEN,包含了你的登錄信息。

拓展知識:window.localStorage 屬性用于在瀏覽器中存儲鍵值對形式的數(shù)據(jù),localStorage 與 sessionStorage 類似,區(qū)別在于:localStorage 中的數(shù)據(jù)可以長期保留,沒有過期時間,直到被手動刪除。sessionStorage 的數(shù)據(jù)僅保存在當(dāng)前會話中,在關(guān)閉窗口或標(biāo)簽頁之后將會刪除這些數(shù)據(jù)。

再往下看,有個 o.a.gunzipSync(),先放一下,先看看傳入的參數(shù) e.from(r),跟進(jìn)看可能看不出來什么,直接對比 r 和 e.from(r),會發(fā)現(xiàn)都是 Uint8Array 的數(shù)據(jù),一模一樣的,如下圖所示:

再來看看 o.a.gunzipSync(),實際上調(diào)用的是 chunk-vendors.js 里的匿名函數(shù),不知道這個 JS 不要緊,我們注意到 chunk-vendors.js 里面的代碼有超過14萬行,再加上這個奇怪的名字,什么模塊供應(yīng)商,不難想到這是一個系統(tǒng)或者第三方生成的 JS,事實上它是 vue 應(yīng)用程序構(gòu)建過程中創(chuàng)建的文件,對于我們爬蟲工程師來講,粗暴的將其理解為類似 jquery.js 一樣的東西也行,我們一般是不會去扣 jquery.js 里面的代碼的,同樣這個 chunk-vendors.js 也不可能傻傻的去扣。

我們重點看看這個函數(shù)名,gunzipSync,其他不認(rèn)識,但認(rèn)識 zip 吧,可以聯(lián)想到應(yīng)該與壓縮有關(guān),不了解同樣不要緊,直接使出百度大法:

這直接給出了 nodejs 里面的實現(xiàn)方法,用的是 zlib 模塊,隨便找個示例看看用法:

var zlib = require('zlib'); var input = "Nidhi"; var gzi = zlib.gzipSync(input); var decom = zlib.gunzipSync(new Buffer.from(gzi)).toString();console.log(decom);

進(jìn)一步學(xué)習(xí),我們可以知道 zlib.gunzipSync() 方法是 zlib 模塊的內(nèi)置應(yīng)用程序編程接口,用于使用 Gunzip 解壓數(shù)據(jù)塊。傳入的數(shù)據(jù)可以是 Buffer、TypedArray、DataView、ArrayBuffer、string 類型,在官方文檔中我們可以看到更新歷史里面,在 v8.0.0 以后,傳入的數(shù)據(jù)就支持 Uint8Array 了:

結(jié)合前面我們對 r 值的分析,所以在 nodejs 里,直接把 r 值傳入到 zlib.gunzipSync() 方法里就可以了,將用到的 L、V、B 三個方法扣出來,然后配合 zlib 庫,改寫一下就能拿到解壓后的數(shù)據(jù)了:

function getDecryptedData(encryptedData, exor, loginToken) {var a = L(loginToken, exor);var r = Y(B(encryptedData), a)var decryptedData = zlib.gunzipSync(r).toString();return decryptedData }

完整代碼

GitHub 關(guān)注 K 哥爬蟲,持續(xù)分享爬蟲相關(guān)代碼!歡迎 star !https://github.com/kgepachong/

以下只演示部分關(guān)鍵代碼,不能直接運(yùn)行! 完整代碼倉庫地址:https://github.com/kgepachong/crawler/

JavaScript 加密代碼

/* ================================== # @Time : 2021-12-31 # @Author : 微信公眾號:K哥爬蟲 # @FileName: main.js # @Software: PyCharm # ================================== */var zlib = require('zlib');function L(e, t) {if ("1" == t)return [7, 65, 75, 31, 71, 101, 57, 0];for (var n = [], a = 0, r = t.length; a < r; a += 2)n.push(e.substr(1 * t.substr(a, 2), 1).charCodeAt());return n }function Y(e, t) {for (var n, a = new Uint8Array(e.length), r = 0, c = e.length; r < c; r++)n = t[r % t.length],a[r] = e[r].charCodeAt() ^ n;return a }function B(e) {var t, n, a, r, c, u, i, o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", s = "", f = 0;e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "");while (f < e.length)r = o.indexOf(e.charAt(f++)),c = o.indexOf(e.charAt(f++)),u = o.indexOf(e.charAt(f++)),i = o.indexOf(e.charAt(f++)),t = r << 2 | c >> 4,n = (15 & c) << 4 | u >> 2,a = (3 & u) << 6 | i,s += String.fromCharCode(t),64 != u && (s += String.fromCharCode(n)),64 != i && (s += String.fromCharCode(a));return s }function getDecryptedData(encryptedData, exor, loginToken) {var a = L(loginToken, exor);var r = Y(B(encryptedData), a)var decryptedData = zlib.gunzipSync(r).toString();return decryptedData }

Python 示例代碼

# ================================== # --*-- coding: utf-8 --*-- # @Time : 2021-12-31 # @Author : 微信公眾號:K哥爬蟲 # @FileName: main.py # @Software: PyCharm # ==================================import execjs import requestsnews_est_url = "脫敏處理,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler" login_token = "token 換成你自己的!" headers = {"Accept": "application/json, text/plain, */*","Content-Type": "application/json","Host": "脫敏處理,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler","HTTP-X-TOKEN": login_token,"Origin": "脫敏處理,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler","Referer": "脫敏處理,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" }def get_decrypted_data(encrypted_data, exor):with open('pedata_decrypt.js', 'r', encoding='utf-8') as f:pedata_js = f.read()decrypted_data = execjs.compile(pedata_js).call('getDecryptedData', encrypted_data, exor, login_token)return decrypted_datadef get_encrypted_data():data = {"type": "","module": "LP","page":{"currentPage": 1,"pageSize": 10}}response = requests.post(url=news_est_url, headers=headers, json=data).json()encrypted_data, exor = response["data"], response["exor"]return encrypted_data, exordef main():encrypted_data, exor = get_encrypted_data()decrypted_data = get_decrypted_data(encrypted_data, exor)print(decrypted_data)if __name__ == '__main__':main()

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的【JS 逆向百例】PEDATA 加密资讯以及 zlib.gunzipSync() 的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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