传统App加固技术,前后经历了四代技术变更,保护级别每一代都有所提升,但其固有的安全缺陷和兼容性问题始终未能得到解决。而下一代加固技术—虚机源码保护,适用代码类型更广泛,App保护级别更高,兼容性更强,堪称未来级别的保护方案。
安全加固刻不容缓
第一代加固技术—动态加载
第一代Android加固技术用于保护应用的逻辑不被逆向与分析,最早普遍在恶意软件中使用,其主要基于Java虚拟机提供的动态加载技术。
其保护流程是:
开发阶段中将程序切分成加载(Loader)与关键逻辑(Payload)两部分,并分别打包;
运行时加载部分(Loader)会先运行,释放出关键逻辑(Payload),然后java的动态加载技术进行加载,并转交控制权。
缺陷与对抗
第一代加固技术的缺陷是依赖Java的动态加载机制,而这个机制要求关键逻辑(Payload)部分必须解压,并且释放到文件系统,这就给了攻击机会去获取对应的文件。虽然可以通过关键逻辑(Payload)被加载后,被从文件系统删除,用于防止被复制,但是攻击者可以拦截对应的删除函数,阻止删除。
而关键逻辑(Payload)会被加密后保存,可用于对抗静态分析,但是攻击者可以通过自定义虚拟机,拦截动态加载机制所使用的关键函数,在这个函数内部,复制文件系统中的关键逻辑(Payload)文件。
第二代加固技术—不落地加载
相对第一代加固技术,第二代加固技术在APK修改方面已经完善,能做到对开发的零干扰。开发过程中不需要对应用做特殊处理,只需要在最终发布前进行保护即可。而为了实现这个零干扰的流程,Loader需要处理好Android的组件的生命周期。
主要流程:
1)Loader被系统加载。
2)系统初始化Loader内的StubApplication。
3)StubApplication解密并且加载原始的DEX文件(Payload)。
4)StubApplication从原始的DEX文件(Payload)中找到原始的Application对象,创建并初始化。
5)将系统内所有对StubApplication对象的引用使用替换成原始Application,此步骤使用JAVA的反射机制实现。6)由Android系统进行其他组件的正常生命周期管理。
缺陷与对抗
第二代加固技术在应用启动时要处理大量的加解密加载操作,会造成应用长时间假死(黑屏),用户体验差。
在加固技术实现上没有本质区别,虽然能防止第一代加固技术文件必须落地被复制的缺陷,但是也可以从以下方面进行对抗:
例如内存中的DEX文件头会被清除,用于防止在dump文件中被找到;DEX文件结构被破坏,例如增加了一些错误的数据,提高恢复的成本。
但是Payload被加载之后,在内存中是连续的,利用gdb等调试工具dump内存后可以直接找到Payload,进行简单的处理之后可以恢复出100%的Payload文件。
和第一代加固技术的对抗方法一样,不落地加载也无法对抗自定义虚拟机。只需对上述的关键函数进行拦截然后将对应的内存段写出去,即可恢复Payload。注意,由于IO相关的函数被拦截,所以无法直接调用read/write等函数进行直接的读写,需要使用syscall函数进行绕过。
虽然厂商会自己实现可能上述函数,从而绕过上述函数的拦截。但是Android的类加载器必须能找到对于的结构体才能正常执行,攻击者可以以类加载器做为起点,找到对应的Payload在内存中的位置。
第三代加固技术—指令抽离
由于第二代加固技术仅仅对文件级别进行加密,其带来的问题是内存中的Payload是连续的,可以被攻击者轻易获取。第三代加固技术对这部分进行了改进,将保护级别降到了函数级别。
主要的流程是:发布阶段将原始DEX内的函数内容(Code Item)清除,单独移除到一个文件中。
缺陷与对抗
指令抽离技术的某些方案与虚拟机的JIT性能优化冲突,无法达到最佳的运行性能。依旧使用了java虚拟机进行函数内容的执行。攻击者可以通过自定义Android虚拟机,在解释器的代码上做记录一个函数的内容(CodeItem)。接下来遍历触发所有函数,从而获取到全部的函数内容。最终重新组装成一个完整的DEX文件。目前已经有自动化工具可以指令抽离技术中脱壳。
第四代加固技术—指令转换/VMP
第三代加固技术在函数级别的保护,使用Android虚拟机内的解释器执行代码,带来可能被记录的缺陷,第四代加固技术使用自己的解释器来避免第三代的缺陷。而自定义的解释器无法对Android系统内的其他函数进行直接调用,必须使用JAVA的JNI接口进行调用。其主要实现由两种:
A.DEX文件内的函数被标记为native,内容被抽离并转换成一个符合JNI要求的动态库。 动态库内通过JNI和Android系统进行交互。
缺陷与对抗
不论使用指令转换/VMP加固的A方案或者B方案,其必须通过虚拟机提供的JNI接口与虚拟机进行交互,攻击者可以直接将指令转换/VMP加固方案当作黑盒,通过自定义的JNI接口对象,对黑盒内部进行探测、记录和分析,进而得到完整DEX程序。
下一代加固技术—虚机源码保护
跟第四代的VMP加固技术,虚机源码保护加固是用虚机技术保护所有的代码,包括Java,Kotlin,C/C++,Objective-C,Swift等多种代码,具备极高的兼容性;使App得到更高安全级别的保护,运行更加稳定。
虚机源码保护为用户提供一套完整的工具链,首先把用户待保护的核心代码编译成中间的二进制文件,随后生成独特的虚机源码保护执行环境和只能在该环境下执行的运行程序。
虚机源码保护会在App内部隔离出独立的执行环境,该核心代码的运行程序在此独立的执行环境里运行。即便App本身被破解,这部分核心代码仍然不可见。
加固技术发展及其攻防对抗的更迭,伴随着互联网技术发展不断升级,我们深信邪不能胜正,而虚机源码保护加固作为当前领先的加固技术,在未来很长一段时间,能够为App提供足够强度的保护,为企业和开发者的业务发展保驾护航。