2020-03-11

软件防逆向、破解对抗 – 你想要的都在这里

作者:好中文的样子 所属分类 - 安全 - 干货 - 黑科技

不管是什么平台,譬如Windows、Android或iOS,总有大量的该平台破解软件充斥着网络。而软件制作者最为头疼的也是软件的抗逆向、抗破解和抗二次打包。特别是某些单机游戏,这里举个最简单的例子,就是中国版神庙逃亡:中国版神庙逃亡由国外公司制作,中国公司代理,软件采用内购付费方式提升游戏体验,采用签到方式获取部分游戏币。例如游戏当中玩家死亡,则需使用游戏币复活(神庙逃亡当中为钻石),若玩家签到得来的游戏币不足,则需要充值获取。为了防止破解,游戏较新的版本采用了加固手段,不过目前来说,破解内购的版本仍然有,破解版无需付费即可直接获得游戏币。软件安全十分重要,以该例子为线索,导出我们今天的主题。

软件逆向攻防

对抗破解第一步:加密、混淆代码

最早防止破解的方法就是混淆,特别是Java,让代码可读性变得非常差。Windows上加密方法通常指加壳(安卓叫加固)。Android平台上有个工具叫ProGuard,该工具起初为免费开源代码混淆软件,不仅可以将安卓软件dex当中的方法、类名混淆,还能缩小体积。

这里再举个例子,例如某软件当中,混淆之前类名和方法名如下:

private class VipUtils
{
  static public boolean isVip(){return this.isVip;}
}

那么,假如破解者直接拿未混淆的dex,逆向(反编译到jar)并转换为java源码,即可清晰看见此类名和函数名。该软件新版已经对此类进行了混淆,从而让可读性变差。新版本的类名以及函数具体实现如下:

private class axvz
{
  static public native boolean b();
}

可以看出来可读性变得确实十分差了,这样对于一些水平不好的逆向用户,还是会增加不少破解难度的。

当然除此以外,还可以给软件加壳,Windows上常见壳为压缩壳,例如UPX、ASPack、英格玛等。部分壳(例如VXX)破解难度太大,即使解压出的代码也很有可能是膨胀后的代码,这里不阐述。

加固大约就是将代码加密打包,执行的时候解密(或释放)代码,俗称加壳。如果不是指令抽取的方式,而是直接将源代码二进制文件释放执行(例如UPX、各种安卓免费壳),这种无异于无保护。对于稍有经验的破解人员来说,这种简单的加固是没有正确混淆的作用大的。

是否加固就没有用处呢?也不是。如果程序本身已经开发到末尾,无法配置混淆,则仍然需要进行指令抽取类的保护,这种保护对于大多数逆向破解人员来说是非常棘手的。

360加固保结构图

有防必然有攻,软件混淆得比较厉害的,大多本身也是一个逆向软件,例如某T管理器。而混淆本身也只是会增加破解人员的耗时,某T管理器正是利用了这一点,内部所有功能实际上都非常好实现,破解人员可以花非常少的时间去实现功能,而不需要破解。除了这些软件,还有很多软件也采用了混淆的方式保护代码,例如头条系列的软件(头条混淆程度一般,没网易云厉害,对于有经验的开发人员来说并没有作用)。

我们总结一下混淆、加固的优缺点:混淆可以使得代码反编译后可读性很差,并且能够加快程序运行速度(如果是压缩代码模式的话),缺点是配置较为麻烦,无法自动化,这种对抗逆向与破解的方式是较为推荐的。加固可以提升逆向门槛,直接将入门级逆向人员挡在门外,缺点是使得程序兼容性变差、运行速度变慢,如果不是非常有必要,不推荐使用这种方式对抗破解、逆向。

软件混淆后是否会被破解或逆向,取决于破解、逆向以后产生的价值(废话),后面我们会介绍另外一种抗破解的思路,我们接下来先谈谈移动端另外一种对抗破解的方法。

移动端对抗新姿势

这段算是题外话。移动化是趋势,目前移动软件流行,因此产生了很多移动端专属的对抗策略。iOS端为采用ollvm对汇编代码进行混淆、膨胀,而iOS与Windows相似,逆向门槛较高,这里也不展开讨论。

安卓由于系统实现的原因,破解大多为修改Java层。如将业务逻辑代码放入原生(Native)层当中,则会明显增加逆向、破解难度,提高逆向门槛。如果将so再次进行混淆、加壳,则会进一步提升难度。例如头条系列的软件,采用了这种方式处理原生库。只有经验丰富的逆向开发者,才能够修改软件逻辑或者知晓软件逻辑。由于原生层进行了混淆,增加了大量垃圾代码,这样直接将大多数中低级逆向人员拒之门外,使得软件安全更有保障。

简单例子:Java层的用户是否为VIP逻辑判断转移至原生层,并尽量避免Java逻辑暴露。这个在很多软件当中都能看见。

安卓端采用原生库保护代码,如果不在原生层回调Java层,则效率还是比较高的,不影响性能。缺点仍然是会造成兼容性下降,以及占用较多运行内存等(使得低端设备卡顿),需要衡量用户体验和对抗收益。

某安卓软件原生层逻辑

