Unity - 游戏加密方案-DLL加密方法记录

Unity - 游戏加密方案-DLL加密方法记录

DLL加密

Unity中的自定义脚本都会打包到Assembly-CSharp.dll这个DLL中,所以目前常见的游戏加密方案就是,用对称加密算法加密Assembly-CSharp.dll,然后修改mono源码在读取Assembly-CSharp.dll时解密,然后重新编译mono.dll。这种方案网上有很多帖子,在此只记录自己动手实现时的一些细节(Windows平台 + Unity2017.2)。

mono.dll重编译的一些细节

  • 用VS2010版本,并且打上Sp1补丁,基本就可以一次成功
  • 设置libmono为启动项,配置选Release_glib,32位62位各打一个
    Unity - 游戏加密方案-DLL加密方法记录_第1张图片
  • 解密代码在image.c的mono_image_open_from_data_with_name函数中插入
	if (!data || !data_len) {
		if (status)
			*status = MONO_IMAGE_IMAGE_INVALID;
		return NULL;
	}
	// 插入
	if (name != NULL && strstr(name, "Assembly-CSharp.dll") != NULL)
	{
		char* key = "Encrypt-String";
		size_t len;
		// xxtea解密算法
		char* decryptData = (char *)xxtea_decrypt(data, data_len, key, &len);
		int i = 0;
		for (i = 0; i < len; ++i)
		{
			data[i] = decryptData[i];
		}
		g_free(decryptData);

		data_len = len;
	}
	// 原有的代码
	datac = data;
  • 重编译生成mono.dll的路径:根目录/builds/embedruntimes
    Unity - 游戏加密方案-DLL加密方法记录_第2张图片
  • Unity mono.dll的路径:根目录/Mono/EmbedRuntime

Assembly-CSharp.dll加密

很多对称加密算法都可以做,这一步可以放到Unity Editor中做,一键打包+加密DLL+替换mono.dll。成功的话游戏运行是没问题的,用Reflector查看Assembly-CSharp.dll也显示错误。

另一种加密方案-混淆

另一种加密思路是混淆,将原有代码转换成完全不能识别的代码,但是在Unity中使用有些限制,参看参考链接。

最后

这些加密只是很简单的加密方案,只能防止80%的小白程序员破解游戏,但老鸟来破解还是易如反掌难道一劫:

无论是加密还是混淆,只要是这样的保护,都可以把它看成一个壳,只要是壳,在内存中就必然会有脱下去,显示它本来面目的那一刻。

网上也有很多教程教如何脱壳,比如:
https://www.52pojie.cn/thread-401702-1-1.html
https://blog.csdn.net/huutu/article/details/51902940
对于游戏开发者,特别是独立单机游戏开发者,防破解还是任重道远啊。


参考链接:
DLL加密:https://blog.csdn.net/swj524152416/article/details/69946259
混淆: https://blog.csdn.net/kun1234567/article/details/7917847

你可能感兴趣的:(Unity破解与反破解)