解密 JS 參數(shù):逆向工程的實(shí)用技巧

大家好,我是安果!
大部分網(wǎng)站都會(huì)對(duì)關(guān)鍵參數(shù)進(jìn)行加密,JS 逆向時(shí),我們首要任務(wù)是定位參數(shù)具體的加密邏輯
常見方式包含:關(guān)鍵字搜索、堆棧調(diào)試、XHR 及事件監(jiān)聽、AST 內(nèi)存漫游、JS Hook 注入等
本篇文章以 JS Hook 注入定位?Cookie 中某個(gè)加密參數(shù)為例進(jìn)行講解
Cookie 監(jiān)聽 ?
編寫一個(gè) Chrome 插件( V3 版本) 監(jiān)聽瀏覽器 Cookie?值的變動(dòng),當(dāng) Cookie 的 Name?匹配時(shí)執(zhí)行 debugger 命令主動(dòng)觸發(fā)調(diào)試
具體實(shí)現(xiàn)如下:
1-1?? 編寫 manifest.json 配置文件
在配置文件中,指定 background.js、content_script
并通過?permissions、host_permissions 進(jìn)行權(quán)限設(shè)置
{
??"manifest_version":?3,
??...
??"background":?{
????"service_worker":?"background.js"
??},
??"content_scripts":[
????{
??????"matches":?[
????????""
??????],
??????"js":?[
????????"js/cookie.js"
??????],
??????"run_at":?"document_start"
???}],
??"permissions":?[
????"cookies",
????"tabs",
????"scripting"
??],
??"host_permissions":?[
????"https://host/*"
??],
?...
}
1-2?? 監(jiān)聽 Cookie
在 background.js 文件中添加一個(gè)事件監(jiān)聽,在它的回調(diào)函數(shù)中再添加一個(gè)對(duì) Cookie 的監(jiān)聽事件
當(dāng)監(jiān)聽到的?Cookie 滿足條件時(shí),發(fā)送消息給 Content Script?去執(zhí)行具體的動(dòng)作
需要指出的是, changeInfo.cause?表示 Cookie 變化的原因,值?explicit?表示 Cookie 變化是由于用戶主動(dòng)操作導(dǎo)致的
#?監(jiān)聽的cookie_name
const?targetCookieName?=?"cookie_name";
chrome.runtime.onMessage.addListener((request,?sender,?sendResponse)?=>?{
??if?(request.action?===?"startDebugging")?{
????chrome.cookies.onChanged.addListener((changeInfo)?=>?{
??????//console.log("監(jiān)控到cookie變化")
??????//console.log(changeInfo.cookie.name)
??????//console.log(changeInfo.cause)
??????if?(changeInfo.cookie.name?===?targetCookieName?&&?changeInfo.cause?===?"explicit")?{?
????????console.log("監(jiān)控到cookie變化-explicit,名稱:",changeInfo.cookie.name)
????????chrome.tabs.sendMessage(sender.tab.id,?{?action:?"debugger"?});
??????}
????});
??}
});
1-3? 觸發(fā)調(diào)試
在 Content Script 中,主動(dòng)觸發(fā)一次發(fā)起調(diào)試的消息給 Background
然后,設(shè)置一個(gè)監(jiān)聽事件,特定條件下主動(dòng)進(jìn)入調(diào)試模式
//?cookie.js
chrome.runtime.sendMessage({?action:?"startDebugging"?});
chrome.runtime.onMessage.addListener((request)?=>?{
if?(request.action?===?"debugger")?{
??????debugger;
??}
});
將編寫好的 Chrome 插件安裝到瀏覽器上,打開目標(biāo)網(wǎng)站及瀏覽器開發(fā)者工具
只要指定的 Cookie 變動(dòng),就會(huì)自動(dòng)觸發(fā)調(diào)試操作
Cookie Hook??
通過上面的方式僅僅只能發(fā)現(xiàn) Cookie 變動(dòng)了,但是沒法定位到參數(shù)設(shè)置的具體位置,因此我們需要借助?Hook 進(jìn)行改造
具體實(shí)現(xiàn)如下:
2-1 配置文件中指定 Hook 文件
在 manifest.json 文件中,使用? web_accessible_resources 關(guān)鍵字指定 Hook?腳本及匹配 URL
//?manifest.json
{
??"manifest_version":?3,
??...
??"content_scripts":?[
????{
??????"matches":?[
????????""
??????],
??????"js":?[
????????"js/cookie.js"
??????],
??????"run_at":?"document_end"
????}
??],
??"permissions":?[
????"cookies",
????"tabs",
????"scripting"
??],
??"host_permissions":?[
????"*://*/*"
??],
??"web_accessible_resources":?[
????{
??????"resources":?[
????????"js/cookie_hook.js"
??????],
??????"matches":?[
????????"https://host/*"
??????]
????}
??]
}
2-2? Content Script 注入 JS
在 Content Script 中注入 JS Hook 代碼
//?cookie.js
function?import_js(js_path)?{
????let?tmp?=?document.createElement('script');
????tmp.src?=?chrome.runtime.getURL(js_path);
????tmp.setAttribute('type',?'text/javaScript');
????document.head.appendChild(tmp);
}
(function?()?{
????let?url?=?window.location.href;
????import_js('js/cookie_hook.js')
})()
2-3? JS Hook 具體邏輯
在 cookie_hook.js 文件中,使用? document . __lookupSetter__?對(duì) Cookie 設(shè)置注入腳本,手動(dòng)觸發(fā)調(diào)試
//?cookie_hook.js
//待匹配的Cookie-Key
const?targetCookieName?=?"cookie_name";
//Hook?Cookie?Set
//注意:這種方法可能與某些網(wǎng)站的JavaScript代碼不兼容,因?yàn)樗蕾囉趶U棄的__defineSetter__方法
function?hookCookieSetter()?{
??const?originalCookieSetter?=?document.__lookupSetter__("cookie");
??document.__defineSetter__("cookie",?function?(value)?{
????const?cookieName?=?value.split("=")[0].trim();
????if?(cookieName?===?targetCookieName)?{
??????debugger;
????}
????//調(diào)用
????originalCookieSetter.call(document,?value);
??});
}
hookCookieSetter();
當(dāng)然,我們也可以利用下面的方式進(jìn)行注入
//?cookie_hook.js
//待匹配的Cookie-Key
const?targetCookieName?=?"cookie_name";
//cookie 鉤子:用于定位 cookie 中關(guān)鍵參數(shù)生成位置
var?code?=?function(){
????var?org?=?document.cookie.__lookupSetter__('cookie');
????document.__defineSetter__("cookie",function(cookie){
????????if(cookie.indexOf(targetCookieName)>-1){
????????????debugger;
????????}
????????org?=?cookie;
????});
????document.__defineGetter__("cookie",function(){return?org;});
}
var?script?=?document.createElement('script');
script.textContent?=?'('?+?code?+?')()';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
2-4?? 使用
在 Chrome 瀏覽器中安裝擴(kuò)展后,打開瀏覽器開發(fā)者工具和目前網(wǎng)站,一旦目標(biāo) Cookie 被設(shè)定一個(gè)值后,會(huì)自動(dòng)進(jìn)入斷點(diǎn)模式
在調(diào)試模式下,我們就可以在 Source 面板利用?Call Stack?調(diào)用棧一步步查詢到加密參數(shù)生成的具體邏輯
推薦閱讀
如何利用 Selenium 對(duì)已打開的瀏覽器進(jìn)行爬蟲!
微軟最強(qiáng) Python 自動(dòng)化工具開源了!不用寫一行代碼!
最全總結(jié) | 聊聊 Selenium 隱藏瀏覽器指紋特征的幾種方式!
END