大势所趋:云计算之软件/网页篇

目前很多软件业务功能完全可以在服务端实现,例如大多数视频软件的VIP均在服务端实现判断,客户端只需要提交用户名。

这里对两个较知名软件做一个简要解析,这两个软件在对抗方面没少下功夫,这种软件安全思路值得学习。

首先介绍一下某酷视频播放软件,本地将用户名、密码提交以后,服务器会返回一个token,存于cookie当中(网页版)。用户如需观看vip视频,则需要提交此token。早期该视频并未对token播放做出限制,破解方法也很简单直接,就是多人共用同一个token。只需要有一个人买单,大家即可共享此token,这个是软件、网页开发者所不想看见的。

视频播放

最新版的某视频软件、网站已经对token、用户名作出了限制,大致是只允许token同时获取数个视频,以及限制同一用户最大登录设备数量。破解方法当然有,就是购买多个付费账户,轮流用即可,很多基于这种付费网站所产生的第三方视频网站,就是使用了多个付费账户并循环使用。

当然还有我们熟知的某度云,该软件最开始为本地判断VIP,若不是VIP则本地进行限速,早期可通过简单的手段(内存修改或者直接对软件二进制进行修改)破解限速。目前来说,同一账户、同一IP没购买VIP,下行流量异常(太快、太多),某度云则会封锁此账户并对之进行服务端级别限速(无法解除)。

这里我们看见了服务端的作用,接下来我们谈谈游戏的。

游戏破解、逆向价值非常高,特别是一款热门、内有付费的多人联机游戏。这里接软件混淆部分,继续谈谈如何利用服务端对抗破解、逆向。

大势所趋:云计算之游戏篇

很多多人联机游戏由于自身限制或者由于初始的设计缺陷,导致游戏外挂横生。例如著名的侠盗猎车手5、蓝洞的绝地求生(吃鸡)、CF、CSOL和战地1。这里我们简要分析为何这些游戏外挂如此猖獗。

侠盗猎车手5、CF和战地1等等游戏,服务端只对客户端数据做最小的分析,然后分发给其余客户端。并且这些游戏大量采用P2P技术,客户端之间没有对传输的数据进行校验。例如,物体移动速度、跌落时间、弹跳高度、视野距离等等......这样也让外挂趁虚而入,催生了无敌、透视、飞天遁地、秒杀等等“黑科技”。

只剩你一个人没有开挂了!

在游戏攻防一书当中,介绍了Windows的一些外挂注入手段,大致如下:

  • 注册表注入
  • 远线程注入
  • 依赖可信进程注入
  • APC注入
  • 消息钩子注入
  • 导入表注入
  • 劫持进程创建注入
  • LSP劫持注入
  • 输入法注入
  • ComRes注入

我们只需要从这几个方面做好防御和检测即可,例如采用驱动进行检测(TP正在使用的方法,使得调试、注入成本提高)。那么有人就问了,为什么不能做服务端检测?这里我们会很明显的看见,这些游戏都有明显的共同特征:都是FPS游戏。如果对客户端传来的数据强制检测,则会造成如下后果:

会造成服务器负荷过大,提高运营成本;在对枪杀人时,几十ms的延迟可能会扭转战局(用户骂娘,问候土豆服务器运维的爹妈);会极大影响游戏体验(操作延迟)。

信息安全、软件安全的一个基本原则,永远不要相信用户的输入。这里的输入就是指在本地进行运算的结果。本地进行的计算越少,与服务器交互的越多,外挂利用难度更大。由于大量的计算都是在本地完成的,而游戏又是运行在内存中,那么导致了我们有很多种方法进行利用。最简单的就是用CE修改内存里的数据,常规的有注入和Hook,还有各种奇淫技巧。这里不再展开叙述。

有没有利用服务端进行计算的游戏呢?当然是有的,例如某者荣耀,这个游戏从服务器计算伤害、技能范围、技能释放时机、目标是否命中等,缺点也非常明显,最常见的就是因为“460”而造成团战失利,用户砸手机。当然这样的游戏也避免不了外挂,例如英雄技能释放脚本(几乎模拟了一个非常高水平玩家的操作)以及全图透视脚本(视野计算占用服务器资源太多,而且算是对游戏影响相对较少的一个因素)。

向Win32的某些软件致敬与学习

为何这样说?笔者暂且保密不谈。

如需了解该详情,可联系笔者沟通。

欢迎加QQ 384550791联系笔者,备注了解软件防破解。价格低服务优,100%防暴力破解,支持任意软件,不管是已经做出成品还是正在初始开发阶段的软件,我们能提供最佳的企业级防逆向、对抗措施。

结语

不管是软件安全、网页安全工作者还是恶意应用作者、恶意应用开发者,都在不断学习新的姿势互相对抗。

对抗、反对抗衍生了一批又一批的灰黑色产业,让我们不得不感叹这个行业的强大。希望大家看完本文,能够有所收获,让自己的业务系统更加健壮。

软件安全、网页安全是一个持久的话题,有利益,自然有人涉足。本文仅作为介绍和参考,如有侵权,请联系作者修改。

麦科技原创 转载请说明出处