最近项⽬临出包测试时,测试反馈部分敏感数据可以在运⾏时被⼋门神器或gg⼤玩家等⼯具搜索到并进⾏修改。 智能装备与系统迫不得已,只能暂停⼿头的⼯作重新检查既定的内存加密⽅案情况。然⽽,不查不要紧,⼀查吓⼀跳:
1)内存加密的⽅案最开始的时候推⾏下去并加到项⽬中了,但是使⽤的是⽹上搜索的插件(也就基本相当于开源了),同时防破解机制不够稳固
2)项⽬后续开发的过程中,不断更新提交相关脚本及proto⽣成的协议时竟然没有对⽐检查修改的有效性,导致覆盖问题
3)⽅案的引⼊及使⽤过程有数据定义的遗漏以及使⽤的不合理导致的Bug
那么就怪不得我了,祭起⼯具⼲起来吧。
除了3是琐碎的排查,针对前两个问题就写个⼩⼯具处理下就OK了:
protected static string protobufPath = "/Source/Proto/";
[MenuItem("Tools/EncryptProtoScript")]
protected static void encryptProtoScript() //对ProtoBuf中定义的int/float等类型的private field进⾏加密(有需要可以进⾏⽂件导⼊的监听及⾃动化处理)
{
var tArr = Directory.GetFiles(Application.dataPath + protobufPath, "*.cs");
foreach(var filePath in tArr)
{
var tContent = File.ReadAllText(filePath);
信号转换器bool tIntFlag = tContent.Contains("using Int = EncryptInt;");
bool tFloatFlag = tContent.Contains("using Float = EncryptFloat;");
海上应急通信系统bool tNeedEncrypt = false;
if(tContent.Contains("private int ") || tContent.Contains("private int? "))
{
tNeedEncrypt = true;
if(!tIntFlag)
{
tContent = tContent.Replace("EncryptInt", "Int");
tContent = "using Int = EncryptInt;\n" + tContent;
}
tContent = tContent.Replace("private int ", "private Int ").Replace("private int? ", "private Int? ");
}
if(tContent.Contains("private float ") || tContent.Contains("private float? "))
{
tNeedEncrypt = true;
if(!tFloatFlag)
{
zigbee组网钢格板压焊机tContent = tContent.Replace("EncryptFloat", "Float");
tContent = "using Float = EncryptFloat;\n" + tContent;
}
tContent = tContent.Replace("private float ", "private Float ").Replace("private float? ", "private Float? ");
再生油}
if(tNeedEncrypt)
{
File.WriteAllText(filePath, tContent);
}
}
AssetDatabase.Refresh();
}
最后总结下吧:
⾸先,⽆论何种本地数据安全⽅案,都基于两个⼤前提,不然毫⽆意义:
1)游戏本⾝不被破解
2)游戏代码不被破解
其次针对各种类型的内存搜索数值修改,都是基于数值变化的原理进⾏不断缩⼩范围来定位,不过同样基于两个前提: 1)数值常驻内存
2)数值在内存中的地址稳定不变
因此可以想见,针对内存数据破解的防范或安全⽅案(需要评估并平衡效率)有以下⼏种常见⽅案:
1)内存中的数据及时清理(实时存盘)
2)进⾏实时内存存储位置/地址的修改
3)进⾏数据加密(加密算法)/进⾏数据校验(Hash算法)
4)加盐/噪⾳⼲扰(引⼊冗余数值,伴随敏感数据⼀起变化)