如何防范unity代码被偷!

解密无非就为了 修改游戏功能数据、提取游戏资源、加入自己想加的广告等等加密就是保护游戏资源不被恶意修改
关于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 查看下面两个方法

MonoImage *
mono_image_open_from_data_full (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly)
{
  return mono_image_open_from_data_with_name (data, data_len, need_copy, status, refonly, NULL);
}

MonoImage *
mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name)
{
    MonoCLIImageInfo *iinfo;
    MonoImage *image;
    char *datac;

    if (!data || !data_len) {
        if (status)
            *status = MONO_IMAGE_IMAGE_INVALID;
        return NULL;
    }
    datac = data;
    if (need_copy) {
        datac = g_try_malloc (data_len);
        if (!datac) {
            if (status)
                *status = MONO_IMAGE_ERROR_ERRNO;
            return NULL;
        }
        memcpy (datac, data, data_len);
    }

    image = g_new0 (MonoImage, 1);
    image->raw_data = datac;
    image->raw_data_len = data_len;
    image->raw_data_allocated = need_copy;
    image->name = (name == NULL) ? g_strdup_printf ("data-%p", datac) : g_strdup(name);
    iinfo = g_new0 (MonoCLIImageInfo, 1);
    image->image_info = iinfo;
    image->ref_only = refonly;
    image->ref_count = 1;

    image = do_mono_image_load (image, status, TRUE, TRUE);
    if (image == NULL)
        return NULL;

    return register_image (image);
}

第一个方法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内核,偏底层了些,但并不是破解不了,但是难度提高了

推荐资料:http://www.xuanyusong.com/archives/2664
http://blog.csdn.net/chenggong2dm/article/details/42079809

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值