Ty2y是國內一個JavaScript混淆加密平臺,可以實現在線JS代碼混淆加密。它有多達20多項的參數配置。如下圖所示:
添加圖片注釋,不超過 140 字(可選)
本文將對這些配置實現的混淆加密的效果,進行詳細說明(注:Before是未加密的代碼,Afer是加密后的代碼):
局部變量名混淆
例程:
Beforefunction demo(){ var age=99;}Afterfunction demo(){ var _0xk$r=99;}
全局變量名混淆
例程:
Beforevar age=99;function demo(){ var age = 99;}Aftervar _0xk$r=99;function demo(){ var age = 99;}
局部函數名混淆
例程:
Beforefunction demo(){ var age = 99; function demo_sub(){ }}Afterfunction demo(){ var age = 99; function _0x62a87c(){ }}
全局函數名混淆
例程:
Beforefunction demo(){ var age = 99; function demo_sub(){ }}Afterfunction _0x62ab7d(){ var age = 99; function demo_sub(){ }}
成員函數加密
如對console.log()的log函數加密。
例程:
Beforeconsole.log("demo"); Afterconsole['\x6c\x6f\x67']("demo");
數值常量加密
將數值常量變為運算表達式。
例程:Beforevar num = 123;Aftervar num = 683517 ^ 683398;
二進制表達式混淆
將二進制表達式變形為函數調用表達式。
例程:
Beforevar num = 683517 ^ 683398;Aftervar num = function (s, h) { return s ^ h;}(683517, 683398);
布爾型數值加密
例程:
Beforevar done = true;Aftervar done = !![];
JSON數據加密
注意:需同時啟用“字符串陣列化”和“陣列化加密”。
例程:
Beforevar man = {"name":"tim","age":18};Aftervar _0xeb6d9b=["114.3.41.41.43.103.104.100.108.43.51.41.43.125.96.100.43.37.3.41.41.43.104.110.108.43.51.41.56.49.3.116."];function _0xf72b(str,dy_key){dy_key=9;var i,k,str2="";k=str.split(".");for(i=0;i
-1;i++){str2+=string.fromcharcode(k[i]^dy_key);}return str2;}var="" man="
style="text-shadow: 1px 0px 1px #666666; font-weight:600; opacity:0.8; font-size:10px;">JSON.parse(_0xf72b(_0xeb6d9b[0]));
正則表達式加密
注意:需同時啟用“字符串陣列化”和“陣列化加密”。
例程:
Beforevar r =/regexp test/g;Aftervar _0x796d=["123.108.110.108.113.121.41.125.108.122.125.","110."];function _0xcca(str,dy_key){dy_key=9;var i,k,str2="";k=str.split(".");for(i=0;i
-1;i++){str2+=String.fromCharCode(k[i]^dy_key);}return str2;}var r=new RegExp(_0xcca(_0x796d[0]),_0xcca(_0x796d[1]));
字符串Unicode化加密
例程:
Beforevar obf = "Ty2y JavaScrpt Obfuscator";Aftervar obf = "\u004a\u0053\u0068\u0061\u006d\u0061\u006e\u0020\u004a\u0061\u0076\u0061\u0053\u0063\u0072\u0070\u0074\u0020\u004f\u0062\u0066\u0075\u0073\u0063\u0061\u0074\u006f\u0072";
賦值花指令
對賦值語句右側的內容,如字符串、數值等,進行花指令處理。
例程:
Beforevar name;name = "jack";Aftervar name;name = function () { return "jack";}();
僵尸代碼植入
在代碼中隨機插入僵尸代碼,增加代碼理解難度。
例程:
Beforevar a=1;var b=2;Aftervar _0x;var a = 1;_0x = "jfci";var b = 2;
Eval加密
對特定的語句進行Eval加密
Beforevar a = 1 + 2;Aftervar a = eval(String.fromCharCode(49, 32, 43, 32, 50));
平展控制流
將函數中代碼平坦化,并打亂代碼顯示順序。
例程:
Beforefunction demo(){ var name = "tom"; var age = "18"; return name + age;}Afterfunction demo() { var _array = "1|0|2".split("|"), _index = 0; while (!![]) { switch (+_array[_index++]) { case 0: var age = "18"; continue; case 1: var name = "tom"; continue; case 2: return name + age; continue; } break; }}
收縮控制流
將函數中符合條件的多行代碼收縮為單行,形成逗號運算符語法。
Beforefunction demo(){ var name = "tom"; var age = "18"; return name + age;}Afterfunction demo(name, age) { return age = (name = "tom", "18"), name + age;}
字符串陣列化
將代碼中包含的字字符串集中放置到數組。
例程:
Beforefunction demo(){ var name = "tom"; var age = "18"; return name + age;}Aftervar _0x312g = ["tom", "18"];function demo() { var name = _0x312g[0]; var age = _0x312g[1]; return name + age;}
陣列字符串加密
將陣列中的字符串內容進行加密,使用此選項時,會強制啟用字符串陣列化。
例程:
Beforefunction demo(){ var name = "tom"; var age = "18"; return name + age;}Aftervar _0x=['125.102.100.','56.49.'];function _0xa5bdc(str,dy_key){dy_key=9;var i,k,str2='';k=str.split('.');for(i=0;i
-1;i++){str2+=String.fromCharCode(k[i]^dy_key);}return str2;} function demo() { var name = _0xa5bdc(_0x[0]); var age = _0xa5bdc(_0x[1]); return name + age;}
虛擬機執行保護
將某些代碼轉為虛擬機OP指令,在虛擬機中執行。
例程:
Beforevar num = 1+2;Afterfunction _0xbd18dc(vm_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
switch(vm_opcode[ip]){case op.push:{ip++;stack.push(vm_opcode[ip]);sp++;break;}case op.add:{var op_1=stack[sp-1];var op_2=stack[sp];var value=op_1+op_2;stack.push(value);sp++;break;}case op.sub:{var op_1=stack[sp-1];var op_2=stack[sp];var value=op_1-op_2;stack.push(value);sp++;break;}case op.mul:{var op_1=stack[sp-1];var op_2=stack[sp];var value=op_1*op_2;stack.push(value);sp++;break;}case op.div:{var op_1=stack[sp-1];var op_2=stack[sp];var value=op_1/op_2;stack.push(value);sp++;break;}case op.xor:{var op_1=stack[sp-1];var op_2=stack[sp];var value=op_1^op_2;stack.push(value);sp++;break;}case op.pop:{return stack[sp];}}}}var num=_0xbd18dc([32,1,32,2,33,37]);
AST執行保護
將某些代碼轉為AST,即:抽象語法樹,代碼運行時,直接執行此AST。
例程:
Beforeconsole.log("hello");Aftervar visitors={File(node,scope){ast_excute(node.program,scope);},Program(program,scope){for(i=0;i
return ast_excute(node.expression,scope);},CallExpression(node,scope){var func=ast_excute(node.callee,scope);var args=node.arguments.map(function(arg){return ast_excute(arg,scope);});var value;if(node.callee.type==='MemberExpression'){value=ast_excute(node.callee.object,scope);}return func.apply(value,args);},MemberExpression(node,scope){var obj=ast_excute(node.object,scope);var name=node.property.name;return obj[name];},Identifier(node,scope){return scope[node.name];},StringLiteral(node){return node.value;},NumericLiteral(node){return node.value;}};function ast_excute(node,scope){var evalute=visitors[node.type];if(!evalute){throw new Error("Unknown AST type:",node.type);}return evalute(node,scope);}ast_excute({"type":"CallExpression","callee":{"type":"MemberExpression","object":{"type":"Identifier","name":"console"},"property":{"type":"Identifier","name":"log"}},"arguments":[{"type":"StringLiteral","value":"hello"}]},{console:console});;
保留注釋:保留代碼中的注釋。
代碼壓縮:去除回車換行、空格,壓縮代碼體積。
保留關鍵字:對指定的變量、變量名、函數名不進行加密。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.