JavaScript中隱藏eval關(guān)鍵字的多種方法
引言
本文介紹了JavaScript中隱藏eval關(guān)鍵字的多種方法,從簡單的字符串拼接和Function構(gòu)造函數(shù),到使用字符編碼動態(tài)生成字符串。更復(fù)雜的方案包括通過JS混淆工具(如JShaman)將代碼轉(zhuǎn)換為難以辨識的格式,甚至模擬虛擬機執(zhí)行字節(jié)碼來重構(gòu)eval。這些技術(shù)通過層層包裝,使原始eval調(diào)用在代碼審計中難以被發(fā)現(xiàn)。
JavaScript中隱藏eval關(guān)鍵字的技巧
某些情況下,我們在進(jìn)行JS編程時,可能想要用eval執(zhí)行一些特殊的代碼,但想不想讓他人輕易看出是使用了eval。那么,就得想辦法隱藏eval關(guān)鍵字了。
簡單的隱藏方法
// 方法1:使用字符串分割
const ev = "ev";
const al = "al";
const hiddenEval = window[ev + al];
// 使用
hiddenEval('console.log("隱藏的eval執(zhí)行")');
// 方法2:通過Function構(gòu)造函數(shù)
const executeCode = new Function('code', 'return eval(code)');
executeCode('2 + 2'); // 返回4
復(fù)雜的隱藏方法
// 使用字符編碼
const encodedEval = () => {
const chars = [101, 118, 97, 108];
const str = String.fromCharCode(...chars);
return window[str];
};
const myEval = encodedEval();
更更更復(fù)雜的隱藏方法
如果還想隱藏的更深,可以再用JShaman進(jìn)行JS代碼混淆加密,上面代碼會變成:
const encodedEval = () => {
const _0x35ea38 = {
"\u006d\u004f\u0067\u006c\u0048": function (_0x55d02e, _0x5cdb2b) {
return _0x55d02e ^ _0x5cdb2b;
},
"\u0076\u006a\u0048\u0044\u0073": function (_0x4c98c3, _0xa2b4f0) {
return _0x4c98c3 ^ _0xa2b4f0;
}
};
const _0x2cd5ff = [0x47a4d ^ 0x47a28, _0x35ea38["\u006d\u004f\u0067\u006c\u0048"](0xd8290, 0xd82e6), _0x35ea38['vjHDs'](0xb9759, 0xb9738), _0x35ea38["\u0076\u006a\u0048\u0044\u0073"](0x7b450, 0x7b43c)];
const _0x3d45d7 = String['fromCharCode'](..._0x2cd5ff);
return window[_0x3d45d7];
};
const myEval = encodedEval();
或:
function _0x927a(opcode) {
var op = {
push: 32,
add: 33,
sub: 34,
mul: 35,
div: 36,
pop: 37,
xor: 38
};
var stack = [];
var ip = -1;
var sp = -1;
while (ip < opcode.length) {
ip++;
switch (opcode[ip]) {
case op.push:
{
ip++;
stack.push(opcode[ip]);
sp++;
break;
}
case op.add:
{
stack.push(stack[sp - 1] + stack[sp]);
sp++;
break;
}
case op.sub:
{
stack.push(stack[sp - 1] - stack[sp]);
sp++;
break;
}
case op.mul:
{
stack.push(stack[sp - 1] * stack[sp]);
sp++;
break;
}
case op.div:
{
stack.push(stack[sp - 1] / stack[sp]);
sp++;
break;
}
case op.xor:
{
stack.push(stack[sp - 1] ^ stack[sp]);
sp++;
break;
}
case op.pop:
{
return stack[sp];
}
}
}
}
const encodedEval = () => {
const chars = [_0x927a([32, 865932, 32, 866025, 38, 37]), _0x927a([32, 625917, 32, 625803, 38, 37]), _0x927a([32, 750963, 32, 750866, 38, 37]), _0x927a([32, 753540, 32, 753640, 38, 37])];
const str = String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](...chars);
return window[str];
};
const myEval = encodedEval();
怎么樣,還能找到eval關(guān)鍵字嗎?
到此這篇關(guān)于JavaScript中隱藏eval關(guān)鍵字的多種方法的文章就介紹到這了,更多相關(guān)JavaScript隱藏eval關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于JavaScript實現(xiàn)字符串計算器的實戰(zhàn)指南
這篇文章主要為大家詳細(xì)介紹了如何基于JavaScript實現(xiàn)字符串計算器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-03-03
TS/JS打包后報Uncaught?ReferenceError:?require?is?not?define
在開發(fā)過程中,我們經(jīng)常會遇到打包報錯的錯誤,這篇文章主要介紹了TS/JS打包后報Uncaught ReferenceError: require is not defined問題的解決辦法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-04-04
JS實現(xiàn)點擊鏈接切換顯示隱藏內(nèi)容的方法
這篇文章主要介紹了JS實現(xiàn)點擊鏈接切換顯示隱藏內(nèi)容的方法,涉及javascript鼠標(biāo)事件響應(yīng)及頁面元素屬性動態(tài)變換相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
javascript 構(gòu)建模塊化開發(fā)過程解析
這篇文章主要介紹了javascript 構(gòu)建模塊化開發(fā)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
讓網(wǎng)站自動生成章節(jié)目錄索引的多個js代碼
這篇文章主要介紹了讓博客園博客自動生成章節(jié)目錄索引的多個js代碼,需要的朋友可以參考下2018-01-01
淺析AMD CMD CommonJS規(guī)范--javascript模塊化加載學(xué)習(xí)心得總結(jié)
下面小編就為大家分享一篇淺析AMD CMD CommonJS規(guī)范--javascript模塊化加載學(xué)習(xí)心得總結(jié)。小編覺得寫的非常不錯,需要的朋友可以過來參考一下2016-03-03
js復(fù)制文本到粘貼板(Clipboard.writeText())
這篇文章主要介紹了js復(fù)制文本到粘貼板(Clipboard.writeText()),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

