【作者主頁】:吳秋霖
【作者介紹】:Python領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、阿里云博客專家、華為云享專家。長期致力于Python與爬蟲領(lǐng)域研究與開發(fā)工作!
【作者推薦】:對JS逆向感興趣的朋友可以關(guān)注《爬蟲JS逆向?qū)崙?zhàn)》,對分布式爬蟲平臺感興趣的朋友可以關(guān)注《分布式爬蟲平臺搭建與開發(fā)實戰(zhàn)》
還有未來會持續(xù)更新的驗證碼突防、APP逆向、Python領(lǐng)域等一系列文章
1. 寫在前面
??相信很多爬蟲工程師在進行Web端JS逆向的時候,面對加密參數(shù)無從下手,不知道如何進行定位與分析。本期作者將介紹一款針對Web端逆向Hook定位加密的輔助工具給大家!內(nèi)存漫游確實聽起來有些虛高大上、實則就是檢索瀏覽器內(nèi)存數(shù)據(jù)…
以下是該工具功能與原理的部分描述:
-
- 訪問目標網(wǎng)站時設(shè)置瀏覽器走自定義的代理服務(wù)器,這個代理服務(wù)器要支持能夠使用代碼處理請求,這里選擇是anyproxy
-
- 在代理服務(wù)器這里,對請求做處理,對于JavaScript響應(yīng)和HTML響應(yīng)里的JS代碼,使用AST實時處理,注入Hook邏輯
-
- Hook邏輯就是所有涉及到變量的地方都經(jīng)過我們的Hook方法,所以實現(xiàn)頁面上所有的變量值都可以捕獲到,可以把這個理解為內(nèi)存中變量級別的抓包監(jiān)控
-
- 抓到的變量會被保存到一個變量數(shù)據(jù)庫中,然后當(dāng)你訪問頁面請求時帶上加密參數(shù)的請求之后,從Chrome開發(fā)者工具的網(wǎng)絡(luò)中把那個加密參數(shù)復(fù)制出來,切換到控制臺調(diào)用本工具提供的api在變量數(shù)據(jù)庫中搜索一下,可以搜索到存儲該字符串的變量及變量所在的代碼位置,點擊代碼位置可以自動切換到源面板并自動定位到變量位置
-
- 變量級抓包監(jiān)控,根據(jù)加密參數(shù)秒秒鐘定位到加密邏輯的代碼位置(追加密邏輯代碼位置的通殺方案)
然后打斷點往前找加密邏輯摳出來就可以,如果有多個加密參數(shù)或者加密參數(shù)為多個地方拼接生成,無腦重復(fù)此步驟即可?。?/strong>
按照上述項目的描述,對Web端進行JS逆向中,在我們有時候無法快速精準的定位到加密參數(shù)入口時,確實可以用以輔助
2. 環(huán)境搭建
首先,第一步我們需要下載項目到本地,安裝依賴:
npm install -g anyproxy
npm install shelljs
缺什么根據(jù)提示安裝即可,如果在這里出現(xiàn)npm異常,可以嘗試:
npm cache clean --force
npm config set strict-ssl false
npm config set registry https://npm.aliyun.com/
接下來,需要啟動兩個本地服務(wù),我們分別來看一下代碼實現(xiàn),proxy-server.js代碼如下所示:
const AnyProxy = require("anyproxy");
const options = {
port: 10086,
rule: require("./rules"),
webInterface: {
enable: true,
webPort: 8002
},
throttle: 10000,
forceProxyHttps: true,
wsIntercept: false, // 不開啟websocket代理
silent: false
};
const proxyServer = new AnyProxy.ProxyServer(options);
proxyServer.on("ready", () => { /* */ });
proxyServer.on("error", (e) => { /* */ });
proxyServer.start();
首先導(dǎo)入一個代理服務(wù)的包Anyproxy,這個包的話在之前已經(jīng)安裝好了。端口設(shè)置的是10086,這個我們是可以自行修改的,然后引用了一個rules文件,這個文件內(nèi)引用的就是核心的Hook邏輯。另外Web端口是8002,可以直接訪問類似mit抓包界面
另一個需要啟動的api-server.js服務(wù)代碼如下所示:
const express = require("express");
const bodyParser = require("body-parser");
const {injectHook} = require("../components/global-assign-hook-component/core/inject-hook");
const app = express();
app.use(bodyParser.raw({
verify: function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString("UTF-8");
}
}, type: function () {
return true
}
}));
// 將傳過來的js代碼注入hook
app.post("/hook-js-code", function (request, response) {
const jsCode = decodeURIComponent(request.body.toString());
let newJsCode = jsCode;
try {
newJsCode = injectHook(jsCode);
} catch (e) {
console.error(e);
}
response.setHeader("Content-Type", "text/plain; charset=utf-8");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.send(encodeURIComponent(newJsCode));
response.end();
})
// 以后如果能夠和頁面上雙向通信,上報各種數(shù)據(jù)到這里,就能夠?qū)崿F(xiàn)功能更強的分析之類的
const server = app.listen(10010, function () {
console.log("啟動成功");
})
代碼中同樣導(dǎo)入了一個NodeJS的Web服務(wù)器包express,有時候我們做爬蟲可能會用到它來開發(fā)接口服務(wù)
啟動第一個代理服務(wù),運行命令如下:
node src/proxy-server/proxy-server.js
運行服務(wù)可能會提示缺少根證書(CA),在AnyProxy中,為了進行HTTPS代理,需要使用根證書進行中間人攻擊,解決方法我們需要運行anyproxy-ca命令來生成根證書,如下圖所示:
記得設(shè)置Anyproxy證書信任,不然無法進行有效的Hook
證書信任完成后,重新啟動Server服務(wù),如下:
接下來進入項目api-server文件下,同樣方式啟動監(jiān)聽服務(wù):
服務(wù)啟動后,在瀏覽器中配置IP地址跟端口,這里推薦使用Chrome搭建單獨的調(diào)試環(huán)境,配合使用Proxy Switchy0mega或者其它類似的插件作為代理路由輔助,配置信息如下:
除了以上瀏覽器插件配置的方式,也可在網(wǎng)絡(luò)設(shè)置中進行配置,具體方案不限,只要能夠?qū)崿F(xiàn)流量走AnyProxy代理就可以
2. 加密定位實戰(zhàn)
服務(wù)已經(jīng)搭建完成,接下來,這里我找了一個有加密參數(shù)的網(wǎng)站進行測試,這是一個翻頁請求中帶sign簽名加密參數(shù)的接口,點擊更多翻頁,可以看到sign的值如下所示:
ATS實時處理JS文件會比較慢,同時會生成一個緩存目錄來存放JS文件,加載文件如下:
這個時候我們直接將上面截圖中sign簽名的值拿到控制臺進行Hook搜索,如下所示:
可以看到在上圖的控制臺中,會展示很多重要的信息字段,我們重點需要知道的就是sign這個值是在什么地方生成的,可以看到e是生成后的結(jié)果,執(zhí)行的方法是Xt,我們點擊跳轉(zhuǎn)到代碼處,如下所示:
這里會發(fā)現(xiàn)出現(xiàn)了很多名為cc11001100_hook的函數(shù),可以把這個函數(shù)理解為它會直接返回第二個參數(shù)的值,對整體邏輯沒有影響,分析時忽略它即可!
這里可能很多職業(yè)玩家會質(zhì)疑,有的加密參數(shù),直接使用參數(shù)名搜索或者輕量級Hook跟棧甚至是XHR跟棧那不是更加簡便?沒錯!這個網(wǎng)站中的sign參數(shù)使用關(guān)鍵詞搜索就能夠定位到入口,如下所示:
可以看到加密方法Xt接受一個參數(shù)n,控制臺打印看一下:
n是翻頁接口請求URL所拼接的一堆參數(shù),測試了一下Xt是一個標準的MD5加密算法:
有點講的跑題了,本期還是回歸主題說的是利用Hook工具去輔助我們JS逆向定位加密參數(shù)
最后,按照作者自己的說法本項目本身就是一個通殺工具,它并不針對某一個站。所以在爬蟲Web端JS逆向分析中大家可以根據(jù)經(jīng)驗來選擇合適的方案與工具!畢竟,一款好用的工具確實能夠讓JS逆向變得更加簡單文章來源:http://www.zghlxwxcb.cn/news/detail-836250.html
??好了,到這里又到了跟大家說再見的時候了。創(chuàng)作不易,幫忙點個贊再走吧。你的支持是我創(chuàng)作的動力,希望能帶給大家更多優(yōu)質(zhì)的文章文章來源地址http://www.zghlxwxcb.cn/news/detail-836250.html
到了這里,關(guān)于【爬蟲JS逆向-工具篇】瀏覽器內(nèi)存漫游加密參數(shù)Hook實戰(zhàn)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!