JS逆向快速定位關(guān)鍵點(diǎn)之9大通用hook腳本

1. cookie 通用hook

Cookie Hook 用于定位 Cookie 中關(guān)鍵參數(shù)生成位置贞岭,以下代碼演示了當(dāng) Cookie 中匹配到了 v 關(guān)鍵字士复, 則插入斷點(diǎn)

(function () {
    var cookieTemp = '';
    Object.defineproperty(document, 'cookie', {
        set: function (val) {
            if (val.indexOf('v') != -1) {
                debugger
            }
            console.log('Hook捕獲到cookie設(shè)置->', val);
            cookieTemp = val;
            return val;
        },
        get: function () {
            return cookieTemp;
        },
    });
})();

2. header 參數(shù)通用hook

(function () {
    // 頭部參數(shù) 請求對象當(dāng)中的 設(shè)胃請求頭部參數(shù)
   var org = window.XMLHttpRequest.prototype.setRequestHeader;
   window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
       // 關(guān)鍵字 在請求當(dāng)中發(fā)現(xiàn)有鍵是Authorization 斷點(diǎn)
       if (key == 'Authorization') {
            debugger;
        }
       return org.apply(this, arguments);
   }
})();

3. hook過debugger

// 先保留原 constructor
// 1. 比如判斷是否有該debugger詞語级解,替換為同等長度的空格(避免判斷長度)
Function.prototype.constructor_ = Function.prototype.constructor;
Function.prototype.constructor = function (a) {
    // 如果參數(shù)為 debugger胁编,就返回空方法
    if(a == "debugger") {
        return function (){};
    }
    // 如果參數(shù)不為 debugger锐墙,還是返回原方法
    return Function.prototype.constructor_(a);
};

2. 如果是定時(shí)器的debugger采用以下語句
// 先保留原定時(shí)器
var setInterval_ = setInterval
setInterval = function (func, time){
    // 如果時(shí)間參數(shù)為 0x7d0皿哨,就返回空方法
    // 當(dāng)然也可以不判斷,直接返回空机隙,有很多種寫法
    if(time == 0x7d0)
    {
        return function () {};
    }
    // 如果時(shí)間參數(shù)不為 0x7d0蜘拉,還是返回原方法
    return setInterval_(func, time)
}

// eval("debugger;");

4. hook URL

URL Hook 用于定位請求 URL 中關(guān)鍵參數(shù)生成位置,以下代碼演示了當(dāng)請求的 URL 里包含 login 關(guān)鍵字時(shí)有鹿,則插入斷點(diǎn):

(function () {
    var open = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function (method, url, async) {
        if (url.indexOf("login") != -1) {
            debugger;
        }
        return open.apply(this, arguments);
    };
})();

5. hook JSON.stringify

JSON.stringify() 方法用于將 JavaScript 值轉(zhuǎn)換為 JSON 字符串旭旭,在某些站點(diǎn)的加密過程中可能會遇到,以下代碼演示了遇到 JSON.stringify() 時(shí)葱跋,則插入斷點(diǎn):

(function() {
    var stringify = JSON.stringify;
    JSON.stringify = function(params) {
        console.log("Hook JSON.stringify ——> ", params);
        debugger;
        return stringify(params);
    }
})();

6. hook JSON.parse

JSON.parse() 方法用于將一個(gè) JSON 字符串轉(zhuǎn)換為對象持寄,在某些站點(diǎn)的加密過程中可能會遇到,以下代碼演示了遇到 JSON.parse() 時(shí)娱俺,則插入斷點(diǎn):

(function() {
    var parse = JSON.parse;
    JSON.parse = function(params) {
        console.log("Hook JSON.parse ——> ", params);
        debugger;
        return parse(params);
    }
})();

7. hook eval

JavaScript eval() 函數(shù)的作用是計(jì)算 JavaScript 字符串稍味,并把它作為腳本代碼來執(zhí)行。如果參數(shù)是一個(gè)表達(dá)式荠卷,eval() 函數(shù)將執(zhí)行表達(dá)式模庐。如果參數(shù)是 Javascript 語句,eval() 將執(zhí)行 Javascript 語句油宜,經(jīng)常被用來動態(tài)執(zhí)行 JS掂碱。以下代碼執(zhí)行后,之后所有的 eval() 操作都會在控制臺打印輸出將要執(zhí)行的 JS 源碼:

