[How2DEOBF] #1 樸素的XOR number混淆
序
? ? ? ? 在對java程序進行保護的時候,我們常常使用混淆(obfuscate)。這使得逆向工作者無法直接對目標程序進行反編譯,或是難以理解目標程序的代碼邏輯。所謂反混淆(deobfuscate)也就是混淆的逆向操作,就是期望將混淆后的目標程序還原成未混淆前的狀態(tài),或者至少還原到可以理解的程度。
? ? ? ??一般而言,目標程序的混淆是由混淆器自動化進行的,這也就是說人工進行反混淆大抵是費時費力,自討苦吃,最好的辦法是,通過編寫相應的反混淆程序,實現(xiàn)反混淆。
? ? ? ??這篇專欄將以最簡單的XOR number混淆為教程。
? ? ? ? 預備知識:ASM-tree api,腦子
確定方針
? ? ? ? 下面展示混淆前后number的對比。
? ? ? ?


? ? ? ? 原先簡單的number變成了如此龐大的XOR們,如果要直接進行分析顯然有些困難??梢园l(fā)現(xiàn),這些XOR運算的結果實際上都是固定的,在java虛擬機對這些instructions進行執(zhí)行之后,最終還是能夠得到混淆前的兩個小number。
? ? ? ? 那么,我們不妨模擬虛擬機的執(zhí)行過程,遍歷方法中的instructions,如果發(fā)現(xiàn)IXOR,就再查看它的前兩個instruction是否是一個固定的integer,若是,則將結果計算出來,把原先的IXOR運算覆蓋,我們就完成了反混淆。
實現(xiàn)
? ? ? ? 這里使用narumii的deobfuscator進行transformer編寫(https://github.com/narumii/Deobfuscator/)雖然這個反混淆器已經(jīng)有了反混淆number的功能,但為了原理的學習,我們將自行編寫。
? ? ? ? 創(chuàng)建一個類,繼承Transformer,隨后實現(xiàn)transform方法。
? ? ? ? 我們遍歷反混淆器加載好的目標程序的class,對每個class的每個method,尋找是否存在IXOR,然后再按照上述的操作實現(xiàn)就行了。

? ? ? ? 加載示例程序后運行,進行transform,我們便得到反混淆后的程序。
? ? ? ? 如此,我們成功實現(xiàn)了一個簡單的transformer。
后記
? ? ? ? 這篇專欄中實現(xiàn)的transformer幾乎可以說是最簡單的一個了,功能也比較單一,事實上的反混淆工作也遠比這困難。不過千里之行始于足下,這算是一個良好的開始。
? ? ? ? 下載示例程序:https://wwcx.lanzoum.com/b032je36d(ethb)