学术论文 | 一种基于Java代码Native化的ARM VMP保护方案

近日,由华云信安旗下「极牛攻防联合实验室」移动安全攻防专家联合撰写的《一种基于Java代码Native化的ARM VMP保护方案》一文,经网络安全专家评审和推荐,入选中文核心期刊《信息网络安全》,这是对网络安全技术能力和学术水平的最高认可。

该学术论文作者信息如下:

叶绍琛:网络安全攻防技术专家,极牛网技术委员会主席,CTFWAR网络安全攻防对抗联赛发起人,《网安观察》社群期刊总顾问,大中华区前50位RHCA系统架构师,曾任网易互娱云计算平台技术负责人,曾获国家科技部和教育部联合颁发的教育信息化发明创新奖。

陈鑫杰:网络安全技术专家,极牛网总编辑,网络安全在线教育平台「拼客学院」院长,国家网安基地战略合作讲师,Bilibili知乎知识领域优质UP主,51CTO学院金牌讲师,全网学员超300万人,腾讯安全合作伙伴,多地网警技术顾问,多次协助抓获大型网络诈骗团伙。

蔡国兆:移动应用安全技术专家,Android APT攻击资深研究员,极牛网移动安全版块主编,浩海云攻防实验室技术主管,负责Android/iOS移动应用自动化安全评估和移动应用安全加固体系的研发,对Android操作系统内核安全及恶意代码逆向分析有多年研究经验。

《信息网络安全》是由中国公安部主管、公安部第三研究所、中国计算机学会共同主办的网络空间安全领域的综合性学术核心期刊,该刊论文被中文核心期刊、中国科技核心期刊、中国科学引文数据库、中文学术期刊全文数据库、中文科技期刊数据库等索引收录,是我国网络空间安全领域最权威的学术期刊,代表我国网络安全的最高学术水平。

随着传统代码加固手段逐渐被逆向工程攻破,Android软件所面临的安全风险越来越大,文章以Java代码Native化技术为基础,结合代码虚拟化技术,提出一种基于Java代码Native化的ARM VMP保护方案,将Android应用中容易被反编译的Java层代码下沉到Native层,并使用ARM VMP技术进一步对Native层代码进行保护,目的是在不需要为Java代码和C++代码各自设计一套执行虚拟指令的虚拟机的前提下,将指令虚拟化技术覆盖至Java代码和Native层代码。理论分析与实验结果证明,文章所提方案能够在提升代码逆向难度的同时控制加固后Android应用安装包的体积大小。

随着移动终端设备的普及,移动应用数量呈爆发式增长。如今Android与苹果两个系统在移动端操作系统市场占比超99%,其中Android占比达72.72%。目前Android应用的主流开发语言是Java,将Java源码先编译成Dalvik中间码,再利用Android虚拟机解释运行。Dalvik中间码的可读性使得攻击者可以轻易将中间码反编译成源码,还能通过修改和重打包方式进行盗版、植入广告甚至植入木马病毒等危险行为。

ARM VMP技术保护的对象是so库中编译成ARM汇编码的C++函数指令,该技术的基本思想是将so文件中ARM汇编的指令码转换成自定义的虚拟指令。ARM VMP保护技术的核心是虚拟指令集与虚拟指令解释器。

指令虚拟化通过重构寄存器和指令重新模拟CPU原生指令形成虚拟指令集,依靠解释器解释成原生指令来执行,解释器仅处理当前取到的指令。另外,经过前面的Java转C++代码的操作后,方法执行的逻辑可读性已经大幅度降低了,因此逆向人员通过代码方式了解应用逻辑,不仅需要分析虚拟机的指令流程,构建虚拟化指令到原生指令的映射,还需要反编译成可读性差的伪C代码,使逆向的难度进一步提高。

ARM指令虚拟化工作流程采用Capstone反编译so文件,将二进制指令码转化成ARM架构的汇编指令,选取需要保护的指令块转换成自定义的虚拟指令集中的对应字节码。将虚拟指令集与解释器打包进so文件中,原来的位置替换成stub函数指令,用来执行进入虚拟机前的相关上下文处理,再转入虚拟机环境。本文ARM VMP保护的函数是经过前面转化为C++函数的Java重要方法。同时,由于ARM VMP的处理对象主要是C++函数,因此也可以指定原生开发的Native层的重点函数进行保护。

虚拟指令的指令码与原生指令的指令码之间是一一对应关系,以保证两者之间的功能等同。而虚拟指令码除了具有联系虚拟指令和原生指令的功能,还负责隐藏虚拟指令,为了避免逆向人员通过直接阅读指令了解软件功能,虚拟指令的指令码可以采用随机生成的方式,只需要保证一个虚拟指令对应一个原生指令即可。如使用随机生成的矩阵计算原生指令码对应的虚拟指令码,然后解释器通过逆矩阵计算方式还原指令码,这种方式的优点是每一次加固所产生的虚拟指令不同,逆向人员通过分析一个应用建立的映射表无法直接用于其他应用。

虚拟指令在虚拟机中的运行也需要使用寄存器,虚拟机对应ARM寄存器定义了虚拟寄存器,包括通用寄存器VMR0-VMR12、栈帧寄存器VMFP、栈指针寄存器VMSP、ARM指令同步PC寄存器VMPC1、虚拟指令同步寄存器VMPC等。为了进一步增强防护效果,虚拟寄存器与ARM寄存器之间的映射关系可以被打乱,通过转换函数创建随机映射关系。

当运行到stub函数时,说明后面的逻辑需要进入虚拟机中执行虚拟指令。stub函数负责完成进入虚拟机前的必要工作,包括保存上下文环境。虚拟执行系统执行完最后一条虚拟指令后,上下文环境应该与未经过虚拟化代码保护的系统执行至此的上下文环境一致。只有在执行完最后一条虚拟指令后,将保存在虚拟执行环境中的上下文信息还原到原生执行环境中,才能保证程序正常执行。一般情况下,上下文环境同步保存到虚拟机对应的虚拟寄存器。

保存上下文环境后,重新分配运行的堆栈,设置进入虚拟环境的函数参数,正式进入虚拟机。虚拟机的执行模型是基于Handler表的switch-case结构,虚拟指令可以作为Label,利用switch语句转发给对应case语句的Handler函数翻译执行。

资源下载: