溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript如何實現(xiàn)函數(shù)重定義

發(fā)布時間:2022-03-18 11:09:37 來源:億速云 閱讀:703 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹JavaScript如何實現(xiàn)函數(shù)重定義,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

函數(shù)重定義

這是一種最基本也是最常用的代碼反調(diào)試技術(shù)了。在JavaScript中,我們可以對用于收集信息的函數(shù)進(jìn)行重定義。比如說,console.log()函數(shù)可以用來收集函數(shù)和變量等信息,并將其顯示在控制臺中。如果我們重新定義了這個函數(shù),我們就可以修改它的行為,并隱藏特定信息或顯示偽造的信息。

我們可以直接在DevTools中運(yùn)行這個函數(shù)來了解其功能:

console.log("HelloWorld");
var fake = function() {};
window['console']['log']= fake;
console.log("Youcan't see me!");

運(yùn)行后我們將會看到:

VM48:1 Hello World

你會發(fā)現(xiàn)第二條信息并沒有顯示,因為我們重新定義了這個函數(shù),即“禁用”了它原本的功能。但是我們也可以讓它顯示偽造的信息。比如說這樣:

console.log("Normalfunction");
//First we save a reference to the original console.log function
var original = window['console']['log'];
//Next we create our fake function
//Basicly we check the argument and if match we call original function with otherparam.
// If there is no match pass the argument to the original function
var fake = function(argument) {
    if (argument === "Ka0labs") {
        original("Spoofed!");
    } else {
        original(argument);
    }
}
// We redefine now console.log as our fake function
window['console']['log']= fake;
//Then we call console.log with any argument
console.log("Thisis unaltered");
//Now we should see other text in console different to "Ka0labs"
console.log("Ka0labs");
//Aaaand everything still OK
console.log("Byebye!");

如果一切正常的話:

Normal function
VM117:11 This is unaltered
VM117:9 Spoofed!
VM117:11 Bye bye!

實際上,為了控制代碼的執(zhí)行方式,我們還能夠以更加聰明的方式來修改函數(shù)的功能。比如說,我們可以基于上述代碼來構(gòu)建一個代碼段,并重定義eval函數(shù)。我們可以把JavaScript代碼傳遞給eval函數(shù),接下來代碼將會被計算并執(zhí)行。如果我們重定義了這個函數(shù),我們就可以運(yùn)行不同的代碼了:

//Just a normal eval

eval("console.log('1337')");

//Now we repat the process...

var original = eval;

var fake = function(argument) {

    // If the code to be evaluated contains1337...

    if (argument.indexOf("1337") !==-1) {

        // ... we just execute a different code

        original("for (i = 0; i < 10;i++) { console.log(i);}");

    }

    else {

        original(argument);

    }

}

eval= fake;

eval("console.log('Weshould see this...')");

//Now we should see the execution of a for loop instead of what is expected

eval("console.log('Too1337 for you!')");

運(yùn)行結(jié)果如下:

1337
VM146:1We should see this…
VM147:10
VM147:11
VM147:12
VM147:13
VM147:14
VM147:15
VM147:16
VM147:17
VM147:18
VM147:19

正如之前所說的那樣,雖然這種方法非常巧妙,但這也是一種非?;A(chǔ)和常見的方法,所以比較容易被檢測到。

以上是“JavaScript如何實現(xiàn)函數(shù)重定義”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI