A-A+

基于弱联网游戏讲安全攻防

2019年05月11日 网络安全相关 暂无评论 阅读 58 views 次

以下文字转载自https://www.52pojie.cn/thread-953038-1-1.html

 

   前几年乐元素CTO凌聪有一篇分析手游作弊(主要是弱联网休闲游戏的作弊)的帖子,他从弱联网游戏可能存在的多种安全问题来分析玩家或破解者可能采用的手段以及研发商可以采取的对策。最后他总结了对各种问题的解决方案。
       这里我就着对腾讯安全实验室的相关帖子技术的了解,和逆向实践的经验,大范围的讲述一下手游的攻防问题,切入点,和方法手段
  (一)弱联网手游
  这里我们主要讲弱联网游戏,所谓弱联网,除了一些必要的交互,副本和战斗场景中的计算都是在用户本地完成的,这是手游在当今市场环境里获得地位的重要手段。
 
  (二)弱联网游戏可能存在的安全问题
  第一,帐号被盗。
  第二,本地配置被篡改。
  第三,存档复制篡改。
  第四,内存被修改。
  第五,网络协议被破解和重放攻击。
  第六,客户端包体被逆向破译。
  第七,二进制程序被修改。

       (三)弱联网游戏安全
         1.防范帐号伪装
          首先一个过程是登陆的过程,我们抓取各类游戏和网址登陆的过程中传输的包就可以很明显发现,除了账号和密码外,还会传输一个session key,一个user id,甚至像猪厂的大型游戏,会把账号登陆的IP也传到服务端。
          SessionKey有两个作用,一个是防止多Session登陆,另外,SessionKey和UserlD是关联的,因为SessionKey每次都不一样,所以要伪造比较难。他这里也就是说,你这个账号对应的这个UserlD是唯一的,你每次对应有不同的key,这样子可以防范你直接上传伪装好账号的包体然后登陆。
         IP很明了,你昨天在用深圳电信登陆,今天在山东用4G,后天去江西登陆。检测到这样的行为直接冻结账号,然后再通过绑定的手机和邮箱联系号主,让其申请解冻。
       我曾今对一个防范较弱的游戏,通过直接伪装user id和一些其他信息,成功登陆别人的账号(当然只是看了一下这个老哥的属性截个图就下线了)
       通过社会工程学而导致的账号被盗情况这里不赘述。

        2.防止存档篡改  以魔兽官方对战平台为例,对于平台上的RPG,一般都会有存档机制,比如你打完难度一,给你发难度一的奖励英雄或者道具,这个就是存档的内容。现在有软件可以直接提交lua脚本刷存档,改好需要存储的数据,提交给服务器,存档就生成覆盖了。
      方法:加密存档。加密方法可以用AES等标准的安全商用对称加密算法,也可以使用自己研发的加密算法。
      这里面加密协议,算法,密钥都不能放在代码和存档里面,否则容易被找到破解。
      增加安全度的措施:密钥生成有随机度,对加密后的明文进行安全处理,密钥生命周期进行严格把控。
       3.存档协议设计  第一,初始向量。尽量每次都不要一样。
  第二,版本号。
  第三,源数据哈希。验证你解密后的存档数据是不是一致的。
其他。

       4.防重放攻击
       重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。
怎么进行重放攻击,参考一下这个帖子,用fidder抓包伪装,自己搭建服务器发送给游戏服务器,https://www.52pojie.cn/thread-735160-1-1.html。
        至于要防范重放攻击,百度给了三种方法加随机数,时间戳加流水号。
        其实简单的来讲就是你要给包里面加一个tag一个参数来辨认他,是否是使用过的,过期的,如果是,那必然是作假无效的。
        
        5.针对内存修改
        有三种内存,第一种是传输型的内存,传输性内存是不用加密的,因为传输型内存都是一次性的。另外一种是永久型内存 ,这肯定是要加密的,用户状态比如你的血、精力值这些都是永久状态。第三种是暂态内存,就比如说你这个副本经验是按杀怪个数来算的,但是经验的结算是副本结束才会进行的,那么你杀一只怪,这个1和相对应这只怪的经验x就是暂存的,这个就是需要加密的,不然就可以修改"1"或者"x"来加经验迅速升级。
         修改器主要的方式是1.对比内存 ,内存值变了n次之后,它找到你内存的偏移地址,可以定位到内存地址在哪里。比较好解决,用非常简单的加减法可以解决加密问题,因为它找不到原来的数据。2.高级一点的就是假设你原来攻击为1000,你升级加了234,它支持加减法,直接加减或者乘除你变动的具体数值就能找到相应数据,所以内存的加密函数需要变化。防止内存修改最简单的方式是做一个加密的HashMap ,进的时候是加密的,出的时候是解密的,在函数里面加上一些较为强加密的算法就行了。
         当然我们还有其他的方式防止内存被修改,游戏肯定是要你提供一些权限和信息的,只要通过收集相关的应用数据,就能判断出你是否下了修改器等第三方软件。
