一、總結(jié)
- 搜索:全局搜索、代碼內(nèi)搜索
- debug:常規(guī)debug、XHR debug、行為debug
- 查看請求調(diào)用的堆棧
- 執(zhí)行堆內(nèi)存中的函數(shù)
- 修改堆棧中的參數(shù)值
- 寫js代碼
- 打印windows對象的值
- 勾子:cookie鉤子、請求鉤子、header鉤子
二、js逆向技巧
博客對應(yīng)課程的視頻位置:
當(dāng)我們抓取網(wǎng)頁端數(shù)據(jù)時,經(jīng)常被加密參數(shù)、加密數(shù)據(jù)所困擾,如何快速定位這些加解密函數(shù),尤為重要。本片文章是我逆向js時一些技巧的總結(jié),如有遺漏,歡迎補充。
所需環(huán)境:Chrome瀏覽器
1. 搜索
1.1 全局搜索
適用于根據(jù)關(guān)鍵詞快速定位關(guān)鍵文件及代碼
當(dāng)前頁面右鍵->檢查,彈出檢查工具
搜索支持 關(guān)鍵詞、正則表達式
1.2 代碼內(nèi)搜索
適用于根據(jù)關(guān)鍵詞快速定位關(guān)鍵代碼
點擊代碼,然后按ctrl+f 或 command+f 調(diào)出搜索框。搜索支持 關(guān)鍵詞、css表達式、xpath
2. debug
2.1 常規(guī)debug
適用于分析關(guān)鍵函數(shù)代碼邏輯
a、埋下斷點
b、調(diào)試
如圖所示,我標記了1到6,下面分別介紹其含義
1.執(zhí)行到下一個端點
2.執(zhí)行下一步,不會進入所調(diào)用的函數(shù)內(nèi)部
3.進入所調(diào)用的函數(shù)內(nèi)部
4.跳出函數(shù)內(nèi)部
5.一步步執(zhí)行代碼,遇到有函數(shù)調(diào)用,則進入函數(shù)
6.Call Stack 為代碼調(diào)用的堆棧信息,代碼執(zhí)行順序為由下至上,這對于著關(guān)鍵函數(shù)前后調(diào)用關(guān)系很有幫助
2.2 XHR debug
匹配url中關(guān)鍵詞,匹配到則跳轉(zhuǎn)到參數(shù)生成處,適用于url中的加密參數(shù)全局搜索搜不到,可采用這種方式攔截
2.3 行為debug
適用于點擊按鈕時,分析代碼執(zhí)行邏輯
如圖所示,可快速定位點擊探索按鈕后,所執(zhí)行的js。
3 查看請求調(diào)用的堆棧
可以在 Network 選項卡下,該請求的 Initiator 列里看到它的調(diào)用棧,調(diào)用順序由上而下:
4. 執(zhí)行堆內(nèi)存中的函數(shù)
當(dāng)debug到某一個函數(shù)時,我們想主動調(diào)用,比如傳遞下自定義的參數(shù),這時可以在檢查工具里的console里調(diào)用
此處要注意,只有debug打這個函數(shù)時,控制臺里才可以調(diào)用。如果想保留這個函數(shù),可使用this.xxx=xxx 的方式。之后調(diào)用時無需debug到xxx函數(shù),直接使用this.xxx 即可。
5. 修改堆棧中的參數(shù)值
6. 寫js代碼
7. 打印windows對象的值
在console中輸入如下代碼,如只打印_$開頭的變量值
for (var p in window) {
if (p.substr(0, 2) !== "_$")
continue;
console.log(p + " >>> " + eval(p))
}
8. 勾子
以chrome插件的方式,在匹配到關(guān)鍵詞處插入斷點
8.1 cookie鉤子
用于定位cookie中關(guān)鍵參數(shù)生成位置
var code = function(){
var org = document.cookie.lookupSetter('cookie');
document.defineSetter("cookie",function(cookie){
if(cookie.indexOf('TSdc75a61a')>-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);
當(dāng)cookie中匹配到了 TSdc75a61a, 則插入斷點。
8.2 請求鉤子
用于定位請求中關(guān)鍵參數(shù)生成位置
var code = function(){
var open = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, url, async){
if (url.indexOf("MmEwMD")>-1){
debugger;
}
return open.apply(this, arguments);
};
}
var script = document.createElement('script');
script.textContent = '(' + code + ')()';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
當(dāng)請求的url里包含MmEwMD時,則插入斷點
8.3 header鉤子
用于定位header中關(guān)鍵參數(shù)生成位置
var code = function(){
var org = window.XMLHttpRequest.prototype.setRequestHeader;
window.XMLHttpRequest.prototype.setRequestHeader = function(key,value){
if(key=='Authorization'){
debugger;
}
return org.apply(this,arguments);
}
}
var script = document.createElement('script');
script.textContent = '(' + code + ')()';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
當(dāng)header中包含Authorization時,則插入斷點
8.4 manifest.json
插件的配置文件
{
"name": "Injection",
"version": "2.0",
"description": "RequestHeader鉤子",
"manifest_version": 2,
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"inject.js"
],
"all_frames": true,
"permissions": [
"tabs"
],
"run_at": "document_start"
}
]
}
使用方法
a、如圖所示,創(chuàng)建一個文件夾,文件夾中創(chuàng)建一個鉤子函數(shù)文件inject.js 及 插件的配置文件 mainfest.json 即可
b、打開chrome 的擴展程序, 加載已解壓的擴展程序,選擇步驟1創(chuàng)建的文件夾即可
c、切換回原網(wǎng)頁,刷新頁面,若鉤子函數(shù)關(guān)鍵詞匹配到了,則觸發(fā)debug
本文摘自 :https://www.cnblogs.com/