一,特殊混淆的還原
1.1 還原 AAEncode 與 JJEncode
AAEncode是一種JavaScript代碼混淆算法,利用它,可以將代碼轉換成 顏文字 表示的JavaScript代碼。
去掉代碼最后的 (‘‘),這是函數的自調用,去除后就是函數的聲明。也可以在去掉 (’’)后,加上 .toString(),進一步將方法轉化成字符串。
JJEncode 的還原方法與 AAEncode 一致。
1.2 還原JSFuck
JSFuck是一種基于JavaScript的極簡編程語言,它使用六個不同的字符來表示所有可能的JavaScript代碼。這六個字符是:! + - * . /。由于其極簡的語法,JSFuck通常用于教學目的,展示編程語言的基本概念,如運算符優先級和變量聲明等。
下面是JSFuck的一些基本操作:
- “!” 代表 NOT 操作,用于翻轉布爾值。
- “+” 代表 ADD 操作,用于加法運算。
- “-” 代表 SUBTRACT 操作,用于減法運算。
- “*” 代表 MULTIPLY 操作,用于乘法運算。
- “.” 代表 DECIMAL POINT 操作,用于在數字中表示小數點。
- “/” 代表 DIVIDE 操作,用于除法運算。
雖然JSFuck只使用六個字符,但它可以表達復雜的JavaScript代碼。例如,下面是一個簡單的JSFuck程序,它將兩個數字相加并輸出結果:
js復制代碼+!!.++[+[+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!]
雖然JSFuck的語法非常簡單,但它并不適合編寫復雜的程序。由于其可讀性和可維護性較差,因此在實際開發中很少使用。
JSFuck能夠使用六個不同的字符來表示所有可能的JavaScript代碼,主要基于以下幾個原因:
- 遞歸和鏈式操作:JSFuck利用了JavaScript中的遞歸和鏈式操作特性。通過連續使用相同的字符,JSFuck可以表示復雜的操作和邏輯。例如,連續的"+“字符可以表示多次的加法操作,連續的”*"字符可以表示多次的乘法操作。
- 位運算:JSFuck也利用了JavaScript中的位運算。通過將數字轉換為二進制位,然后進行一系列的位運算(如NOT、AND、OR等),JSFuck可以表示幾乎所有的數字和布爾邏輯操作。
- 字符編碼:JSFuck還利用了字符編碼的知識。通過將不同的字符組合表示特定的編碼值,JSFuck可以創建出任何想要的字符串或標識符。
- 堆棧操作:JSFuck還利用了堆棧的概念。通過連續的".“和”/"字符,JSFuck可以模擬出堆棧的行為,如入棧、出棧等。
因此,盡管JSFuck只使用六個不同的字符,但它通過遞歸、鏈式操作、位運算、字符編碼和堆棧操作等方式,能夠表示所有可能的JavaScript代碼。
還原JSFuck:
找到代碼最后的一個右括號和其對應的左括號,將中間的內容粘貼到控制臺打印出來,其內容就是傳入的參數,將這部分內容刪除,剩下的過程就和 AAEncode 一樣了。
二,WebAssembly 分析
WebAssembly 是一種可以使用非 JavaScript 編程語言編寫代碼并且能在瀏覽器上運行的技術方案。常見的呈現形式就是 wasm 后綴的文件,即原生代碼被編譯成了 wasm 后綴的文件,JavaScript 通過調用 wasm 文件得到對應的計算結果,然后配合其他 JavaScript 代碼實現頁面數據的加載和頁面的渲染。
示例使用如下:
進入 wasm 文件的 encrypt 方法后,代碼如下:
這里面的邏輯原本是用 C++ 編寫的,通過 Emscripten 轉化為 wasm文 件,就成了上面的代碼形式。
此時已經看不懂了,但可以通過模擬執行的方式得到加密結果:將 wasm 文件下載下來,要使用 python 模擬執行 wasm,可以使用兩個 python 庫,一個是 pywasm,另一個是 wasmer-python,具體內容見崔慶才第11章節內容。
三,繞過無限 debugger
debugger 是 JavaScript 中定義的一個專門用于斷點調試的關鍵字,只要遇到它,JavaScript 的執行便會在此處中斷,進入調試模式。
繞過方式有:
禁用全局斷點,禁用局部斷點(在斷點行右鍵),條件斷點(在斷點行右鍵),替換原始文件等。
禁用全局斷點圖示: