Unity3D專案程式加密——對dll進行混淆
阿新 • • 發佈:2019-02-05
這裡假設我們在Unity3D裡面寫的程式碼抽象成這樣一個Test類,裡面包含了公開和私有的變數,有自帶的Start方法、Update方法和OnGUI方法,還有public、private和protected方法。雖然說用抽象類代表了專案裡面實際的類,但為了可以看得到程式碼效果,所以在方法裡面大概寫了一些簡單的列印的命令。
把這個Test類放到上次的類庫專案裡面,然後生成dll,放到Unity3D專案裡面: 其實要看到dll裡面的內容,很多軟體都可以,我們這裡就拿Unity3D自帶的MonoDevelop來看。找到引用裡面的dll檔案,這裡是AzhaoDll.dll。
可以直接瀏覽到dll裡面的內容,看看剛才那個Test類,是不是每一個變數、每一個方法都一字不缺的顯示出來了?
還有上次寫的Math3D方法,也能直接看得到。 dll就是這麼不保險的一個東西,所以我們要引入這一篇文章的內容:對Dll進行混淆。 .Net的程式碼混淆器有好幾種,比如VS自帶的DotFuscator、小巧的Reactor,或者相對比較專業的xeoncode。 這裡我使用了xeoncode 2010版本。 介面如下:
來到Application,可以新增dll檔案:
選擇需要混淆的dll:
然後在Project可以看到dll裡面的類、變數和方法。看到某些變數和方法前面打了勾,這是需要混淆的意思,這個可以自己調整,後面再說: 在Output裡面選擇一個輸出的路徑:
然後點選右下角的Build Application,就可以釋出混淆好的dll。
把混淆好的dll放回Unity3D專案,就可以看到,這次的dll裡面出現了很多隨機數字和字母組成的變數名稱和方法名稱:
仔細的看,可以看出,剛才打鉤了的方法和變數都變成亂碼名稱,然後在方法呼叫裡面也會發生一些變化,除了名稱改變以後,程式碼本身也會發生一些變化,沒有之前那麼直接的顯示出呼叫的情況,如果是複雜的呼叫,將會出現goto來代替了。 這樣一來,就算是寫程式碼的人自己也很難看得明白這些程式碼了。當然如果真的非常有心的逐個變數方法名稱去對應,逐個goto呼叫去查詢,也還是可以還原的,但估計很少人會話這個功夫去做這種事情。到這裡,混淆的目的就達到了。 不過現在拿這個dll去實際執行,會發現出現很多問題的,比如Unity3D自帶的方法Start、Update之類的是不會執行的。這是因為混淆的時候把一些不應該混的東西給混淆了。 那麼接下來就說一下注意的事項: 1、public和protected的變數和方法,預設是不會混淆的,你也可以手動的把勾打上,讓它混淆,不過由於這些是被外部呼叫的變數和方法,你混淆了它的名稱,那麼外部呼叫的時候是必然出錯的。 2、像Unity3D的Start、Update、OnGUI等MonoBehaviour自帶的方法,都是具有特定含義的,雖然是私有方法,但也不應該混淆,不然到了該執行的時候就不會執行了。 3、某些有特定含義的名稱,或者有用到使用字串來識別變數或者方法名稱時,這些方法和字串都不應該混淆,不然也會出現呼叫不到的情況。
把這個Test類放到上次的類庫專案裡面,然後生成dll,放到Unity3D專案裡面: 其實要看到dll裡面的內容,很多軟體都可以,我們這裡就拿Unity3D自帶的MonoDevelop來看。找到引用裡面的dll檔案,這裡是AzhaoDll.dll。
可以直接瀏覽到dll裡面的內容,看看剛才那個Test類,是不是每一個變數、每一個方法都一字不缺的顯示出來了?
還有上次寫的Math3D方法,也能直接看得到。 dll就是這麼不保險的一個東西,所以我們要引入這一篇文章的內容:對Dll進行混淆。 .Net的程式碼混淆器有好幾種,比如VS自帶的DotFuscator、小巧的Reactor,或者相對比較專業的xeoncode。 這裡我使用了xeoncode 2010版本。 介面如下:
選擇需要混淆的dll:
然後在Project可以看到dll裡面的類、變數和方法。看到某些變數和方法前面打了勾,這是需要混淆的意思,這個可以自己調整,後面再說: 在Output裡面選擇一個輸出的路徑:
然後點選右下角的Build Application,就可以釋出混淆好的dll。
把混淆好的dll放回Unity3D專案,就可以看到,這次的dll裡面出現了很多隨機數字和字母組成的變數名稱和方法名稱:
仔細的看,可以看出,剛才打鉤了的方法和變數都變成亂碼名稱,然後在方法呼叫裡面也會發生一些變化,除了名稱改變以後,程式碼本身也會發生一些變化,沒有之前那麼直接的顯示出呼叫的情況,如果是複雜的呼叫,將會出現goto來代替了。 這樣一來,就算是寫程式碼的人自己也很難看得明白這些程式碼了。當然如果真的非常有心的逐個變數方法名稱去對應,逐個goto呼叫去查詢,也還是可以還原的,但估計很少人會話這個功夫去做這種事情。到這裡,混淆的目的就達到了。 不過現在拿這個dll去實際執行,會發現出現很多問題的,比如Unity3D自帶的方法Start、Update之類的是不會執行的。這是因為混淆的時候把一些不應該混的東西給混淆了。 那麼接下來就說一下注意的事項: 1、public和protected的變數和方法,預設是不會混淆的,你也可以手動的把勾打上,讓它混淆,不過由於這些是被外部呼叫的變數和方法,你混淆了它的名稱,那麼外部呼叫的時候是必然出錯的。 2、像Unity3D的Start、Update、OnGUI等MonoBehaviour自帶的方法,都是具有特定含義的,雖然是私有方法,但也不應該混淆,不然到了該執行的時候就不會執行了。 3、某些有特定含義的名稱,或者有用到使用字串來識別變數或者方法名稱時,這些方法和字串都不應該混淆,不然也會出現呼叫不到的情況。
以上是簡單的使用方法,具體的情況可能要到真正用的時候才會出現,所以就隨機應變了。