原創(chuàng)|行業(yè)資訊|編輯:李顯亮|2020-12-10 10:30:26.377|閱讀 515 次
概述:JSDefender保護(hù)JavaScript代碼免受黑客,逆向工程師和其他惡意行為者的侵害。本文來了解一下都有哪些保護(hù)方法。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
JavaScript無處不在。它是目前世界上最受歡迎的編程語言。正如GitHub所指出的那樣,JavaScript的貢獻(xiàn)者和存儲(chǔ)庫數(shù)量最多,輕松超過了其他替代方法,例如Python,PHP和Ruby。
JavaScript語言強(qiáng)大的同時(shí)也存在著風(fēng)險(xiǎn),大量出色的開源代碼為內(nèi)部開發(fā)團(tuán)隊(duì)和惡意行為者創(chuàng)造了機(jī)會(huì)。JavaScript代碼的普遍存在和易于開發(fā)也增加了安全漏洞的總體風(fēng)險(xiǎn)。鑒于JavaScript支持的應(yīng)用程序和服務(wù)種類繁多,即使是很小的漏洞,也可能使企業(yè)遭受IP盜竊,收入損失或聲譽(yù)受損的威脅。
JSDefender保護(hù)JavaScript代碼免受黑客,逆向工程師和其他惡意行為者的侵害。在本文中來了解一下都有哪些保護(hù)方法。
此技術(shù)使用等效的表達(dá)式(但不太直接)替換了"true"和"false"Boolean文字值。
這個(gè)技術(shù)防止受保護(hù)的代碼從當(dāng)代碼調(diào)用的方法在控制臺(tái)上顯示信息console的對象,例如console.log,console.info等重要:變換不會(huì)刪除console從代碼-相關(guān)方法調(diào)用,它僅僅抑制它們。
該技術(shù)使用條件表達(dá)式替換函數(shù)參數(shù)中的整數(shù)文字,這些條件表達(dá)式使用在JSDefender運(yùn)行時(shí)中聲明的特殊保護(hù)條件。假設(shè)您有以下函數(shù)調(diào)用:
displayNumbers(1, 10);
此保護(hù)技術(shù)將用類似于以下內(nèi)容的受保護(hù)版本替代它:
displayNumbers(Ecrt.wr(123) ? 1 : 3, Ecrt.wr(14) ? 7: 10);
此保護(hù)技術(shù)將代碼注入受保護(hù)的源,該代碼將測試當(dāng)前日期是否在特定間隔內(nèi)。如果是這樣,代碼將正常運(yùn)行;否則,它將在日期測試階段之后立即中斷。
這種保護(hù)技術(shù)debugger從代碼中刪除了JavaScript語句。
此保護(hù)技術(shù)將代碼添加到JSDefender運(yùn)行時(shí),該運(yùn)行時(shí)檢測在瀏覽器中是否打開了DevTools面板。如果是這樣,保護(hù)腳本將在斷點(diǎn)處連續(xù)停止程序,并且不允許黑客對其進(jìn)行調(diào)試。要繼續(xù)運(yùn)行程序,攻擊者必須關(guān)閉DevTools面板。在預(yù)先配置的停止次數(shù)之后,運(yùn)行系統(tǒng)將代碼聲明為無效。
這種保護(hù)技術(shù)在代碼中收集相鄰的表達(dá)式語句,并將它們連接到表達(dá)式序列中。
原始代碼:
(function x() { y = 3; z = 4; return y*z; })()
混淆代碼:
(function x() { return y=3, z=4, y*z; })()
該技術(shù)分析代碼中的控制流語句(if語句和循環(huán)),并將其轉(zhuǎn)換為有限狀態(tài)機(jī)。這種混淆使代碼的控制流更難遵循,尤其是在if嵌套語句和循環(huán)時(shí)。
這種保護(hù)技術(shù)在源代碼中收集函數(shù)聲明,然后將它們分散在它們的聲明范圍內(nèi)。
常用的全局對象和功能,如window,navigator,Object,String,setTimeout,和其他許多人給出了逆向工程的代碼有用的提示。全局對象隱藏保護(hù)技術(shù)對這些對象使用間接引用,并將它們隱藏在保護(hù)對象內(nèi)。攻擊者將看到無意義的損壞名稱,而不是全局對象標(biāo)識(shí)符。
此方法用產(chǎn)生相同值的表達(dá)式替換整數(shù)文字。由于替換使用十進(jìn)制,八進(jìn)制和十六進(jìn)制文字的組合,因此原始值并不明顯。您可以定義整數(shù)范圍以應(yīng)用此轉(zhuǎn)換。另外,您可以定義一個(gè)基數(shù)(二進(jìn)制,十進(jìn)制,十六進(jìn)制,八進(jìn)制)以轉(zhuǎn)換任何其他整數(shù)文字。
此技術(shù)重命名了本地聲明的標(biāo)識(shí)符(例如變量,函數(shù)和類)。您可以從多種名稱處理方法中進(jìn)行選擇。JSDefender注意新創(chuàng)建的名稱不會(huì)與現(xiàn)有名稱沖突。同樣,全局聲明名稱(在受保護(hù)代碼外部聲明的標(biāo)識(shí)符)保持不變。
JSDefender將直接屬性訪問表達(dá)式更改為間接(索引或計(jì)算)屬性表達(dá)式。讓我們來看一個(gè)例子:
var x = { get: function() { return x.myProp; } }
保護(hù)后,此代碼如下所示:
var x={ ["get"]: function(){ return x["myProp"]; } }
將對象文字表達(dá)式賦值轉(zhuǎn)換為多個(gè)賦值語句,使它們更難閱讀。
原始代碼:
let x = { w: 1, z: { x: 3, y: 4}, q: "hello" }
稀疏屬性后的代碼:
let IcwE = {}; IcWE.w = 1; IcwE.z = {}; IcwE.z.x = 3; IcwE.z.y = 4; IcwE.q = "hello"; let x = IcwE
JSDefender從代碼中提取字符串文字,并將其編碼形式放入常量變量中。然后,它將原始字符串文字替換為對相應(yīng)變量的引用。讓我們來看一個(gè)例子:
var greet = "hello"; var planet = "world";
保護(hù)后,此代碼類似于:
const kK1K=IcZK.xb("{v\x7F\x7F|"); const E7TK=IcZK.xb("d|a\x7Fw"); var greet=kK1K; var planet=E7TK;
該技術(shù)將函數(shù)聲明,函數(shù)表達(dá)式,對象和類方法聲明包裝到一個(gè)保護(hù)函數(shù)中。該函數(shù)會(huì)觀察其主體(因此是原始的類似函數(shù)的構(gòu)造)是否被篡改。即使在功能主體中插入單個(gè)空格或換行符也將阻止其正常運(yùn)行。
這樣的保護(hù)可能具有高的運(yùn)行時(shí)間成本。盡管對于僅在代碼中運(yùn)行一次的函數(shù)和IIFE(立即調(diào)用的函數(shù)表達(dá)式)而言,這是非常便宜的,但對于頻繁調(diào)用的函數(shù)而言,這可能會(huì)很昂貴。
當(dāng)您打開此保護(hù)時(shí),JSDefender僅將其應(yīng)用于被認(rèn)為一次執(zhí)行的IIFE。
這種技術(shù)將變量的聲明和初始化分開。它將聲明部分移到聲明范圍的末尾。讓我們來看一個(gè)例子:
原始代碼:
var a = 234, b = 123; displayNumbers(a, b); // ... Several hundred lines of code
應(yīng)用變量分組后:
a = 234; b = 123; displayNumbers(a, b); // ... Several hundred lines var a, b;
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn