最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解常見(jiàn)的JavaScript混淆類型

 更新時(shí)間:2025年08月20日 08:58:21   作者:shenyan~  
JavaScript代碼混淆通過(guò)多種技術(shù)方法來(lái)增加代碼的復(fù)雜性,使其在反編譯、逆向工程和調(diào)試時(shí)難以理解和分析,這篇文章主要介紹了常見(jiàn)JavaScript混淆類型的相關(guān)資料,需要的朋友可以參考下

一、變量/函數(shù)名混淆

原理:將有意義的變量名替換為無(wú)意義的短名(如 _0xabc12, a, b1),讓代碼失去可讀性。

示例

function _0x1f2a(_0x1234) {
  console['log'](_0x1234);
}
_0x1f2a('你好');

原始邏輯是:

function sayHello(name) {
  console.log(name);
}
sayHello('你好');

目的:隱藏函數(shù)功能,增加逆向難度。

解決方法

  • 使用 js-beautify 美化代碼

  • 使用 Babel AST 或正則替換還原變量名

  • 人工或自動(dòng)語(yǔ)義命名(如 第一層, 參數(shù)1, 輸出)

二、字符串混淆

原理:將字符串轉(zhuǎn)為 Hex、Unicode、Base64 等格式,運(yùn)行時(shí)再解密。

示例

var a = '\x63\x6f\x6e\x73\x6f\x6c\x65';  
var b = a + '\x2e\x6c\x6f\x67';  
eval(b + '("hello")');

等價(jià)于:

console.log("hello");

目的:隱藏字符串內(nèi)容,如 API、函數(shù)名、密鑰。

解決方法

  • console.log 打印 eval 參數(shù)

  • 寫腳本解碼 hex/base64/unicode

  • Babel AST 靜態(tài)替換解碼函數(shù)

三、控制流扁平化

原理:將原本順序執(zhí)行的代碼拆成塊,用 switch/while/jump 執(zhí)行,打亂執(zhí)行順序。

示例

(function(){
  var _idx = 0;
  var _arr = ['a', 'b', 'c'];
  while(true){
    switch(_arr[_idx++]) {
      case 'a': console.log("1"); break;
      case 'b': console.log("2"); break;
      case 'c': return;
    }
  }
})();

目的:打亂邏輯結(jié)構(gòu),阻止靜態(tài)分析。

解決方法

  • 靜態(tài)分析 switch case 執(zhí)行順序

  • 用 Babel 拆成順序邏輯

  • 人工逐步調(diào)試每一步

四、數(shù)組映射字符串

原理:把關(guān)鍵字符串存在數(shù)組中,用數(shù)組下標(biāo)訪問(wèn)調(diào)用。

示例

var arr = ['log', 'hello'];
console[arr[0]](arr[1]);

等價(jià)于:

console.log("hello");

目的:隱藏調(diào)用結(jié)構(gòu)。

解決方法

  • 使用腳本將數(shù)組反查原值并替換所有引用

  • Babel traverse 實(shí)現(xiàn)自動(dòng)替換

五、多層 eval

原理:用多層嵌套的 eval 執(zhí)行,防止靜態(tài)閱讀和調(diào)試。

示例

eval(eval("String.fromCharCode(99,111,110,115,111,108,101)+'.log(\"hi\")'"));

最終等價(jià)于:

console.log("hi");

解決方法

  • Hook eval 函數(shù)打印執(zhí)行參數(shù)

  • console.log 替代 eval 查看內(nèi)部結(jié)構(gòu)

  • 把 eval 參數(shù)提取出來(lái)還原

六、new Function 動(dòng)態(tài)執(zhí)行

原理:new Function() 構(gòu)造運(yùn)行時(shí)代碼。

示例

var fn = new Function('console.log("hi")');  
fn();

目的:等價(jià)于 eval,隱藏邏輯。

解決方法

  • 替換為 console.log 輸出代碼內(nèi)容

  • 在瀏覽器中注入 Hook Function 構(gòu)造器

七、動(dòng)態(tài)網(wǎng)絡(luò)加載代碼

原理:運(yùn)行時(shí)從網(wǎng)絡(luò)下載 JS 腳本,使用 evalscript 標(biāo)簽執(zhí)行。

示例

fetch('/api/js').then(r => r.text()).then(eval);

目的:繞過(guò)靜態(tài)分析,延遲投毒。

解決方法

  • 抓包獲取真實(shí)腳本內(nèi)容

  • 屏蔽動(dòng)態(tài)加載,分析本地腳本

  • Hook fetch / xhr 返回體

八、JS VM 虛擬機(jī)混淆

原理:把 JS 編譯成字節(jié)碼,運(yùn)行一個(gè)自定義解釋器執(zhí)行。

示例

var code = [0x12, 0x34, 0x78];  
MyVM.run(code);

目的:完全隱藏真實(shí)邏輯,甚至加殼。

解決方法

  • 分析 VM 實(shí)現(xiàn),還原 opcode 與行為映射

  • 手動(dòng)構(gòu)建 opcode -> JS 代碼的轉(zhuǎn)換腳本

  • 跟蹤運(yùn)行行為,dump 中間變量

九、JSFuck 編碼混淆

原理:用僅 [ ] ( ) + ! 六個(gè)字符實(shí)現(xiàn) JS 代碼。

