一种安卓加固插件的逆向处理方法与流程

文档序号:12467768阅读:877来源:国知局
一种安卓加固插件的逆向处理方法与流程

本发明属于移动安全技术领域,更具体地,涉及一种安卓加固插件的逆向处理方法。



背景技术:

作为移动互联网时代计算的主要载体,移动智能终端存储着更多的隐私数据,包括联系人信息、通话记录和地理位置信息等,更易产生安全问题,用户隐私数据泄漏可能带来灾难性的后果。

安卓(Android)应用基于Java语言开发,容易被恶意攻击者逆向,导致开发者辛苦开发的应用被恶意攻击者获取;有的恶意攻击者还会把逆向后的应用源代码植入恶意代码,导致重打包恶意应用盛行。安全厂商为了解决此类问题,提供了Android应用加固服务。然而,由于安全厂商通常没有对上传应用进行安全扫描,导致很多恶意攻击者将恶意应用进行加固,以逃避安全引擎的查杀。目前恶意攻击者采用更先进的技术是使用动态加载技术,延迟启动恶意代码,开启定时器,反射执行恶意代码。

为解决Android应用程序加固和动态加载技术所存在的安全问题,国内外的研究人员已经进行了一些探索与研究。DexHunter(Zhang Y,Luo X,Yin H.Dexhunter:Toward extracting hidden code from packed android applications.in:Proceedings of 20thEuropean Symposium on Research in Computer Security.Vienna:Springer,2015.293-311.)从目前主流的加固服务商入手,提出了针对目前加固服务商的逆向处理方法,在应用加载进内存后,获取可执行文件在内存中的位置,遍历可执行文件中所有的Java类,对其进行主动的加载和初始化,再获取内存中的信息,此时得到的就是应用真实的指令,但该方法没有解决动态加载插件逆向问题。Poeplau S(Poeplau S,Fratantonio Y,Bianchi A,et al.Execute This!Analyzing Unsafe and Malicious Dynamic Code Loading in Android Applications.in:21st Annual Network and Distributed System Security Symposium.San Diego:ISOC,2014.34-46)系统性的分析了动态加载代码带来的安全性问题,采用静态分析工具自动发现动态加载的代码;对于良性应用可能被恶意攻击者利用漏洞加载恶意插件的问题,通过修改Android系统Framework层来动态加载代码的完整性校验;但该方法缺少实用性和完整性;综上所述,目前的方法主要是针对Android应用进行逆向,或者是对动态加载存在的安全问题提出解决方案;从实施的角度来看,已有的解决方案只是获取应用安装后优化后的odex文件,对于加固的插件则无法获取其源代码。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种安卓加固插件的逆向处理方法,其目的在于识别出未知恶意应用使用的加固方案,在触发插件安装时即可获取到插件,并对其进行逆向,以对插件进行源代码分析。

为实现上述目的,按照本发明的一个方面,提供了一种安卓加固插件的逆向处理方法,通过修改安卓系统虚拟机类加载机制和初始化方法,在加固插件加载其第一个Java类之前将所述加固插件中所有的Java类主动的遍历并加载进内存中,初始化所有的Java类,将内存中所有的关于所述加固插件的信息收集起来组装成新的odex文件,得到逆向后的插件原始代码信息。

优选地,采用上述方法对未知插件进行逆向处理的方法,具体包括如下步骤:

(1)通过应用加固服务平台对所述未知插件进行加固;并对加固插件进行图谱化处理,确定应用加固服务平台对插件的加固优化参数;

(2)修改安卓系统源码,在模拟器上监控获取加固插件的动态加载路径;

(3)根据安卓系统中虚拟机类加载的关键路径,修改虚拟机初始化过程,在类初始化阶段对加固插件进行逆向,生成逆向后的odex文件,并改变虚拟机控制变量的值;

(4)触发插件下载,在插件执行过程中根据虚拟机控制变量的值识别插件中所有的Java类在内存中的位置;

遍历逆向后的odex文件中的Java类,主动进行类加载和初始化,根据内存中存储的逆向后的信息生成新的odex文件;

