如何防止Unity3D代碼被反編譯?

在網上找了好久,還是沒有找到可行的方法,市面上的除了騰訊的Unity3D遊戲之外都可以使用DisUnity拆包,DotNetReflector很簡單地進行反編譯,再通過dot4net進行反混淆。想請教下,發布出去的Unity3D遊戲如何防止代碼和資源的泄露,或者說騰訊(如:天天打怪獸)是如何做到無法反編譯的。。。


加密原理(無需Unity源碼):

1. IDA Pro打開libmono.so, 修改mono_image_open_from_data_with_name為

mono_image_open_from_data_with_name_0,

2. 替換實現mono_image_open_from_data_with_name,

extern mono_image_open_from_data_with_name_0(...);

mono_image_open_from_data_with_name(...) {

MonoImage *img = mono_image_open_from_data_with_name_0(...);

//發現數據文件頭不是DLL前綴則解密 img-&>raw_data, 相應修改img-&>raw_data_len

return img;

}

3. 重新打包libmono.so; 替換Unity3D中的android下的版本.

4. 另外寫個加密的工具,植入構建環境(MonoDeveloper或VS,添加一個打包後Build Phase來加密DLL); (IOS下禁用JIT固採用AOT編譯,DLL中沒有邏輯代碼,所以無需操心);

從AndroidManifest.xml中可以看出,騰訊的改造應該是修改並替換了入口的classes.dex,把以前的入口 UnityPlayerProxyActivity替換為com.tencent.tauth.AuthActivity. 然後去載入了自定義的幾個so: libNativeRQD.so. 周全考慮,為了防止第三方委託libmono去做解密而做了防護措施. 具體實現我還沒做深入分析, 應該也是老套路.

libmono.so中的mono_image_open_from_data_with_name也被替換成了mono_image_open_from_data_with_name_0.

解密(android):

方法一: ROOT android系統(最好是一部手機,別搞模擬器,慢死), 掛載LD_PRELOAD的API hook來實現.

方法二: 內存特徵碼提取,簡單高效無敵; 機器能讀,你就能讀;

JVM, CLR, AS3之類遊戲通通秒破。有興趣看我微博或留言: codex的微博_騰訊微博


如果你沒有Unity的Source License,這個問題我覺得基本是無解的。

對於iOS平台AOT後Strip掉IL可能有用,但其他平台基本沒什麼辦法。還有一個思路是加殼,但這個至少在移動端上我沒試驗過,而且基本上也是道高一尺魔高一丈的事情。

還有一個是把一些關鍵代碼寫成Native插件,但這樣做我覺得完全就沒有使用Unity的優勢了,所以也不是很推薦。

如果是涉及網路的遊戲,另一個相對有效的解決方案是把邏輯放在服務端,基本上不給客戶端Gameplay邏輯層的信任,客戶端只負責只發送具體操作。對於非在線遊戲我確實沒看到什麼有效的解法。

個人覺得么,也不要太費勁折騰了,人家要搞你總是有辦法的。就算你不用Unity,真的高手是Native Binary一樣破給你看的。


等Unity自帶的IL2CPP,目前只支持WebGL和iOS,全平台要等,混淆加密什麼的太容易破


受邀~

我們是最大的Unity技術社區, 也是Unity的最佳合夥夥伴, 也是Unity商業總代理.

Unity客戶端加密屬於一個商業性的問題.

如果你是unity商業話用戶可以聯繫我, 這邊幫你找到unity原廠人員幫你解決(收費的).

一般Unity項目加密,針對不同的客戶端,web android ios .

不同的客戶端加密方式不同.

大概的價格區間分別在: 5-10w左右.

需要你提供客戶端項目包, 然後這邊給你加密好.


1: 去下載unity3d對應版本mono庫源碼

2:unity3d邏輯代碼dll為Assembly-CSharp.dll 找到mono源碼處理這個dll的函數(網上一大堆自已找)這裡處理解密, 修改好

3:下虛擬機在對應平台重新編譯mono庫

4: 出包更換Assembly-CSharp.dll(這裡可以處理二進位加密)和對應平台的mono庫 重新簽名 第2步是解的就是這裡加的密 這樣外邊的Assembly-CSharp.dll如果不知道你的加密方式就沒法破解,如果想知道 就得反編譯你的mono庫 反出來是機器碼 要花時間去研究


運行安卓直接用gdb dump內存,不管你什麼加密的最終到了內存都是一樣的布局,然並軟。所以這個問題要麼用native的插件(麻煩),要麼就簡單加密過濾掉80%新手破解


騰訊的遊戲用一些工具破解不了,只能看介面


我們項目就不用擔心這個問題,因為我們使用腳本。開發了一年多(5個人), C#代碼 才100個文件。。。


代碼方面:如果你是希望別人不要看到程序的大體思想而不是破解某部分(增加廣告等)的話。可以儘可能地使用coroutine。


在Unity3D中,代碼會編譯到Assembly-CSharp.dll。基於以上兩點,代碼的保護有以下兩種:

第一種是對代碼進行混淆,諸如混淆軟體CodeGuard、CryptoObfuscator、de4dot

第二種是對Assembly-CSharp.dll進行加密後搜索,重新對mono進行編譯。。

Virbox Protector可對Assembly-CSharp.dll直接進行加殼後,無需手動編譯mono,能防止反編譯


到 unity 官網買個插件吧, 我試試好多方法. 最後生成 .apk 都不行.


nity3D使用開源mono C#語法

,所有代碼都不是編譯到EXE,而是位於{APP}uildgame_DataManagedAssembly-CSharp.dll(對於最新的Unity3D 2017不是這樣),而且mono語法只是跟C#兼容,但是原理完全不一樣,傳統的C#加殼全部失效,因為Assembly-CSharp.dll 不是標準的DLL載入過程,既不是PE的DLL也不是dotNet的DLL載入,而是由mono.dll讀取 Assembly-CSharp.dll的C#腳本解釋執行。這一切不用等官方IL2CPP和自己定製mono引擎!

Virbox Protector核心優點:

1.一鍵加密你的代碼邏輯,無法反編譯,無法dump內存。

2.不降低遊戲幀數, 甚至某些情況下還能提高遊戲幀數。

3. Assembly.DLLL代碼按需解密,只有調用到才會在內存解密,不調用不解密,黑客無法一次解出所有的代碼。

4.完整授權方案,支持雲授權 軟鎖授權,USB加密鎖授權 網路鎖授權 ,支持限制時間 限制次數 限制網路並發。

5.自帶反黑引擎,驅動級別反調試,秒殺市面的所有調試器。(注意:如果需要最高安全強度的遊戲反外掛,請參考反黑引擎 http://www.sense.com.cn/ahs.html )


同問,不知加密的方法以及必要性,曾經用第三方工具加密了最終發布後的dll(win平台下),移動端可能有類似的方法吧


一個遊戲能不能被破解不取決於這個遊戲有多麼牛b的防破解技術,而是取決於有沒有破解價值。


推薦閱讀:

如何用unity實現switch噴射戰士2(Splatoon 2)中的效果 ?
從0開始用Unity3D做遊戲原型,該學JS還是C#?
unity3d開發是否簡單,SDK及開發工具是否收費?
現有的幾個Unity熱更新方案該如何選擇,各自的優缺點是什麼?
unity燈光可以有兩個Directional Light嗎,unity會根據日光來模擬現實的時間嗎?

TAG:Unity遊戲引擎 |