解密无非就为了 修改游戏功能数据、提取游戏资源、加入自己想加的广告等等加密就是保护游戏资源不被恶意修改
关于Unity C#代码部分的加密,混淆,可以去搜索一下Codeguard这个插件,它可以防止你的代码被反编译。它主要是改名,把你的方法名,方法体名子修改了,变量名修改了。虽然有点弱但是它的优点是比较方便,因为可以在打包的时候自动完成代码混淆的工作。还有几个混淆插件CryptoObfuscator、de4dot可以用试一下,但有混淆就有反混淆(de4dot很厉害的)。
IOS其实不用做代码混淆,应该是苹果帮我们做了,反编译以后只能看到变量名,和方法名,但是具体的方法体内的代码是看不到的。Android是可以看到的。所以如果是想反编译的话怎么办?Unity编译后最终会将代码编译在dll里面,无论是ios还是Android解开包以后都可以拿到dll,路径在Data/Managed/Assembly-CSharp.dll去找它的Android版本(ios代码混淆了),然后解开包,拿出它的Assembly-CSharp.dll在Windows上去下载.NET Reflector 8这个反编译dll的软件(下载最新版本)。 把Assembly-CSharp直接拖进AssetbundleManager应该就是他们自己写的处理Assetbundle的下载管理类了。试一下搜索一下”http”关键字 可能找到CDN或者Assetbundle的下载地址。
除了混淆,我们也可以尝试其他的保护措施,比如下面的方式:
Unity是基于Mono的,它是开源的 代码下载: https://github.com/Unity-Technologies/mono
直接下Zip包,注意Tag版本与开发用的Unity版本要相同。
编译自己的Unity项目,找到 /Data/Managed/Assembly-CSharp.dll ,对它进行加密,可以自己写个小程序,把Assembly-CSharp.dll转换成字节流byte[],然后对byte[]加密。
常用的加密(效验)算法:
* 散列:MD5、SHA、SHA3、RIPEMD、Tiger、Whirlpool、CRC32、Adler32
* 对称:Base64、DES、3DES、AES、RC、Rijndael、TripleDES、PBE、3-way、IDEA、MARS、Serpent、SAFER、Blowfish、Twofish、Tea、Skipjack、Camellia、Cast、Gost
* 非对称:RSA、Elgamal、Diffie-Hellman、Rabin、ECDsa、Ecc
下面两个加密开源类库:
Bouncy Castle(C#和Java版)
代码下载:https://github.com/bcgit/ 官网地址:http://www.bouncycastle.org
Crypto++(C++版) 代码下载:
http://sourceforge.net/projects/cryptopp/files/cryptopp/ 官网:http://www.cryptopp.com/
.net自带了安全类库,确实是在System.Security.Cryptography下有一些常用的算法,虽然没有上面的类库全,但足以平常使用。
其C#源码也在Mono开源项目中 位置在 /mcs/class/corlib/System.Security.Cryptography/
接着找到 /mono/metadata/image.c 查看下面两个方法
第一个方法mono_image_open_from_data_full内实际调用了mono_image_open_from_data_with_name
第二个方法mono_image_open_from_data_with_name的第一个参数char *data这个指针指向运行时Assembly-CSharp.dll的内存地址,
可在该方法内添加或调用对data解密的算法,然后将解密后的data再赋给datac
关于MonoImage这个结构体,它的定义是typedef struct _MonoImage MonoImage; 而_MonoImage这个结构体,它的定义在 /mono/metadata/metadata-internals.h 中
最后就是编译Mono了,编译部分参看官方说明
该方法虽然是修改Mono内核,偏底层了些,但并不是破解不了,但是难度提高了