首页
社区
课程
招聘
(转载)Unity 加密解密那些事
发表于: 2015-9-11 09:34 2009

(转载)Unity 加密解密那些事

2015-9-11 09:34
2009
解密无非就为了 修改游戏功能数据、提取游戏资源、加入自己想加的广告...
加密就是保护游戏不被恶意修改,我经常看到有人说:”加什么密,你以为自己写的代码很NB?见不得人?“。
我只想说,加密并不是不想让别人看到我的游戏逻辑代码,而是不想别人去恶意的修改自己做的游戏罢了...

先说下关于Unity C#代码部分的加密(Android和IOS有时间再细说),很多人说混淆,虽然有几个混淆插件CodeGuard、CryptoObfuscator、de4dot...可以用用,但有混淆就有反混淆(de4dot基本都可以搞定),有加壳就有脱壳,有加密就有解密...加密只是提高了门槛提高了难度,而解密只是时间的长短而已。
Unity下对C#保护措施并不是很多,加壳就别想了,混淆也有限制,混了和没混一样。

除了混淆,我们也可以尝试其他的保护措施,比如下面的方式:
Unity是基于Mono的,地球人都知道...它是开源的 代码下载:[url=]b54K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6g2L8X3W2@1P5g2)9J5k6q4c8W2j5$3S2F1L8$3I4G2k6$3W2W2M7#2)9J5c8X3#2G2L8X3!0Q4y4f1u0Q4x3V1k6#2M7X3I4Q4y4f1b7`.
直接下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版) 代码下载:[url=]246K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6T1j5$3N6A6N6q4)9J5c8W2)9#2b7W2)9J5c8Y4g2J5L8q4)9#2c8q4)9J5y4X3&6T1M7%4m8Q4x3@1t1`.  官网地址:[url=]7cbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0G2N6h3&6U0P5h3y4S2M7%4c8D9k6g2)9J5k6h3!0J5k6#2)9#2b7W2)9J5c8Y4g2J5L8q4)9#2c8l9`.`.
Crypto++(C++版) 代码下载:[url=]67cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4G2N6i4u0U0k6h3k6G2M7X3N6W2i4K6u0W2L8X3g2@1i4K6u0r3M7s2u0G2K9X3g2U0N6s2y4Q4x3V1k6U0M7Y4W2H3N6r3!0H3M7q4)9J5c8X3k6A6L8r3g2K6i4K6u0r3j5%4u0&6M7s2c8G2M7s2m8Q4x3V1k6Q4y4f1u0Q4x3V1k6#2M7X3I4Q4y4f1c8Q4x3U0k6F1j5Y4y4H3i4K6y4n7  官网地址:[url=]96aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4J5P5i4m8@1L8%4m8H3i4K6u0W2j5$3!0E0i4K6u0r3i4K6g2n7i4K6u0r3N6i4u0D9i4K6g2p5

有人说.net自带了安全类库,确实是在System.Security.Cryptography下有一些常用的算法,虽然没有上面的类库全,但足以平常使用。
其C#源码也在Mono开源项目中 位置在 /mcs/class/corlib/System.Security.Cryptography/ 若不想了解加密算法可乎略,直接引用里面的方法即可。
如果有闲心的话可以写一个属于自己的加密算法...

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内核,偏底层了些,但并不是破解不了,只是要比反混淆的难度高那么一丢丢...

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回