(5)利用开源的工具对所述新的odex文件进行反编译,获得测试用加固插件的smail代码;可通过将所述smail代码与其源代码进行比较,获知恶意攻击信息。

优选地,上述安卓加固插件的逆向处理方法,其步骤(2)包括如下子步骤:

(2.1)根据开源的动态加载框架源代码,找出动态加载odex文件的调用接口;

(2.2)修改调用接口,在模拟器上通过日志监控获取加固插件的动态加载的路径。

优选地,上述安卓加固插件的逆向处理方法,其步骤(3)包括如下子步骤:

(3.1)根据安卓系统虚拟机执行Java类的过程,跟踪类加载和初始化的函数调用过程,获取初始化的关键函数;

(3.2)遍历所有的Java类,根据关键函数对所有的Java类进行初始化;

(3.3)在Java类初始化阶段对测试用加固插件进行逆向,生成逆向后的odex文件,并改变虚拟机控制变量的值。

优选地,上述安卓加固插件的逆向处理方法,其步骤(4)包括如下子步骤:

(4.1)触发加固插件的下载,加固插件首次执行时触发控制变量的改变;

(4.2)根据控制变量的值识别出加固插件中所有的Java类在内存中的位置,并将逆向后的odex文件路径传递到逆向模块;

(4.3)逆向模块对逆向后的odex文件中所有的Java类进行遍历,主动进行类加载和初始化,并将逆向后的信息存储到内存;

(4.4)根据在内存中收集到的逆向后的信息生成新的odex文件。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:

(1)本发明提供的安卓加固插件的逆向处理方法,通过对安卓系统的虚拟机进行修改,将逐个类进行加载的过程改为对应用中所有的类一次性的进行类加载和初始化,将所有的类解密并加载到内存中,收集内存中所有的类信息,将所有逆向后的类进行重新组合生成新的odex文件;

由于在类初始化过程中会修改Java类在内存中的指令,在收集内存中的信息时会进行修正,因此可以获取到大部分的加固插件源代码,并且自动化程度较高,以较小的性能开销为代价实现了针对安卓加固插件的逆向;

(2)本发明提供的安卓加固插件的逆向处理方法,在应用的类加载处插入逆向代码,在安卓系统虚拟机中找到Java类加载的关键函数,在关键函数中对所有的Java类进行遍历,再初始化,在隐私数据相关的特定应用程序编程接口处开始整体流程,使得本发明所增加的流程只影响到整体系统所有流程中较小的一部分,不影响与隐私数据无关的模块性能。

附图说明

图1是本发明的整体架构图;

图2为本发明实施例提供的安卓加固插件的逆向处理方法的流程示意图;

图3为本发明实施例步骤1的流程示意图;

图4为本发明实施例步骤2的流程示意图;

图5为本发明实施例步骤3的流程示意图;

图6为本发明实施例步骤4的流程示意图;

图7为本发明实施例步骤5的流程示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

以下首先就本发明所涉及的技术术语进行解释和说明:

Android:由Google主导开发的基于Linux内核的移动操作系统;

虚拟机:具体指Dalvik虚拟机;

Android应用:运行在Android系统中的应用程序,主要由Java语言开发;

宿主程序:Android应用程序的主体部分,即隶属于开发者的代码部分,主要包括应用程序的核心功能模块;

Android插件:实质上也是Android应用程序,Android插件在应用运行时作为应用的一个功能模块加载到宿主应用中;

Android加固:类似于数据加密,将Android应用程序的原始代码进行保护,在运行时解密;

隐私数据:用户存储在系统中的个人数据,在移动设备中主要包括联系人信息、通话记录、地理位置信息和设备相关信息等;

恶意插件:获取用户隐私数据或者破坏设备正常运行等行为的插件;

动态加载:在应用运行时动态的载入插件,将插件作为一个小部分嵌入到运行的应用中。

以下结合具体实施例和附图对本发明所提供的安卓加固插件的逆向处理方法做进一步说明。

本发明提供的安卓加固插件逆向方案,其目的是截获动态加载的插件,并对其自动化的进行逆向,提高逆向的效率,并且尽可能全面的获取加固应用的原始代码;修改底层虚拟机类加载机制和初始化方法,在加固应用加载第一个Java类之前将应用中所有的Java类主动的遍历,并加载进内存中,初始化所有的Java类,将内存中所有的关于此应用的信息收集起来,重新组装成新的odex文件,此odex文件就是逆向后的应用原始代码信息,通过开源工具将其还原成加固应用之前的原代码Java类信息。

图1所示,是本发明提供的Android加固插件逆向方法的整体架构,其中Dalvik虚拟机部分表示经过修改的系统模块;该方法的工作主要集中在以下两个部分:对加固的恶意应用进行图谱化,得到加固后的特征,确定未知应用加固的方式;修改Dalvik虚拟机类加载方法,遍历应用中所有的类,并加载到内存中,初始化所有的类,将逆向模块和插件加载机制结合,设置控制变量,收集内存中所有的代码信息,重新组装成新的odex文件。

图2是实施例提供的安卓加固插件逆向方法的流程示意图,具体包括以下步骤:

(1)上传测试应用(已知源代码)到各个应用加固服务商进行加固,下载加固后的应用,进行图谱化处理,得到各个应用加固服务商加固后的特征;

(2)修改Android系统源码,获取插件动态加载的关键路径;

(3)分析Android应用执行过程,修改Android系统虚拟机,在类初始化阶段对加固应用或者插件进行逆向,生成新的odex文件,并改变控制变量的值;

(4)触发加固恶意插件的下载,插件也会经系统虚拟机进行加载,根据控制变量的值,会得到插件在内存中的位置,然后对插件进行逆向;

(5)逆向成功后会在应用安装目录下生成新的odex文件,利用开源的工具对odex文件进行逆向,得到原始应用的smail代码。

实施例中,步骤(1)的流程如图3所示,包括如下子步骤:

(1.1)开发一个Android应用;实施例中,以一个新闻客户端APP为例;

(1.2)将新闻客户端APP进行签名,将此APP作为测试插件;

(1.3)将测试插件上传到腾讯乐加固平台进行加固;

(1.4)下载加固插件并解压,得到可执行文件class.dex,对其进行图谱化,得到腾讯乐加固平台的加固特征;通过上述步骤,可建立各加固平台的图谱库,以存储各加固平台的加固特征;

实施例中,步骤(2)的流程如图4所示,包括如下子步骤:

(2.1)分析目前开源的动态加载框架源代码,找出动态加载dex文件或者jar文件的调用接口;

(2.2)跟踪开发者调用的调用接口,获取插件动态加载的关键路径,定位插件在系统底层加载后存储的位置。

实施例中,步骤(3)的流程如图5所示,包括如下子步骤:

(3.1)根据Android系统中Dalvik虚拟机解释执行Java类的过程,找到逆向加固应用的方法;

(3.2)在打开dex文件、加载class文件、初始化class、调用具体插件时主动遍历开发者自定义的所有的Java类;

(3.3)收集对插件中所有的Java类在内存中的信息,重新组织成新的dex文件;

(3.4)改变控制变量的值。

实施例中,步骤(4)的流程如图6所示,包括如下子步骤:

(4.1)当插件安装后,首次执行时会触发控制变量的改变;

(4.2)当触发插件下载后,修改的虚拟机会根据控制变量的值识别出加固插件中所有的Java类在内存中的位置,并将逆向后的odex文件路径传递到逆向模块

(4.3)逆向模块将改odex中所有的Java类进行遍历,主动的进行类加载和初始化,此时内存中存储的是逆向后的信息;

(4.4)收集逆向后的信息重新组织成新的odex文件。

实施例中,步骤(5)的流程如图7所示,包括如下子步骤:

(5.1)将加固插件解压,得到可执行文件class.dex文件,拷贝到SDK下的tools目录下;

(5.2)下载baksmali-2.0.0.jar和jd-gui.exe程序,将baksmali-2.0.2.jar放到SDK下的tools目录下;

(5.3)进入到SDK下的tools目录,输入java–jar baksmail-2.0.0.jar–o classout/class.dex,在classout目录下生成class.dex的smali代码;

(5.4)对逆向后生成的插件plugin.dex也进行同样的处理,对生成的smali代码和源代码进行比较,确定恶意代码信息。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1