关于移动安全加固,大家也许会遇到各类问题,这里以Q&A形式总结的一些Android/iOS/SDK/VMP加固保护的常见问题,希望对各位读者有所帮助。
1.为什么要进行SDK加固?
SDK加固非常重要,如果不加固,可能会产生以下安全隐患:
(1)易被竞品或恶意者窥视内部实现细节或内部调用流程,甚至有可能泄露隐私数据。安卓平台SDK绝大部分都是Java语言编写,容易被反编译。如果只是简单的混淆,很容易被窥探到内部实现细节,泄露隐私数据。更重要的是,如果这些细节涉及到关键技术实现点的话,无异于泄漏核心技术。
(2)被恶意者通过字节码注入等手段植入恶意广告或恶意代码然后重打包发布。由于SDK的特殊性,不像App那样存在签名校验逻辑,因此一旦恶意者在你的SDK中植入了一些恶意代码或恶意广告然后重新发布的话将很难察觉,严重影响开发厂商的品牌形象与口碑。
(3)被破解者绕过关键逻辑造成经济损失。如果SDK存在支付功能,被恶意者分析找到付费逻辑,恰巧涉及付费相关逻辑也未很好的做服务端校验的话,一旦恶意者通过AOP手段去除这些付费逻辑,意味着将可免费使用付费服务。
(4)SDK本身可能存在漏洞,易被恶意者利用。SDK开发者在开发中往往把开发重点聚焦在了功能的实现上,在安全性上一般不会过多重视,因此很难保证自己开发的SDK不存在任何漏洞。因此一旦SDK出现一些安全漏洞被恶意利用,不仅危及用户的数据及隐私安全,也会严重影响SDK开发厂商的口碑,甚至造成经济赔偿。
2.如何对SDK进行加固?
目前市面上绝大部分开发者使用的混淆的方式——Proguard。Proguard是安卓平台使用最广泛的混淆,通过抽象语法树从语法层面进行处理,使得处理后的代码难以阅读和理解。 不过将类名和方法名修改为一些无意义的随机字符串,比如“a,b,c”,虽然能够提高破解者阅读与理解成本,但是很显然作用是极其有限的。对于破解者而言,分析出代码的意图只是时间的问题。
建议采用专业第三方安全厂商的SDK加固服务,比如网易易盾的SDK加固解决方案:
(1)易盾SDK加固VMP方案:将待保护类的方法进行抽空,并对抽取的指令加密处理,在运行时通过自定义虚拟机执行,从而使得破解者无法得到原始代码逻辑;
(2)易盾SDK加固Java2c方案:该方案是将待保护类的方法Native化,同时将原函数实现逻辑转为Native层对应的C/C++代码,运行时直接执行对应的Native函数。
3.iOS代码保护的方法有哪些?
(1)字符串混淆:对应用程序中使用到的字符串进行加密,保证源码被逆向后不能看出字符串的直观含义。
(2)类名、方法名混淆:对应用程序的方法名和方法体进行混淆,保证源码被逆向后很难明白它的真正功能。
(3)程序结构混淆加密:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。
(4)反调试、反注入等一些主动保护策略:这是一些主动保护策略,增大破解者调试、分析APP的门槛。
添加以上的一些代码混淆措施后,iOS APP的安全性会获得很大的增强,大大提高了破解者破解的难度。
4.如何实现Android SO文件保护?
目前SO文件保护方案大概可以分为有源保护和无源保护,有源保护分为自解密、混淆、源码VMP等,无源保护分为加壳、VMP保护。
有源保护中的自解密保护的原理是:先加密需要加密的函数或者段,然后再加载SO文件,解密先前加密的函数和段。由于运行后需要解密相关的逻辑,因此破解者只需要在SO文件运行后,DUMP内存,即可获取解密后的逻辑,破解门槛低,因此自解密的保护方式存在安全强度低、维护成本高的缺点。
还有一种常用的SO源码保护就是基于LLVM的混淆,通过指令替换、控制流扁平化和虚假控制流等角度去混淆源码。由于源码混淆的方案在安全强度方面不够,因而出现源码VMP的解决方案。
相对基于LLVM的混淆,VMP安全强度更高,并且对SO文件的体积影响也较小。
但是以上基于源码的保护存在一个相同的问题:接入成本高,需要处理源码就需要有本地工具,特别有些游戏引擎非开源,那基于源码的保护则无法接入。
关于SO文件保护可以点击以下文章了解更多:
为什么说SO加固+无源码VMP是最佳的Android手游安全保护方案?
4.VMProtect是什么意思?
VMProtect 是新一代的软件保护系统,将保护后的代码放到虚拟机中运行,这将使分析反编译后的代码和破解变得极为困难。使用 MAP 文件或内建的反编译引擎,您可以快速选择需要保护的代码。VMP核心的原理是基于 Dalvik 的解释器实现自己定义的指令。
关于VMP加固的原理及如何实现可以通过以下文章了解更多: