首页
社区
课程
招聘
6
[原创]iOS平台游戏安全再议之存档修改与防御
发表于: 2012-10-17 12:19 17266

[原创]iOS平台游戏安全再议之存档修改与防御

2012-10-17 12:19
17266

因为博客中图片太多,需要图文并茂的,欢迎到原博客阅读

http://danqingdani.blog.163.com/blog/static/1860941952012993941578/



    一款游戏,如果免费功能做得足够吸引,那玩家下一步就会想要尝试收费部分。这时候,单纯玩家会走上正常付费路线,而较为吝啬的玩家则会尝试搜寻该款游戏的外挂,比如说xxx破解版,xxx完整版,xxx补丁,xxx存档,xxx辅助。



       对于iOS游戏,玩家首先会在比较火的论坛里去搜索,例如威锋网 。我们试着用关键字“修改” 在这个论坛进行搜索,可以找到很多iOS游戏的修改攻略,说不定有一个就是你家开发的游戏。





       进入该论坛后,玩家会发现这里有很多“志同道合”的人,人多到可以为游戏存档修改建立了专门的分区。





       随着移动游戏的进一步兴起,专业的移动游戏修改网站也在兴起,例如BHGBOX论坛就是一个专门交流iOS内购解锁的论坛,该论坛近期还加入android游戏修改的专栏。



       有这种想学游戏修改攻略的”积极“玩家,也有那种懒得自己动手更想用钱解决问题的玩家,同样有需求,也有满足需求的地方,淘宝或拍拍上就有大量出售游戏作弊的店铺。





       其实像这种在淘宝上买卖iOS游戏中货币,装备,等级,新关卡解锁的店铺,从iOS游戏刚兴起到现在app繁荣,商品内容和商品说明也发生了不小的变化。



       第一阶段:利用的是黑卡充值。



       第二阶段:存档修改,这时候服务态度超好的商家会给亲远程协助,他们会在商品说明中给出操作方式甚至是操作原理,实诚得让你不好意思不买。(下面截图来自我非常喜欢的掌柜卷卷熊的商品说明,现在有不少店铺盗用这张说明,我可以证明是卷卷熊原创)







第三阶段:发展这个阶段,百花齐放,有了八门神器,也有了iap cracker,iap free,但绝大多数还是采取的存档替换,因为存档替换不走支付流程,不会产生非法订单, 不可能通过核对订单的方法发现问题,相对很安全(内存修改也不产生订单,也是较安全的作弊方式)。除了安全,还有一个就是较容易,很多开发没有意识到存档会被各种方法修改,于是在防御上,有不少裸奔的(完全明文),有不少穿薄纱的(简单编码),导致很容易作弊,当然应用在存档修改的猥亵下,也逐步穿上了防护服。存档修改不是iOS游戏首创,PC机上的单机游戏早就经历了并正在经历这种摧残,而主流的iOS游戏都是弱联网游戏,都更类似于单机游戏,因此很不幸的遗传了单机游戏与生俱来的改存档硬伤。



      


        从应用在设备上的安装目录结构上看,我们可以发现Documents和Library文件夹就是存档修改的重要关注对象。Documents主要用于存放用户文档和应用数据文件,例如用户的帐号信息,用户的游戏数据。而Library主要用户存放应用相关文件,例如应用内购相关文件就存放在此。除此之外应用的mac-o excutable文件也是重点关注对象,通常是在存档由于加密等因素无法简单的定位到存档修改点时用于逆向分析修改。





            


        


         在摸清了存档的存放位置,下一步需要了解存档的存储格式,不同的格式对应不同的修改方法。一般会有以下三种格式,明文格式,弱编码格式,二进制格式。下面看看具备不同存储格式的游戏存档修改实例:



1.明文格式



(1)PLIST


      例如游戏kingdom rush的内购相关数据文件 /Library/Preferences/com.armorgames.kingdomrush.plist, 用pledit编辑器就可以查看修改。





其中hashHeroDenas的值为true还是false决定了Denas关卡是否解锁。将其修改成true则解锁了Denas关卡。


      判断是否是plist格式,不能仅仅靠文件后缀名,在windows下可以用记事本打开,然后观察文件头是否含有bplist00这个标识来判断。也可以用strings | head -1 查看文件头字符和file命令查看文件类型。



(2)SQLite3(数据库)


     例如游戏鳄鱼小顽皮爱洗澡的内购相关数据文件/Library/water.db采用了sqlite3格式,在windows下可以用SQLite Database Browser工具进行查看与SQL操作。也可以用sqlite3命令操作。





  上图中红框部分的SQL操作就能解锁该游戏的所有关卡。


         同样判断是否是sqlite3格式,也不能仅仅靠文件后缀名,用记事本打开如果文件头为SQLite format 3则可以判断是sqlite3数据库格式。也可以用strings | head -1 查看文件头字符和file命令查看文件类型。



(3)JSON


例如游戏MyTown2的用户数据文件/Documents/LocalFiles/savegame.json,就是json格式的,一般是UTF-8 Unicode text编码,可以直接用记事本进行查看修改。





