单机 & 弱联网手游 防破解、金币修改 简单措施

标签: Unity3d加密防破解
4391人阅读 评论(2) 收藏 举报
分类:

手游常用破解方法

对于一个弱联网或者单机游戏,可以从以下方面去破解:

1、找得到存档文件的,直接破解修改存档文件。

2、找不到存档文件,就在游戏运行时借助一些软件来修改数值,比如用各种修改器手游助手来修改金币。

3、找不到存档文件、数值还修改不了,就直接反编译,Java就看Java、C#就看IL、C++就看汇编。

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

手游防破解对策

好了,防破解我们也从以上方面来做 (或者还有其它的)。

1、对于破解修改存档文件的。

首先我们可以聪明一点,存档名字不要写成SaveData、Config、Cundang、等这种很傻瓜的名字。难道存档文件就不能命名为mp3、jpg吗?把存档文件扔到一堆jpg里面,这是简单有效的方法。

然后就是加密,字节偏移 、上上下下左左右右交换都可以。只要自己能认得出来。


2、软件修改数值,是这次我要测试的。

首先我们要明白市面上各种修改器的原理,随便哪一款修改器都是教你先找到一个数值,比如金币 5000,然后搜索这个数值,再去改变这个数值,再搜索改变后的数值。

那么对应于这种方式,我们要做的就是,让 显示的数据 和 我们实际用于计算的数据 并不一样。比如玩家攻击力是100,那么我从存在存档中的就写 101,然后计算伤害的时候用

101 -1 =100 这样去计算,但是显示在屏幕上的还是 100 。这样玩家用修改器去搜索 100 这个数值。然后攻击力 +1 的时候显示101,但是其实我们的变量中存储的是 102.自然就搜索不到了。


下面我用Unity做的一个Demo,然后用烧饼修改器来测试修改数据,测试 不加密 和 加密  ( 指的就是上面的 100+1 ) 的 情况。

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

首先Unity的工程下载:

http://pan.baidu.com/s/1hqD4yyg


然后下面是用来测试的普通场景的代码:

using UnityEngine;
using System.Collections;

public class Normal : MonoBehaviour {

	int m_Attack=0;

	int m_ShowAttack=0;

	// Use this for initialization
	void Start () {
	}

	void OnGUI()
	{
		m_ShowAttack=m_Attack;
		if(m_ShowAttack<0) 
			m_ShowAttack=0;


		GUI.Label(new Rect(100,100,100,500),m_ShowAttack.ToString());

		if(GUI.Button(new Rect(100,300,100,100),"普通赋值"))
		{
			m_Attack=100;
		}

		if(GUI.Button(new Rect(300,300,100,100),"修改伤害值"))
		{
			m_Attack+=1;
		}


		if(GUI.Button(new Rect(450,100,100,100),"跳转到加密测试"))
		{
			Application.LoadLevel("Encryption");
		}
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}


下面是用来测试 加密的代码:

using UnityEngine;
using System.Collections;

public class Encryption : MonoBehaviour {

	int m_Attack=0; //存储数据用于计算伤害;

	int m_ShowAttack=0; //存储数据用于显示;

	// Use this for initialization
	void Start () {
	
	}
	

	void OnGUI()
	{
		m_ShowAttack=m_Attack-1;
		if(m_ShowAttack<0) 
			m_ShowAttack=0;

		GUI.Label(new Rect(100,100,100,500),m_ShowAttack.ToString());
		
		if(GUI.Button(new Rect(100,300,100,100),"加密赋值"))
		{
			m_Attack=(100 + 1);
		}

		if(GUI.Button(new Rect(300,300,100,100),"修改伤害值"))
		{
			m_Attack+=1;
		}

		if(GUI.Button(new Rect(450,100,100,100),"跳转到普通测试"))
		{
			Application.LoadLevel("Normal");
		}
	}

}


对比上面的两个代码,就会明白这次加密的原理。

好了,下面是我用烧饼修改器测试的结果。


不加密秒破解

破解不加密游戏开始,攻击力初始为0


点击 普通赋值 ,赋值 100


用烧饼修改器搜索 100


搜索到很多值为  100 的内存地址


返回游戏,点击 修改伤害值 按钮,数值 + 1 =101.

再次搜索 101


这次只搜索到 2 个值为 101 的数据。我们把这两个数据都进行修改  为 7777 。


提示修改成功,同时我们看到游戏中显示的数值变了,那么数据是否真的变了。

回到游戏,再次点击 修改伤害值,显示 7778 。

至此游戏已经被修改破解。


加密后破解变难

破解加密游戏开始,初始值为 0


点击 加密赋值 ,给初始攻击  100


然后在烧饼修改器中搜索 100

搜索到很多个


返回游戏 ,点击 修改伤害值 后,伤害值显示为 101 。

继续在烧饼修改器中搜索 101 。


只搜索到1个。



我们修改成 66666。


提示修改成功,但是我们看到,游戏中的数据并没有变化。

返回游戏,点击 修改伤害值  ,发现一切正常。

破解加密失败。

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

为什么普通的能搜索到 2 个101,而加密的只能搜索到 1个 101?

因为加密的游戏,在那个时候,的确只有一个数据是101,就是屏幕显示的。存储用于计算的数值,是 102 。修改器修改的只是用于屏幕显示的一个数字,而且修改之后马上又被真实的数值替换了。所以并没有修改成功。


3、对于反编译游戏代码的,我们可以对代码进行混淆加密。

Unity反编译重新打包的流程,看下面的日记。

Unity3d 反编译破解游戏 简单示例 (使用ildasm反编译DLL修改然后重新编译DLL)


话说如果真有高人来破解你的游戏,不管怎么做,都会被破解掉的。我们能做的就是尽量增大破解难度。或者,做成网络游戏。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1212803次
    • 积分:15635
    • 等级:
    • 排名:第765名
    • 原创:331篇
    • 转载:108篇
    • 译文:6篇
    • 评论:282条
    我的Github
    @ThisisGame
    博客专栏
    最新评论