手机程序中的数据保护


#1

【本来是想建议开一个专题版块,来讨论这个问题的,不过版主不同意,所以我按照他的意见发一个帖子在这里。大家有更好的想法,也可以直接回复在这里,我只是抛砖。】手机程序现在种类功能都很繁多,相应的数据保护需求也日益增加,下面我会以手机游戏中的数据保护举例。因为游戏修改器在手机软件界已经是种类繁多功能齐全了,所以越来越多的游戏希望增加数据的安全性。
由于手机计算能力相对于台式机和服务器总是非常有限的,我这里仅仅就一些低开销的方法进行保护。
一、整数位运算保护法:
假设:本方法是基于这样的假设:程序有一些数据是需要全局保存或者保存于堆之中的。以下所有计算,都是针对32位整数,若需要应用于其他长度和精度的整数,请自行发散补充。
背景:全局保存的一般有静态变量和全局变量。而保存于堆之中的,都是由new或者malloc等内存分配产生的数据。
这两种数据都可以用于程序内存数据交互或者各模块即时使用的。由于这些数据存储的位置和性质,他们会长期稳定的存在于内存之中,是非常容易被修改和读取的。
方法:异或存储法。选择任意一个整数,比如0xA55A5AA5将数据保存到上述位置的时候,进行一次异或操作。要取出来使用的时候,再进行同样的异或操作。
示例:比如HP(HealthPoint 生命值)数据。
写一个SetHP(int Hp)函数和一个int GetHP()函数

int nHP = 0;
void SetHP(int Hp)
{
nHP = HP^0xA55A5AA5;//补充一点,该常量开发者可以自行设定,并非一定是这个值。任何其他整数都可以的
}
int GetHP()
{
return nHP^0xA55A5AA5;
}

这样,当需要使用HP的时候,通过SetHP去设置,GetHP去获取。这样,除非正好计算的函数被暂停住了(这几乎不可能,必须暂停在GetHP返回的那个指令),否则,内存里面是不会有HP在界面上显示的值存在的。
从而,也就避免了被内存搜索类型的游戏修改器修改的可能性。
二、完整性校验法:
假设:数据是集中在有限的内存空间中,并且可以被开发者方面的读取的。
背景:当有大量的数据需要被频繁的使用和保护,但是代码也不太方便大更改的时候。针对简单加减的数据。
方法:创建一个随机的初始值M,计算所有需要保护的数据和N。每当有数据需要加减的时候,则对M进行相反的操作。保证数据M+N永远不变。
然后定时或者在某些阶段的时候进行校验。如果校验失败,则进行处理。比如在存档的时候和读档的时候。这样用户就难以篡改档案了。
其他的方法欢迎大家踊跃反馈,我会不定期整理并添加到本贴中来,O(∩_∩)O谢谢

补充:在群里面和大家讨论了一下,感觉有些东西需要再补充说明一下
关于方法一:
1 主要防止的是类似CE工具一样的内存搜索,避免数据裸存在内存中,傻乎乎的等待着被修改。缺点是使用数据开销有点大(开发的开销)。
2 0xA55A5AA5可以自定义,甚至可以动态生成(生成前,将前一次的读取,并还原数据,再使用新的数据)
3 虽然该方法用在端游的比较多,但是其他应用一样可以借鉴
关于方法二:
使用情况举例:
比如HP 10 初始数M = 99HP+10 则同时M-10保证HP+M恒等于109
如果验证的时候,发现不是109了,那么就有问题了
优点:取数据的时候没有成本。保护和验证成本也很低。可以保护内存实时值,也可以保护存档值。
缺点:涉及到乘除或者更复杂的运算,需要再从新考虑。所有变值运算都需要进行M的操作,不能遗漏。否则必然导致验证无法通过


#2

都是游戏方面的,,,有没有手机应用方面的保护呢?


#3

保护有很多方面的
这些可以应用于数据保护,不限于游戏
说游戏是因为这种场景比较适合讨论,大家都能了解
你希望保护应用哪些方面,比如程序完整性?数据完整性?


#4

用户数据加密,字符串加密,代码混淆,类方法名混淆这些~


#5

好好好,手动一万个赞,难怪有些游戏用八门神器搜索不了精确值的!!!!!


#7

请教下,创建一个随机的初始值M,计算所有需要保护的数据和N。每当有数据需要加减的时候,则对M进行相反的操作。保证数据M+N永远不变。N是什么东西? what is N?