示例

[][(![]+[])[+[]]+([][[]]+[])[+!+[]]+...][([]+[])[+[]]+...][([]+[])[+[]]+...]('alert(1)')();

解決方法

  • 使用 https://enkhee-osiris.github.io/Decoder-JSFuck/ 解碼

  • 手寫 JSFuck 解碼器或 AST 解析器還原

十、反調(diào)試/反控制臺(tái)

原理:檢測(cè)是否打開(kāi)了 devtools 調(diào)試器,阻止控制臺(tái)輸出。

示例

setInterval(function(){
  if(window.outerHeight - window.innerHeight > 100) {
    alert("調(diào)試器檢測(cè)");
  }
}, 1000);

目的:防止調(diào)試器斷點(diǎn)分析。

解決方法

  • 注釋相關(guān)檢測(cè)代碼

  • 重寫相關(guān)函數(shù)如 console.log, window.outerHeight

  • 使用無(wú)頭瀏覽器配合 bypass 技術(shù)

十一、實(shí)戰(zhàn)舉例

11.1 混淆代碼

(function (_0x3f12d1, _0x1b23f4) {
    var _0xabc123 = function (_0x5a72c1) {
        while (--_0x5a72c1) {
            _0x3f12d1['push'](_0x3f12d1['shift']());
        }
    };
    _0xabc123(++_0x1b23f4);
})(['log', 'Hello\x20World'], 0x1);

var _0x55ee = function (_0x1d3f84, _0x2f7e3b) {
    _0x1d3f84 = _0x1d3f84 - 0x0;
    var _0x4328cb = ['log', 'Hello World'];
    return _0x4328cb[_0x1d3f84];
};

console[_0x55ee(0x0)](_0x55ee(0x1));

11.2 初步分析

混淆點(diǎn):

  • 立即執(zhí)行函數(shù) IIFE 中對(duì)數(shù)組進(jìn)行了 shift/rotate 操作

  • _0x55ee 是一個(gè)偏移映射函數(shù)(類數(shù)組解碼)

  • 控制臺(tái)調(diào)用變成了動(dòng)態(tài)索引訪問(wèn)

目標(biāo)是還原出最原始的代碼。

11.3 逐步還原

步驟 1:恢復(fù) IIFE 之后的數(shù)組內(nèi)容

(function (_0x3f12d1, _0x1b23f4) {
    var _0xabc123 = function (_0x5a72c1) {
        while (--_0x5a72c1) {
            //arr.shift():移除并返回?cái)?shù)組開(kāi)頭的元素。
            //arr.push(value):將一個(gè)元素添加到數(shù)組末尾。
            _0x3f12d1['push'](_0x3f12d1['shift']());
        }
    };
    _0xabc123(++_0x1b23f4);
})(['log', 'Hello World'], 0x1);

執(zhí)行邏輯等價(jià)于:

let arr = ['log', 'Hello World'];
arr.push(arr.shift()); // 'log' 被移到最后
// => ['Hello World', 'log']

所以 _0x55ee 實(shí)際訪問(wèn)的是:

['Hello World', 'log']

但是注意:混淆里寫的是 ['log', 'Hello World'],所以 IIFE 執(zhí)行后變成 ['Hello World', 'log']

步驟 2:解讀 _0x55ee 作用

var _0x55ee = function (_0x1d3f84, _0x2f7e3b) {
    _0x1d3f84 = _0x1d3f84 - 0x0;
    var _0x4328cb = ['log', 'Hello World'];
    return _0x4328cb[_0x1d3f84];
};

但注意:這個(gè)數(shù)組 ['log', 'Hello World'] 是原始的,沒(méi)有做 shift。

所以這里 _0x55ee(0x0) 實(shí)際返回的是 'log',_0x55ee(0x1) 返回 'Hello World'。

步驟 3:替換 console 調(diào)用部分

console[_0x55ee(0x0)](_0x55ee(0x1));

等價(jià)于:

console['log']('Hello World');

11.4 還原代碼

完全還原結(jié)果如下:

console.log('Hello World');

11.5 總結(jié)分析

混淆點(diǎn)意圖解決方式
數(shù)組移位打亂數(shù)組索引邏輯運(yùn)行一次 IIFE 獲取結(jié)果
索引函數(shù) _0x55ee模擬字符串映射提前計(jì)算函數(shù)返回值并替換
動(dòng)態(tài)調(diào)用 console[...]避免搜索關(guān)鍵字靜態(tài)替換成 console.log

總結(jié) 

到此這篇關(guān)于JavaScript混淆類型的文章就介紹到這了,更多相關(guān)JS混淆類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

湄潭县| 牡丹江市| 凉山| 寿宁县| 永福县| 通辽市| 扶风县| 郯城县| 麦盖提县| 凤台县| 石阡县| 宣恩县| 靖州| 修文县| 张家界市| 资兴市| 井陉县| 万全县| 晋江市| 曲沃县| 西乌珠穆沁旗| 定兴县| 炉霍县| 岑溪市| 海城市| 黑水县| 明星| 滕州市| 余干县| 林州市| 武宣县| 宝兴县| 通州区| 丽江市| 河津市| 太湖县| 仁怀市| 乐至县| 石渠县| 石门县| 鲁山县|