首页
/
每日頭條
/
生活
/
js常用套路
js常用套路
更新时间:2024-04-27 16:19:27

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
推荐阅读
伶仃洋上歎伶仃什麼意思
伶仃洋上歎伶仃什麼意思
【這些文化遺存現今的模樣①】光明日報記者王忠耀吳春燕不論是思憶家鄉,還是遊曆遠方,我們總喜歡追尋一個“古”字、品咂一種“文”氣。于是,刻在記憶深處的,便有了一座巍然城池、一片燈火街市,有了前人登高望遠的樓台、舊時馬蹄聲疾的驿路……這些珍貴遺...
2024-04-27
死亡小習慣
死亡小習慣
因為改到學生許益峰一篇觸動我心的周記,便有了這篇題為《我真想知道死後有什麼感覺》的教育随筆,記錄了師生互動的詳細過程,以及班級裡其他學生的後期參與。在我看來,這是一篇挺有珍藏價值的教育叙事,尤其是文後所附的那些學生的聽後感,實屬可遇不可求。...
2024-04-27
金榜題名決勝千裡
金榜題名決勝千裡
羅小龍:原創初次看到“倒吊驢”的人都會納悶,為什麼這麼殘酷的東西會做為吉祥物做禮品來贈送,乃至于讓寶寶來佩戴,其實“倒吊驢”是古代的一種文化現象,在民間有着廣泛的的傳播和流行,主要有三層意思:意思一:防止小孩哭鬧,綁腿,就是止蹄之意,放在寶...
2024-04-27
海賊王為什麼新生代中将那麼弱
海賊王為什麼新生代中将那麼弱
海賊王是一部非常優秀的動漫作品,下面我們來聊一下海軍本部的最高戰力三大将。想要成為海軍本部的大将,這是非常困難的事情,畢竟海軍大将的選拔非常嚴格,實力也是衡量能否成為大将的重要标準。兩年前的海軍本部三大将分别是青雉,黃猿和赤犬,經過了頂上戰...
2024-04-27
讓所有的回憶都成空
讓所有的回憶都成空
等你等到我心痛—演唱:張學友大家好,這裡是曲中人音樂大賞,今天我們要欣賞的歌曲是張學友的《等你等到我心痛》。專輯《等你等到我心痛》由香港歌手張學友煽情打造,1993年,寶麗金唱片發行。專輯裡的同名歌曲《等你等到我心痛》榮獲1993年香港十大...
2024-04-27
Copyright 2023-2024 - www.tftnews.com All Rights Reserved