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