1. 程式人生 > >Unity3D專案程式加密1——在Unity3D裡使用自己的dll和生成dll

Unity3D專案程式加密1——在Unity3D裡使用自己的dll和生成dll

轉載自:http://liweizhaolili.blog.163.com/blog/static/1623074420144313825921/


如果稍微關注過這方面知識的朋友,應該知道Unity3D做出來的專案是非常容易被反編譯的,被反編譯後你的所有資源和程式碼都將會毫無遮掩的呈現出來。由於.net本身沒什麼加密的措施,所以我們一般都是使用混淆程式碼的方式來對程式進行一定的加密。

接下來2篇部落格,阿趙將會簡單的講一下我自己在Unity3D的程式加密做法。首先第一篇,我會簡單的說明一下怎樣在Unity3D裡面使用dll動態連結庫,然後第二篇會說明怎樣對dll進行混淆。
開始第一篇的內容: 首先,我們需要新建一個類庫專案,可以使用Visual Studio或者Monodevelop來做。我這裡是使用vs2012來建立: Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙
  Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙 選擇好專案型別、寫好專案名稱。   新生成的專案裡面預設有一個Class1類
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   可以通過在解決方案資源管理器裡面進行重新命名改成自己想要的類名,比如我這裡改成了Math3D
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   然後寫一個簡單的靜態方法在裡面。這裡我寫了個最簡單的加法(Add)。也可以不寫靜態方法,寫出普通的public方法,用的時候new物件出來呼叫該方法也可以。這和正常的C#程式設計沒區別。
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   寫好之後,在資源管理器裡面選擇“生成”,那麼在專案的bin/debug 裡面就會看到dll檔案,比如我這個額專案就是AzhaoDll.dll
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙
 
接下來在Unity3D裡面建立你需要的專案,把剛才的dll檔案隨便放到專案的Assets資料夾裡面。關於這個dll檔案的存放位置,網上有些人說是必須放在外掛資料夾裡面,其實是不需要的,放在任意位置它都能被識別出來。當然,按照良好的專案路徑習慣,我們建立一個專門放外掛的資料夾來存放dll檔案,也是合理的。
然後在Unity3D裡面建立一個C#指令碼,寫一行簡單的程式碼來呼叫我們剛才寫的Math3D.Add方法。   Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙
這時會發現Math3D類不能識別,我們using AzhaoDll名稱空間
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙

然後在Unity3D裡把指令碼掛到攝像機上,執行,可以看到打印出正確的結果了,這就證明了dll已經被成功呼叫了。   Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙
 回顧剛才我們做的一些小細節,在類庫專案的Math3D類裡面。我們預設的使用了AzhaoDll名稱空間。那麼假如我們不使用名稱空間,或者使用其他的名稱空間行不行?答案是可以的,名稱空間可以任意的更改,如果不用名稱空間,那麼在呼叫的時候就不需要using,如果使用了其他名稱空間,對應的using其名稱空間就行了。 以下試試把名稱空間刪掉: Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   那麼在Unity3D裡面呼叫就直接可以用了:
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙  執行的結果也是正常的: Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙
當然,不太建議不使用名稱空間,這樣做一個說明,是因為unity3D本身建立的指令碼預設沒有使用名稱空間,只是想說明如果不想麻煩,直接把Unity3D沒有名稱空間的指令碼直接拿來編譯也是可以的。
再次回顧細節,剛才我們使用的是原生的C#,假如我們需要在類庫專案寫呼叫Unity3D本身功能的方法怎樣辦呢? 在Unity3D的安裝目錄Editor\Data\Managed裡面,找到UnityEditor.dll和UnityEngine.dll兩個檔案。  Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙  然後在類庫專案裡面新增引用,把這兩個dll新增進來 Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   這時候,我們就可以在類庫專案裡面using UnityEngine來使用Unity3D的方法了,比如我們這裡簡單寫了個CreateGameObject方法,生成一個名字為“CreateByDll”的gameobject。 Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙  
 生成dll,放回Unity3D專案裡,我們就可以呼叫這個方法:
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙 執行,看到這個叫做“CreateByDll”的物體生成出來了。   Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   通過以上的說明,我們會發現其實生成自己的dll在Unity3D裡面用是很簡單的事情。我們還可以新增其他自己寫好的類進類庫專案,然後生成dll來使用。
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙   最後說一下注意事項了。 剛才生成的dll在Unity3D編輯器裡面基本上都是能用的,但不一定能通過編譯。有可能在編譯成exe或者apk等時會報錯。 需要注意的是,類庫專案使用的.Net Framework版本。我自己的嘗試是,使用.Net 4.0以上版本釋出的dll,在Unity3D裡面會編譯不通過。所以我們可以用2.0或者3.0之類的版本來發布。
Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙  還有一些情況是某些現成的dll動態庫是使用完整的.Net2.0來發布的,所以我們在編譯的時候有可能需要選擇完整的.Net 2.0來發布。 Unity3D專案程式加密1——在Unity3D裡使用自己的dll - 阿趙 - 窮到掉渣的超級奶爸阿趙
到了這一步,我們就可以把Unity3D的整個程式碼資料夾裡面所有的指令碼剪下到類庫專案裡面生成dll,然後放回Unity3D專案裡面。這樣別人就不能直接的編輯我們專案裡面的程式碼了。
不過dll本身是不安全的,別人可以很容易看到裡面的內容。下一篇部落格我們再說明怎樣去給dll做混淆。