首页
/
每日頭條
/
生活
/
js常用套路
js常用套路
更新时间:2024-12-27 20:18:56

JS奇淫技巧:數值的七種寫法

JS奇淫技巧:挑戰前端黑科技,數值的七種寫法,能全看懂的一定是高手

你知道嗎?在JS編程中,數值可以有很多種寫法。

第一種寫法:

一般情況而言,數值就是數值。

比如:

var a = 1;

你可知,這個1可以有很多種變形的寫法,甚至是變态的寫法。

第二種寫法:

var a= !!{};

console.log(a);

js常用套路(數值的七種寫法)1

即:1變成了 !!{}。

數值1為什麼能用 !!{}來表示呢?原因如下:

在JS語法中,!{}是布爾值false,強制轉換成數字為0,!!{}則是true,用 号做強制轉換,變成數值即為1。

以此類推:

2=( !!{}) (!!{})

3=( !!{}) (!!{}) (!!{})

111= (( !!{}) [] ( !!{}) ( !!{}))

第三種寫法:

var a=266119^266118;

console.log(a);

js常用套路(數值的七種寫法)2

即:将異常運算的結果,等于我們使用的數值。

這也就意味着,同一個數,比如1,可以有多種異或寫法,比如:

var a=596219^596218;

var a=115812^115813;

第四種寫法:

var a = function (s, h) {

return s ^ h;

}(719028, 719029);

console.log(a);

js常用套路(數值的七種寫法)3

也就是把第三種寫法中的異或運算變成函數,将異或的兩個數以參數的形式傳入,在函數中運算并返回數值結果。

第五種寫法:

把第三種寫法中的亦或運算轉成ast(抽象語法樹)。

var a = ast({"type":"File","program":{"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"BinaryExpression","left":{"type":"NumericLiteral","value":115812},"operator":"^","right":{"type":"NumericLiteral","value":115813}}}]}});

console.log(a);

js常用套路(數值的七種寫法)4

變成AST之後,還得帶一段執行AST的代碼,也就是AST的解釋器。

當然,這裡是簡單的僅解析異或運算的解釋器:(AST解釋器的雛形)

function ast(node) {

if(node.type == "File"){

return ast_excute(node.program);

}

if(node.type == "Program"){

return ast_excute(node.body[0]);

}

if(node.type == "ExpressionStatement"){

return ast_excute(node.expression);

}

if(node.type == "BinaryExpression"){

var left_value = node.left.value;

var right_value = node.right.value;

var operator = node.operator;

if(operator == "^"){

return left_value ^ right_value;

}

}

}

此操作,等于将異或運算代碼編譯為AST,再帶了一個AST解釋器運行它。

第六種寫法

eval的使用。

直接的寫法:

var a = eval(1);

console.log(a);

js常用套路(數值的七種寫法)5

Eval的變形寫法:

var a = window[(14).toString(32) (31).toString(32) (10).toString(32) (21).toString(32)](1); console.log(a);

js常用套路(數值的七種寫法)6

對方法四的代碼做升級,也可加入eval:

var a = function (s, h) {

return eval(String.fromCharCode(115, 32, 94, 32, 104));

}(678405, 678404);

console.log(a);

js常用套路(數值的七種寫法)7

即:把return s ^ h用eval進行了包裹,并用formCharCode做了加密。

第七種寫法:

構造函數的使用。

與eval有些類似,但eval做為高風險函數,容易被檢測或禁用,因此使用構造函數實現代碼運行,與eval效果類似。

原始形态:

var a = [].constructor.constructor("return 1")();

console.log(a);

js常用套路(數值的七種寫法)8

升級一下,對return語句進行編碼以隐藏關鍵字:

var a = [].constructor.constructor("\u0072\u0065\u0074\u0075\u0072\u006e\u0020\u0031")();

console.log(a);

js常用套路(數值的七種寫法)9

再升級,将constructor字符也隐藏:

var a = []["\u0063\u006f\u006e\u0073\u0074\u0072\u0075\u0063\u0074\u006f\u0072"]["\u0063\u006f\u006e\u0073\u0074\u0072\u0075\u0063\u0074\u006f\u0072"]("\u0072\u0065\u0074\u0075\u0072\u006e\u0020\u0031")();

console.log(a);

js常用套路(數值的七種寫法)10

還有更複雜的寫法:

var $ = ["\u0061", "\u0062", "\u0063", "\u0064", "\u0065", "\u0066", "\u0067", "\u0068", "\u0069", "\u006a", "\u006b", "\u006c", "\u006d", "\u006e", "\u006f", "\u0070", "\u0071", "\u0072", "\u0073", "\u0074", "\u0075", "\u0076", "\u0077", "\u0078", "\u0079", "\u007a", "\u0028", "\u0029", "\u0027", "\u0022", "\u005b", "\u005d", "\u002e"];

var a = [][$[443650 ^ 443648] $[169829 ^ 169835] $[338738 ^ 338751] $[745099 ^ 745113] $[847761 ^ 847746] $[986395 ^ 986378] $[591407 ^ 591419] $[989467 ^ 989465] $[820242 ^ 820225] $[848420 ^ 848426] $[782593 ^ 782608]][$[972307 ^ 972305] $[406834 ^ 406844] $[838220 ^ 838209] $[317151 ^ 317133] $[799896 ^ 799883] $[655841 ^ 655856] $[333562 ^ 333550] $[745730 ^ 745728] $[843076 ^ 843095] $[151776 ^ 151790] $[832229 ^ 832244]]("\u0072\u0065\u0074\u0075\u0072\u006e\u0020\u0031")();

console.log(a);

js常用套路(數值的七種寫法)11

這個方法的原理,在之前的文章《JS奇淫技巧:alert有幾種寫法?》一文中有詳細講解,有興趣的朋友可以去翻看那篇文章。

以上所述技術,由JShaman團隊提供,JShaman是專業的JS代碼混淆加密服務提供方,本文實現的功能大多數已在JShaman官網提供。

js常用套路(數值的七種寫法)12

到此時,還記的本文的标題嗎?

請注意:

[][$[443650 ^ 443648] $[169829 ^ 169835] $[338738 ^ 338751] $[745099 ^ 745113] $[847761 ^ 847746] $[986395 ^ 986378] $[591407 ^ 591419] $[989467 ^ 989465] $[820242 ^ 820225] $[848420 ^ 848426] $[782593 ^ 782608]][$[972307 ^ 972305] $[406834 ^ 406844] $[838220 ^ 838209] $[317151 ^ 317133] $[799896 ^ 799883] $[655841 ^ 655856] $[333562 ^ 333550] $[745730 ^ 745728] $[843076 ^ 843095] $[151776 ^ 151790] $[832229 ^ 832244]]("\u0072\u0065\u0074\u0075\u0072\u006e\u0020\u0031")();

這是數值1。

這便是JS代碼混淆加密的魅力,讓别人無法看懂你的代碼!讓他人看到你的代碼時,隻能會發出“哇”的驚呼,而不敢輕易維護你的代碼,無從下手啊。JS代碼的安全性得到了大大的提升。

這些變态的寫法,你能看懂幾種呢?

或者你有什麼新奇的手法?評論區交流一下吧。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
Copyright 2023-2024 - www.tftnews.com All Rights Reserved