首页 > 代码库 > 手机加密那点事儿_数值内存加密

手机加密那点事儿_数值内存加密

本文章讲述利用cocos2d-x 开发手机游戏的一些加密心得。如有问题,请多指正。

更多信息详见:http://blog.csdn.net/chengyingzhilian/article/details/25540441

本文地址:http://blog.csdn.net/chengyingzhilian/article/details/25957895

好了,进入本文的主题——数据加密

  要将数据加密,不得不提的一款神器:八门神器。手机游戏中的金手指。
  八门神器是安卓、iOS、塞班平台上通用的游戏修改工具,可以修改内存中的数值和参数,达到修改游戏HP、MP、金钱、等级等的作用。八门神器类似于PC平台的金山游侠等游戏修改器。
  对于网络游戏来说,可能没有太大的影响,终端对于网游来说基本上是一快屏幕,所有的数据都存放在服务器上。本机仅留部分配置信息等无关重要的数据。可对于单机来说,意义就不一样了,没有网络无法验证数据的正确,很容易被内存修改器修改了数据。
  因此,我们需要对我们用到的数据内存进行加密,防止内存被修改。
  对数据加密基本可分为两种:
  1. 可逆加密
  2. 不可逆加密
  两种加密也对应着不同的数据加密设计思想。

 首先要了解八门神器的使用基本步骤:

  • 1.发现界面上的数据,进入八门神器进行查找。
  • 2.更新界面上的数据,进入八门神器进行在上一步骤结果中继续检索。
  • 3.重复步骤2,直到结果只是固定的地址。
  • 4.修改该内存,更新界面查看数据是否正确。

先说可逆加密:

  不知道你发现上面八门神器使用步骤中,加红的文字没有。这就是可逆加密的关键。
  首先要明确的一点就是显示的数据 ~= 内存的数据。
  这就是可逆加密的中心思想。
  将内存中的数据加密起来,在显示的时候解密即可。
 使用一个最简单的可逆算法,实现加密和解密2个方法,然后对你认为有必要保护的内存进行存储前加密,取前解密。
  可逆的加密算法:最典型的可逆加密算法是异或运算。大家都知道,对一个值连续异或两次,其结果还是原值;于是,第一次异或被看成是加密,第二次异或被看成是解密。
  本文不是介绍加密算法,只是介绍基本思路,关于高级的加密算法可自行搜索。在此仅适用一种简单的算法来演示。
  内存 * 2
  验证方式很简单: 从1 开始,每次递增1。利用八门神器很容易就能修改掉
   那么我们使用简单算法:
  • 存储内存 = (存储内存 / 2) * 2
  • 显示内容 = 存储内存 / 2 
public class MainActivity extends Activity {
	TextView showTextView = null;
	int index = enNum(1);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		showTextView =(TextView)findViewById(R.id.textView2);
		showTextView.setText(""+deNum(index));
	}

	public void addNum(View view)
	{
		index = enNum(deNum(index)+1);
		showTextView.setText(""+deNum(index));
	}


public static int enNum(int num){
	return num*2;
	
}

public static int deNum(int num){
	return num/2;
	}
}


简单吧。
 
下面我们进行八门神器搜索:
在输入1 之后搜索: 出现 202397 个数据。
点击按钮之后,搜索 2 还是有大量数据,

多次点击按钮之后,搜索的结果就会渐渐减少。之后就发现不了了。

那么我们利用 显示内容 = 存储内存 / 2  的算法,搜索 显示 * 2 的内存,多次之后就很容易发现该内存。

修改之后,内存成功变化。可见加密算法的重要性。使用简单的算法,很容易暴力掉。

接下来我们看看不可逆加密的方式:

不可逆的加密算法:MD5 验证 例如RSA公司发明的MD5算法,以及由美国国家标准局建议的不可逆加密标准SHS(Secure Hash Standard,安全散列信息标准)等。
  基本上就是:
显示内存 = 存储内存 
将存储内存加密 保存在验证变量中。
不过在每次显示/使用内存之前,对你加密与验证变量对比,这样就能很容易发现是否内存被修改,是否应该采取措施等等。
if (md5(index).equals(enIndex)){
				index++;
				enIndex = md5(index);	
				showTextView.setText(""+index);
			}
			else
				System.err.println("err index changed!!!");