(function() {
    // 保存原始方法
    window.__cr_eval = window.eval;
    // 重寫 eval
    var myeval = function(src) {
        console.log(src);
        console.log("=============== eval end ===============");
        debugger;
        return window.__cr_eval(src);
    }
    // 屏蔽 JS 中對原生函數(shù) native 屬性的檢測
    var _myeval = myeval.bind(null);
    _myeval.toString = window.__cr_eval.toString;
    Object.defineProperty(window, 'eval', {
        value: _myeval
    });
})();

8. hook Function

以下代碼執(zhí)行后验庙,所有的函數(shù)操作都會在控制臺打印輸出將要執(zhí)行的 JS 源碼:

(function() {
    // 保存原始方法
    window.__cr_fun = window.Function;
    // 重寫 function
    var myfun = function() {
        var args = Array.prototype.slice.call(arguments, 0, -1).join(","),
            src = arguments[arguments.length - 1];
        console.log(src);
        console.log("=============== Function end ===============");
        debugger;
        return window.__cr_fun.apply(this, arguments);
    }
    // 屏蔽js中對原生函數(shù)native屬性的檢測
    myfun.toString = function() {
        return window.__cr_fun + ""
    }
    Object.defineProperty(window, 'Function', {
        value: myfun
    });
})();

9. 通用反調(diào)試

(function() {
    var _constructor = unsafeWindow.Function.prototype.constructor;
    // Hook Function.prototype.constructor
    unsafeWindow.Function.prototype.constructor = function() {
        var fnContent = arguments[0];
        if (fnContent) {
            if (fnContent.includes('debugger')) { // An anti-debugger is attempting to stop debugging
                var caller = Function.prototype.constructor.caller; // Non-standard hack to get the function caller
                var callerContent = caller.toString();
                if (callerContent.includes(/\bdebugger\b/gi)) { // Eliminate all debugger statements from the caller, if any
                    callerContent = callerContent.replace(/\bdebugger\b/gi, ''); // Remove all debugger expressions
                    eval('caller = ' + callerContent); // Replace the function
                }
                return (function () {});
            }
        }
        // Execute the normal function constructor if nothing unusual is going on
        return _constructor.apply(this, arguments);
    };
})();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顶吮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粪薛,更是在濱河造成了極大的恐慌悴了,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件违寿,死亡現(xiàn)場離奇詭異湃交,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)藤巢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門搞莺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掂咒,你說我怎么就攤上這事才沧÷鹾恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵温圆,是天一觀的道長挨摸。 經(jīng)常有香客問我,道長岁歉,這世上最難降的妖魔是什么得运? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锅移,結(jié)果婚禮上熔掺,老公的妹妹穿的比我還像新娘。我一直安慰自己非剃,他們只是感情好置逻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著努潘,像睡著了一般诽偷。 火紅的嫁衣襯著肌膚如雪坤学。 梳的紋絲不亂的頭發(fā)上疯坤,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音深浮,去河邊找鬼压怠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛飞苇,可吹牛的內(nèi)容都是我干的菌瘫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼布卡,長吁一口氣:“原來是場噩夢啊……” “哼雨让!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忿等,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤栖忠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贸街,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庵寞,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年薛匪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捐川。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逸尖,死狀恐怖古沥,靈堂內(nèi)的尸體忽然破棺而出瘸右,到底是詐尸還是另有隱情,我是刑警寧澤岩齿,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布尊浓,位于F島的核電站,受9級特大地震影響纯衍,放射性物質(zhì)發(fā)生泄漏栋齿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一襟诸、第九天 我趴在偏房一處隱蔽的房頂上張望瓦堵。 院中可真熱鬧,春花似錦歌亲、人聲如沸菇用。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惋鸥。三九已至,卻和暖如春悍缠,著一層夾襖步出監(jiān)牢的瞬間卦绣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工飞蚓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤港,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓趴拧,卻偏偏與公主長得像溅漾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子著榴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容