JS奇淫技巧:一行指派語句,能玩出多少花樣?
今天,來做個測試,看看一行簡單的JS指派語句,有多少種寫法。
測試語句,僅三行:
var a=1;
a=2;
console.log(a);
針對第二行a=2指派,看能變多少花樣。
第一種變化、寫入到自執行函數中:
var a=1;
(function(){
a=2;
})();
console.log(a);
第二種變化、用eval執行:
var a=1;
eval(a=2);
console.log(a);
這兩種,都比較初級,小白等級的程式員也能輕松看懂。
接下來,提升一些難度。
第三種變化、變形的eval執行:
對eval中的指派語句,進行一些變化。
var a=1;
var b=["a","=",2];
eval(b[0]+b[1]+b[2]);
console.log(a);
但eval,似乎也就能玩到這個水準。下面再展示些難度更高的。
第四種變化、利用構造函數:
var a=1;
[].constructor.constructor(a=2);
console.log(a);
或:
var a=1;
[].constructor.constructor(a=2)();
console.log(a);
第五種變化、構造函數再更新:
var a=1;
var b=["a","=",2];
[].constructor.constructor(b[0]+b[1]+b[2])();
console.log(a);
如同eval執行内容變化一樣,對構造執行代碼也用數組内容拼接的方式進行變形:
第六種變化、構造函數變形:
将構造字元也放入數組中:
var a=1;
var b=["a","=",2,"constructor"];
[][b[3]][b[3]](b[0]+b[1]+b[2])();
console.log(a);
第七種變化、混淆加密:
将上面的JS代碼用JShaman進行混淆加密:
得麼混淆加密的JS代碼,這時數值也被加密:
/*Obfuscated by JShaman.com*/
var a=0x2c0f8^0x2c0f9;
var b=['a','=',0xe3b2c^0xe3b2e,'constructor'];
[][b[0xa8ddf^0xa8ddc]][b[0xb3a35^0xb3a36]](b[0x3333f^0x3333f]+b[0x84d18^0x84d19]+b[0x50958^0x5095a])();
console['log'](a);
玩這些花樣有什麼用處嗎?
當然是有的,最後得到的代碼,完全看不出是在執行a=2,指派操作被隐藏了: