APP下载

基于指令虚拟化技术的移动应用加固技术研究

2018-05-30国网河南省商丘市供电公司吴建辉杨素梅

电子世界 2018年9期
关键词:指令集服务器端应用程序

国网河南省商丘市供电公司 吴建辉 杨素梅 刘 伟 匡 琮

南京德软信息科技发展有限公司 王 鹏

1 前言

为了避免移动应用中用户账号和密码被窃取、交易数据被破解以及篡改、预防钓鱼欺诈的攻击、以及捆绑流氓、恶意的应用和游戏被外挂摧毁等情况出现,越来越多的开发者不得不投入更多的时间和精力来考虑通信安全、代码层面安全等方面的问题[1]。但在移动应用平台上,攻和防是具有不对等性的,防御者往往没有攻击者的权限等级高。

随着现代技术的不断发展,有关移动应用中的逆向分析也变得越发容易,因此有很多网络安全公司生产了许多加壳服务,虽说在增添加壳措施之后,在对抗静态分析方面取得了不错的效果,但在应用运行后会使源码暴露在内存中,从而让攻击者能够轻易的获取窗口期dump内存,并且在进行一些必要的修复措施,就能在IDA里面进行阅读分析。将移动应用中的代码虚拟化后,就可以有效的防止上述情况的发生,即使被dump,IDA也不能获取被虚拟化加固的代码,因为程序运行时并不会将虚拟指令集还原为原生指令集。下面我们主要通过有关移动应用虚拟化加固的框架以及功能、虚拟化加固指令的实现这两个方面进行重点分析。

2 移动应用虚拟化加固框架和功能

移动虚拟化框架是由服务器端和移动端两部分组成的,在功能上也可以大致化为分级存储管理、移动应用的RunTime以及离线的静态模块分析三大部分。

图2.1 移动应用虚拟化框架设计

分级存储管理(也称为数据的迁移)主要是描述服务器端与移动设备端之间的数据转移过程以及有限网络、WiFi等媒介的传输。当移动设备端的应用适用于迁移,或者当迁移到服务器端的函数执行结束需要返回时时,由该部分负责两者之间的数据传输以及附带的数据校验、安全等功能。

移动应用的RunTime有移动端和服务端的dalvik虚拟机两部分组成。当应用程序在移动设备中被成功安装后,就拥有了执行的前提条件,从使用者操作移动终端设备执行某个程序开始,我们所用到的上述整个框架如图2.1就开始发挥功效了:首先,当移动应用启动时,移动系统就会自动加载已经分析好的离线文件存入内存中,把它作为一个输入用于动态分析;而后,当应用程序开始运行时,首先判断该程序是否属于首次运行,如果属于就开始执行训练,若不是就开始执行迁移操作,移动到服务端即可;最后,如果是进行训练执行操作的话,就得依据由动态分析所得出的阈值设置参数和程序运行时间来设定迁移操作的标志位,以供后续移动应用程序的多次使用。最终实现移动使用者的应用程序毫不保留的迁移到云端去进行运行,已加速运行的效率。

离线的静态分析主要的工作是对移动程序的apk文件进行的逆向编译解析,首先,要获取该移动应用的一个相关的关系调用图,其次,依据该关系调用图用以区别与硬件相关与否的应用程序,并且把不相关的那部分程序所对应的消息保存到partition文件中,从而可以依据该文件的相应记录,判定出哪部分应用程序中的哪些函数在移动终端运行,哪些应用函数有可能转移到服务器端运行。

3 移动应用的虚拟化加固指令的实现

基于上述的理论介绍,我们可以清晰的发现有两个方面是必须的也是最为关键的,一个方面是虚拟指令集,另一个方面是虚拟机,对于虚拟指令集,我们可以暂时将一些带有opcode的指令集进行变形,生成相关数据直接回填到原文件中,已达到静态分析的目的。

根据指令集的相关资料介绍,我们可以知道每一条指令主要由两部分组成并决定的:一是指令的格式标识,二是位描述;以指令B|A|op|CCCC G|F|E|D为例,其中各项所代表的意思如下:字母B代表参数的个数,字母C代表偏移位值,也就是方法的索引值,而字母A、D、E、F、G等则代表寄存器的一些参数,op为操作码,代表运行的是哪一种操作。当使用者的移动应用运行后,程序会根据指令所代表的具体数据经过跳转表的方式去进行解析操作。

为了使移动设备中的应用程序毫无错误的移植到云端,即当应用函数运行时,函数能自主初始化一些相关有用的数据结构,已获取其运行环境等因素,就需要增添一些对应的指令码来实现,用以满足我们依据迁移情况操作的每一个移动应用程序,通过添加一条新的dalvik指令码,通过迁移函数来运行我们所期望的操作,进而顺利的完成相应的准备工作[2]。具体的实现步骤如下:

1)在文件/dalvik/opcode-gen/bytecode.txt目录下,改写指令码中没有用到的操作码43,把它作为虚拟化加固指令的操作码。图3-1显示其含义。

图3-1 Dalvik虚拟机操作码定义

2)在文件/dalvik/opcode-gen目录下,运行regen-all脚本文件,则会更新/dalvik/dx/src/com/Android/dx/dex/code目录下的Dops.java、RopToDop.java文件,/dalvik/dx/src/com/Android/dx/io目录下OpcodeInfo.java、Opcodes.java文件,/dalvik/libdex目录下的DexOpcodes.cpp、DexOpcodes.h、InstrUtils.cpp文件,/libcore/dalvik/src/main/java/dalvik/bytecode目录下的OpcodeInfo.java,Opcodes.java文件,在上述这些目录文件中,会自动生成很多与新添加指令相关的定义、说明和表等。

3)在文件/dalvik/vm/mterp/c目录下,改写OP_UNUSED_43.cpp为OP_VIR.cpp,即为虚拟化加固指令的具体实现方法,该指令的运行流程大致为:首先是各种变量的初始化、迁移进程的新建等操作;而后在hash table中,运用相应的结构体,从函数中得到相应的指令字节码;之后,挂载起客户的进程,调用相关的应用函数获取其上下文的有关数据,在经过线程迁移发送出去;紧接着迁移线程通过服务器端回执过来的结果在移动端复原,接着做其他的一些事情,若失败,则继续在移动终端执行。

OP_VIR.cpp内容的大致实现方法如下:

重新构造解释器的函数代码,以解析新增的指令。详细的操作步骤在文件/dalvik/vm/mterp目录下,改写config-portable文件中的op-end和op-start中的部分片段,添加相应的虚拟化加固指令OP-VIR文件的引用就可以。

4 结语

本文通过对虚拟化技术在移动应用虚拟化加固方面的研究,提出了在移动应用平台上经过增添新的指令来实现虚拟化的方法,该方法可以很好的起到程序加固的作用,有效的防止了内存中程序代码外露的可能性,并且对后续的静动态的解析也有着比较好的抵御效果。

[1]刘仙艳.移动终端开放平台--Android[J].信息通信技术,2011,4:40-50.

猜你喜欢

指令集服务器端应用程序
3DNow指令集被Linux淘汰
Linux环境下基于Socket的数据传输软件设计
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
浅析异步通信层的架构在ASP.NET 程序中的应用
基于Qt的安全即时通讯软件服务器端设计
实时微测量系统指令集及解析算法
什么是AMD64
基于覆盖率驱动的高性能DSP指令集验证方法
网页防篡改中分布式文件同步复制系统