又名,打手枪的正确姿势?!
依旧是存档修改.
果真,一个人的时候就是闲的蛋疼.
前两天下载了这款游戏,
但是玩一玩就鸡儿要充值,要会员.
还有鸡儿体力限制,想肝都不行.
对我来说 也懒得肝,搞不定就卸载游戏 不玩了.
游戏是IOS版本的.
细看了下是Unity3D制作的游戏.
我的想法是看看有没有安卓版本的.
在看看是不是C#Dll形式存在的代码.
如果是这样 那就搞, 如果是il2Cpp形式的 就放弃.
懒得费时看C++汇编了
准备
1.一个越狱的手机
2.VS
3.脑子
Android版本下载地址:
http://www.pc6.com/azyx/604623.html
发现正合心意.
将其解压拖入ILSpy发现 主要的 C#Dll Assembly-CSharp.dll无法被正确解析,
无效的COFF头部.
百度+谷歌了一下. 说用 dnSpy 反编译工具 就行了.
现在我们可以看游戏代码了,
然后呢 我们定位 游戏存档.
存档的位置在 程序的数据目录下的Documents目录下 名字叫 savegame.bin
其中 savegame.bin.bkp 是上一次的备份.
后续的分析中可以看到
将C# Dll 解压出来后
全部拖入 dnSpy 中 反编译 然后搜索 savegame
先说一下,这个游戏是有云端存档的.就是存档会发送到云端.
同账号可以互相拉取存档.
所以这里可以看到 有上传存档的地方.
这个并不在研究之列,因为比较麻烦 暂时还不能进行验证.
我在一家淘宝店中看到的,
那他用的应该就是文档上传以及下载
跟入 App.SaveFilePath 可以看到它在拼接 存档地址
跟入Save 可以看到 它在地址后面主动拼接了bin, 其中还有个加密的key
继续跟入
发现它开始写存档了
先是写入了4字节的头部,
然后写入占位4字节
然后写入是否加密存档.
这里 我们 可以主动的 将 SaveStream 它自己实现的流 类 拷贝出来
在VS中 建立 C# 控制台工程 还原相关联的所有类即可
继续跟入
它就在写入数据了
但是这里要注意.
这个自定义的流 在写入的时候 将会 直接进行 RC4 加密
我们这个时候将关联的所有对象 还原.
就差 秘钥了
从代码上看
它写入的是 CRC值 ^ 秘钥的 UINT型 但是 我在这里被忽悠了,
它的秘钥长度是很长的,但是他取出来的只是4个长度,
如果反推 则只能的到 4字节的秘钥 , 并非完全的秘钥,
我们重点需要去寻找秘钥如何产生的!
有了写,反向就是读!
让我们开始寻找秘钥吧
跟入
App.SaveGameKey
其中函数 SaveGameKeyFromUserId 是 使用 UserID 产生秘钥的方法 需要还原.
我们需要跟入
GetUserID
它个字段的包装,
我们需要跟_userid 查找它的使用的地方
我们找到了 KeychainAccess.GetKeychainString() 它是由这个过来的,继续跟入
我们可以看到 它是使用了 Unity3D 引擎上的 PlayerPrefs 来进行 存放和读取的
由于Unity3D 是跨平台的
PlayerPrefs 在不同的平台上 存放的方式 以及路径是不一样的
这个帖子说了 对应平台的路径[https://blog.csdn.net/william_lv/article/details/39520367]
我们在IOS上的数据目录下的Library/Preferences/包名.plist中可以找到 键为 unityplugin.keychain 的 UUIDString 值
这样我们就找到了Key
我们使用这个 就可以 进行读写了
其中定位金币和钻石的位置 不太好找
我找了较长的时间 只是定位了 金币和钻石
因为没有明确的名字 他这个应该是Hash值.坏滴很.
我的定位思路也比较模糊了.
就不发了
将存档读取修改写出然后替换即可.
代码放在了GitHub上,需要的自取
https://github.com/Imzpy/games
文件名叫 Sniper3D.rar
看下最终效果吧
东西随便买 舒服滴很
没有帐号? 立即注册