红框部分就是对应的游戏等级,经验值,游戏币数量。



2.Base64编码格式



例如游戏Cleopatra's Pyramid的内购相关数据就存放在文件/Library/Preferences/com.gameduell.cleopatraspyramid.plist中的CLEO_APP_SAVE_DATA部分,并采用了base64编码。base64编码比较容易识别,如何一段文本中包含大小写字母,数字,+,/,结尾有=基本就是base64编码格式了,除了好识别,同样的也非常容易解码,网上就有不少很好的在线解码网站。





如上图只需要用pledit编辑器打开该文件,将CLEO_APP_SAVE_DATA部分拷贝到base64解码网站转换为明文格式,然后再用pledit编辑器查看修改,再还原成base64编码格式,最后替换原文件的CLEO_APP_SAVE_DATA部分即可。



3.二进制格式(data格式)



例如里约热内卢:圣徒之城采取二进制方式保存存档Gangstar3.sav





其中A8 61就是25000的倒序存储(25000转换为十六进制为61 A8),为游戏中荣誉值。


这种格式的文件只能用十六进制编辑器打开。玩家会尝试修改文件中记录的等级,积分,道具,货币等在游戏界面有回显的数值。如果存档未加密,一般都是将游戏数值转换成十六进制,然后在文件中搜索(一般采用4字节倒序的存储方式),如果数值很小或者在文件中不是唯一,就需要回到游戏多次操作,对比文件的变化来定位修改点(很内存修改方法类似)。如果能定位到修改点但修改不成功则说明文件做了完整性检验,需要突破检验方法。如果不能定位到修改点则说明文件做了加密处理,则需要找出加密算法解密存档,难度比较大,需要逆向弄清逻辑。



        只是修改存档,对某些游戏,并不能达到内购解锁的效果,这时候,我们需要简单了解一下IAP的相关知识,产品类型不同和交付方式不同,带来的存档变化也不一样,所以我们在修改方式上可以看到,有的游戏只需要简单的修改一下配置选项,有的游戏则需要额外的数据文件覆盖。



app store的产品种类有四种


1. 内容型。包括电子书,电子杂志,照片,插图,游戏关卡,游戏角色,和其他的数字内容。


2.扩展功能。这些功能已经包含在app内部。在未购买之前被锁定。例如,你可以在一个游戏程序中包含若干小游戏,用户可以分别来购买这些游戏


3.服务。允许程序对单词服务收费。比如录音服务


4.订阅。支持对内容或服务的扩展访问。



也可以简化为以下三种:


1.消耗性商品,该类商品在需要时被单次购买,每次购买都需要再次验证帐号,例如游戏中额外的游戏货币,道具。



2.非消耗性商品,该类商品只需购买一次,一旦被购买,和该用户iTunes账户关联的设备都可以使用此商品。例如完整版游戏,额外的关卡。



3.订阅类,具备以上两种特性。和消耗性商品一样,可以被多次购买,订阅有效期过则可再次购买。和非消耗性商品一样,订阅类商品可以被和该用户iTunes账户关联的所有设备使用。但需要游戏服务器来支持多个设备间订阅服务的共享。



app store的交互方式分为以下两种:


1.内置类型(Built-in model)


这种模型的特点是整个购买流程不需要独立的游戏服务器,需要交付的产品已经存放在前端设备中了,需要前端自己的逻辑来处理。非消费性商品常采用这种模式。




[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2024-5-31 06:06
心游尘世外
为你点赞~
2024-5-31 02:58
QinBeast
为你点赞~
2024-5-31 02:50
飘零丶
为你点赞~
2024-3-31 03:08
shinratensei
为你点赞~
2024-2-1 05:45
PLEBFE
为你点赞~
2023-3-7 00:39
最新回复 (8)
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
2
我一直忽略了移动游戏安全这个方向,没想到问题这么多。。
2012-10-17 17:27
0
雪    币: 651
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
  听说这是个妹纸。
2012-10-17 18:00
0
雪    币: 56043
活跃值: (21220)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
文章不错,感谢分享!
图片是有些多,我手工将其转到论坛本地收藏了,方便以后整理到精华集中去。
2012-10-31 20:44
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
坛主精神可贵.居然是手动的
2012-11-1 01:41
0
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
谢谢碳基体大牛分享文章
2012-11-1 03:28
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
太爽了!!!!
鳄鱼小顽皮爱洗澡我改的是1.9版的,位置有点变化,语句也有点变化,但还是很感谢!
下面为改的语句:
update collectibleinfo set unlocked=1,hasviewed=1

update crankychallengeinfo set available=1

update foodinfo set unlocked=1,hasviewed=1

update hubinfo set bought=1,unlocked=1

update levelinfo set unlocked=1,available=1

update levelpackinfo set unlocked=1,hasplayed=1,hasalerted=0,bought=1
2012-11-3 00:22
0
雪    币: 71
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
有玩家,有利益,有交易。
2013-5-6 10:19
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
如果游戏中游戏金币每一次变化(如买和卖)都要做服务器验证,是不是就没法改了?
2014-11-29 16:57
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册