如果特征码或者其他信息对应了,那么要么不允许进游戏,要么封号。
        
       6.限制存档降级等  一个版本有漏洞,厂商打了个补丁过去,结果用户发现之后赶紧把代码回滚到以前,然后再打开存档 ,这样的话就可以再次修改,这个就是存档降级。
   存档降级的解决办法,旧版本的存档被新版本程序读取之后,要转换为新存档版本。而新存档不能给旧程序读取。我们还做了在服务端校验,如果设备里面生了新存档 ,不能再用旧存档。 防止一个设备上来回存档的问题。
        或者说这个版本客户端包体出现漏洞,游戏厂商更新安全手段后可能用户拒绝更新,或者采用逆向手段废除你的更新(比如伪造版本号,即使经过md5或者其他加密),这就需要采取一些热更新或者更先进的手段,魔高一尺,道高一丈嘛。
        7.客户端程序被逆向
        针对不同的开发引擎,有不同的逆向方法,这个可以参考我以前的帖子或者论坛里针对u3d和coco2d-x的破解,当然我还没看到u4d游戏的破解,而猪厂已经在招聘U4D游戏的开发工程师了。这部分逆向的根本思路就是:根据游戏的开发,来进行逆向。比如U3D,现在统一使用c++脚本编写,我开发这个游戏,游戏引擎把关键函数和一些重要信息放在哪个文件夹,我们需要的计算伤害、胜利、血量的逻辑在文件或者函数的哪一块,那逆向我们就要去找到这个函数,这个逻辑或者这个数据的寄存器。然后就好进行修改,可能遇到混淆那么我们就反混淆,遇到加密就解密,能hook就hook,能动态调试就动态调试.....
      
       这里给一下
       防范程序被逆向破解的方法  第一,符号隐藏,函数符号表隐藏住。特别是加解密函数。
  第二,关键字混淆。
  第三,程序逻辑混淆。
  第四,内存加密。
  第五,阻止动态跟踪调试。
  第六,二进制程序校验。这里除了你提交的主程序之外,另外一个也要防止篡改。
  第七,Lua脚本加密。
       而对应的逆向方法
       第一,符号隐藏并不是符号就没有了,消失了,他可能是被分割到不同文件了,可能是被处理成另外的符号了;是不是分割了很明显看的出来,那我们就找到另一半拼接起来,被改写我们就改写回来。
      第二,对于关键字混淆,比如开发时的set_pysical_attack(物理攻击相关的函数)他可能混淆成让你看起来莫名其妙的东西,可以理解为另一种加密,这里我们就要进行反混淆,对混淆这块了解的有限,这里不详细讲解,一般我是用的de4dot来进行反混淆,目前国内混淆和反混淆技术有限,学习资料更是少的可怜,这里我们一般会使用工具就可以了。
      第三,对于函数,除了参考第二条,hook应该是一种实用的方法,这里推荐https://www.52pojie.cn/thread-730806-1-1.html,这个帖子看完应该差不多了,还有不明白的网上学习资料也很多,自己好好利用搜索引擎。
      第四,内存再怎么加密,他最终还是要以明文在程序中跑的,所以这就是一个赛跑的过程,你加密比我解密nb,我就破解不了,反之你就完蛋。
      第五,如果程序阻止了动态跟踪,要怎么解决其实是很专业的一个问题,这里涉及到汇编反汇编,PE,加解密,重定位等各种知识,要弄清楚对方是怎么阻止动态跟踪,需要一些非常规手段和一些奇技淫巧,这里我还是建议大家就放弃动态调试,去走别的路子。
      第六,他校验嘛,我们绕过或者干脆找到校验的部分注释掉好了。
      第七,现在一般的游戏下面都是放的luac文件了嘻嘻,这里直接放鹅厂安全实验室的文章吧,https://www.freebuf.com/articles/system/103388.html。
      通过这部分你其实可以发现,安全攻防战打到最后还是数学上的交锋,计算机学到最后还是学数学。
      
      要阻止玩家作弊当然还有别的手段,既然你玩家可以攻击我,我这边其实也可以”攻击“你,首先信息方面,游戏产商是可以收集玩家PC和移动端数据和信息的,也可以监听玩家在游戏过程中的操作,在不考虑服务器计算量的情况下,游戏方可以通过监视你数据变化来判断,观察后台相关数据,记录你PC移动端的特征信息比如IMEI等等,重放你游戏过程判断是不是与你操作的一致,利用人工判断...当然服务器资源是很宝贵的,一般最多用一种方法来针对作弊,需求资源多的还不能做到普及每个用户,只能随机取样。
      这个帖子对我而言相当于一份总结和日记,有事没事瞅一眼,保证脑袋思路是清晰的。同时希望大家有自己的看法和思考= =。

标签:

给我留言

您必须 登录 才能发表留言!

Copyright © 软件智博 保留所有权利.   Theme  Ality 鲁ICP备17027378号

用户登录 ⁄ 注册