1.起因
比较无聊刷今日头条,无意中看到有小编推荐, 18元 -> 限免的单机 地牢防御.
30多MB的游戏玩起来也挺好玩的.
游戏有个功能,可以同步存档到远程服务器上,这个服务器应该是苹果的.
既然是可以同步存档,那就有一种可能,这个存档在上传的过程中被修改。
那我同步下来的时候就会是修改后的,那岂不是美滋滋。
2.开始操作
准备工具:
1.一台越狱的IOS手机,系统版本不限,且安装了Filza,以及AFC2(可以使用爱思管理文件).
2.ILSpy
3.PListEditor
最先的想法是Fiddler抓包看看,结果发现没啥用。好吧,放弃。
那只能想别的方法了,
首先判断一下这个游戏是使用什么制作的.
使用Filza进入此程序的主程序目录下,发现主程序目录下有\Data\bin\Managed\Metadata\global-metadata.dat文件,这个是Unity程序生成的C++或者说O-C中的函数映射表.大概这个意思吧.
可以判断是Unity.再找到存档的位置,
一般放置的位置是,数据目录下\Library\Preferences\App包名.plist
使用爱思导出文件后使用PListEditor查看.如下图.
是简单的Base64编码?
解码发现不是,那GG,这个不是简单的编码而已.
那根据我的想法,这个游戏可能是有Android版本的,
几经查阅,发现谷歌应用商城是有下载的,遂翻墙下之.
将其后缀更改成rar之后打开我们很容易找到Dll文件.
将其全部拖出.扔到ILSpy中,OK,全部都能解析识别.说明这个游戏开发者并没有加密这些Dll.
其中很大记录包含主逻辑的是在
Assembly-CSharp.dll
Assembly-CSharp-firstpass.dll
这两个C#的Dll中.(忘记说了Unity是使用C#语言进行开发的.)
我们根据存档是使用Base64进行编码的来反向寻找存档保存的方式,(小声说一句,其实搜索Save应该更快)
FromBase64String 系统函数 从base64编码转换成原本的 字节集
右击此函数选择分析,查看被什么函数引用,快速定位到 [加载存档] 的地方.
进入函数如图所示
箭头所指向的分别是获取数据,然后把数据序列化成SaveData类型的对象.
直接进入 ObscuredPrefs.GetString()函数.
可以晓得 刚刚的 "DD_SaveData_" + bySlot 是Key 很显然这个Key还被加密了 然后再进行查询的.
那也就是说刚刚我们导出的存档中 那几个被<Key>标签包裹的就是 这个被加密的内容.
跟入其中后拷贝还原后得到如下结果
然后 ObscuredPrefs.GetString()函数中的 GetEncryptedPrefsString()函数使用了 Unity的 PlayerPrefs.GetString 方法获取了这个存档中键值对中的值.就是存档中被<string>标签包裹的内容,
得到内容后使用 DecryptStringValue(key, encryptedPrefsString, defaultValue) 进行解密
这样就能成功得到解密后的Base64
(SavedData)binaryFormatter.Deserialize(new MemoryStream(Convert.FromBase64String(@string)));
使用这个方法成功序列化 SavedData 对象!
我们需要去还原这个SavedData类型,但是发现这个类型依赖了UnityEngine.
这样的话我们只能新建个Unity项目来进行还原了,
还原需要注意
务必保证类型所在的命名空间于原本的一致!
否则极有可能会出错。当初旅行青蛙就是这样。
剩下的就是拷贝粘贴修改.
结果如下图
从上到下分别是
1. 序列化成了 SaveData 对象
2. 修改原本的存档内容
3.将其过程反向,序列化并加密处理成游戏可识别的密文存档
4.解析刚刚加密的存档以用来验证是否正确!
OK 我们将 str_enc的内容拷贝出来并替换原本的游戏存档.
结果如下图.
这岂不是美滋滋?
右上角金币无限,强化全满 嘿嘿嘿.
因为是云存档的关系,所以我将越狱的手机 IPhone8 的存档同步到云端,
然后成功拉取到当前未越狱的 IPhone XS MAX 手机上.
这样就实现了完美的修改.
更多细节就不找了,同理可得.
我只是个卑微的人,
不敢奢求。
那,就推荐一首歌吧。
网易云搜索
if 丁可
2018.10.14_16.17
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-10-15 21:18
被Imxz编辑
,原因: