from: http://liweizhaolili.blog.163.com/blog/static/1623074420144313825921/ Unity3D做出來(lái)的項(xiàng)目是非常容易被反編譯的,,被反編譯后你的所有資源和代碼都將會(huì)毫無(wú)遮掩的呈現(xiàn)出來(lái),。由于.net本身沒(méi)什么加密的措施,所以我們一般都是使用混淆代碼的方式來(lái)對(duì)程序進(jìn)行一定的加密,。 接下來(lái)將會(huì)簡(jiǎn)單的講一下我自己在Unity3D的程序加密做法,。首先第一篇,我會(huì)簡(jiǎn)單的說(shuō)明一下怎樣在Unity3D里面使用dll動(dòng)態(tài)鏈接庫(kù),,然后第二篇會(huì)說(shuō)明怎樣對(duì)dll進(jìn)行混淆,。 開(kāi)始第一篇的內(nèi)容: 首先,我們需要新建一個(gè)類(lèi)庫(kù)項(xiàng)目,,可以使用Visual Studio或者M(jìn)onodevelop來(lái)做,。我這里是使用vs2012來(lái)創(chuàng)建: 選擇好項(xiàng)目類(lèi)型、寫(xiě)好項(xiàng)目名稱(chēng),。 新生成的項(xiàng)目里面默認(rèn)有一個(gè)Class1類(lèi) 可以通過(guò)在解決方案資源管理器里面進(jìn)行重命名改成自己想要的類(lèi)名,,比如我這里改成了Math3D 然后寫(xiě)一個(gè)簡(jiǎn)單的靜態(tài)方法在里面,。這里我寫(xiě)了個(gè)最簡(jiǎn)單的加法(Add)。也可以不寫(xiě)靜態(tài)方法,,寫(xiě)出普通的public方法,,用的時(shí)候new對(duì)象出來(lái)調(diào)用該方法也可以。這和正常的C#編程沒(méi)區(qū)別,。 寫(xiě)好之后,,在資源管理器里面選擇“生成”,那么在項(xiàng)目的bin/debug 里面就會(huì)看到dll文件,,比如我這個(gè)額項(xiàng)目就是AzhaoDll.dll 接下來(lái)在Unity3D里面創(chuàng)建你需要的項(xiàng)目,,把剛才的dll文件隨便放到項(xiàng)目的Assets文件夾里面。關(guān)于這個(gè)dll文件的存放位置,,網(wǎng)上有些人說(shuō)是必須放在插件文件夾里面,,其實(shí)是不需要的,放在任意位置它都能被識(shí)別出來(lái),。當(dāng)然,,按照良好的項(xiàng)目路徑習(xí)慣,我們建立一個(gè)專(zhuān)門(mén)放插件的文件夾來(lái)存放dll文件,,也是合理的,。 然后在Unity3D里面創(chuàng)建一個(gè)C#腳本,寫(xiě)一行簡(jiǎn)單的代碼來(lái)調(diào)用我們剛才寫(xiě)的Math3D.Add方法,。 這時(shí)會(huì)發(fā)現(xiàn)Math3D類(lèi)不能識(shí)別,,我們using AzhaoDll命名空間 然后在Unity3D里把腳本掛到攝像機(jī)上,運(yùn)行,,可以看到打印出正確的結(jié)果了,,這就證明了dll已經(jīng)被成功調(diào)用了。 以下試試把命名空間刪掉: 那么在Unity3D里面調(diào)用就直接可以用了: 運(yùn)行的結(jié)果也是正常的: 當(dāng)然,不太建議不使用命名空間,,這樣做一個(gè)說(shuō)明,,是因?yàn)閡nity3D本身創(chuàng)建的腳本默認(rèn)沒(méi)有使用命名空間,,只是想說(shuō)明如果不想麻煩,直接把Unity3D沒(méi)有命名空間的腳本直接拿來(lái)編譯也是可以的,。 在Unity3D的安裝目錄Editor\Data\Managed里面,,找到UnityEditor.dll和UnityEngine.dll兩個(gè)文件。 然后在類(lèi)庫(kù)項(xiàng)目里面添加引用,,把這兩個(gè)dll添加進(jìn)來(lái) 這時(shí)候,,我們就可以在類(lèi)庫(kù)項(xiàng)目里面using UnityEngine來(lái)使用Unity3D的方法了,比如我們這里簡(jiǎn)單寫(xiě)了個(gè)CreateGameObject方法,,生成一個(gè)名字為“CreateByDll”的gameobject,。 生成dll,放回Unity3D項(xiàng)目里,,我們就可以調(diào)用這個(gè)方法: 運(yùn)行,,看到這個(gè)叫做“CreateByDll”的物體生成出來(lái)了。 通過(guò)以上的說(shuō)明,,我們會(huì)發(fā)現(xiàn)其實(shí)生成自己的dll在Unity3D里面用是很簡(jiǎn)單的事情,。我們還可以添加其他自己寫(xiě)好的類(lèi)進(jìn)類(lèi)庫(kù)項(xiàng)目,然后生成dll來(lái)使用,。 最后說(shuō)一下注意事項(xiàng)了,。 剛才生成的dll在Unity3D編輯器里面基本上都是能用的,但不一定能通過(guò)編譯,。有可能在編譯成exe或者apk等時(shí)會(huì)報(bào)錯(cuò),。 需要注意的是,類(lèi)庫(kù)項(xiàng)目使用的.Net Framework版本,。我自己的嘗試是,,使用.Net 4.0以上版本發(fā)布的dll,在Unity3D里面會(huì)編譯不通過(guò),。所以我們可以用2.0或者3.0之類(lèi)的版本來(lái)發(fā)布。 還有一些情況是某些現(xiàn)成的dll動(dòng)態(tài)庫(kù)是使用完整的.Net2.0來(lái)發(fā)布的,,所以我們?cè)诰幾g的時(shí)候有可能需要選擇完整的.Net 2.0來(lái)發(fā)布,。 到了這一步,我們就可以把Unity3D的整個(gè)代碼文件夾里面所有的腳本剪切到類(lèi)庫(kù)項(xiàng)目里面生成dll,,然后放回Unity3D項(xiàng)目里面,。這樣別人就不能直接的編輯我們項(xiàng)目里面的代碼了。 不過(guò)dll本身是不安全的,,別人可以很容易看到里面的內(nèi)容,。下一篇博客我們?cè)僬f(shuō)明怎樣去給dll做混淆,。
|
|