当前位置: 首页 > 专利查询>北京大学专利>正文

一种Android加固应用程序通用自动化脱壳方法和装置制造方法及图纸

技术编号:20118581 阅读:22 留言:0更新日期:2019-01-16 12:12
本发明专利技术公开一种Android加固应用程序通用自动化脱壳方法和装置。本方法为:1)为每一加载的加固应用创建一虚拟机;虚拟机中的Dex文件定位单元持续化监测加载的加固应用,当监测到加载新的Dex文件时,Dex文件定位单元记录DexOrJar结构并发送给类加载器验证单元;2)类加载器验证单元对每一项Dex文件匹配查找相应的类加载器ClassLoader,并形成关联记录;3)根据关联记录模拟系统类加载和数据解析过程,获取对应Dex文件的解密后的数据内容;4)根据Dex文件标准规范创建Dex文件模板,将解密后的数据内容填充至对应Dex文件模板中,得到加固应用脱壳后包含解密数据的Dex文件。

A General Automatic Shelling Method and Device for Android Reinforcement Applications

The invention discloses a general automatic shelling method and device for Android strengthening application program. This method is as follows: 1) Create a virtual machine for each loaded reinforcement application; Dex file location unit in virtual machine continuously monitors the loaded reinforcement application. When the new Dex file is loaded, Dex file location unit records DexOrJar structure and sends it to class loader verification unit; 2) ClassLox file matching unit of class loader finds the corresponding class loader ClassLo Lo for each Dex file. Adr, and form association records; 3) Simulate the loading and parsing process of system classes according to Association records to obtain the decrypted data content of corresponding Dex files; 4) Create Dex file template according to Dex file standard specification, fill the decrypted data content into the corresponding Dex file template, and get the Dex file containing decrypted data after the application is shelled.

【技术实现步骤摘要】
一种Android加固应用程序通用自动化脱壳方法和装置
本专利技术涉及一种Android加固应用程序通用自动化脱壳方法和装置,属于计算机应用安全

技术介绍
目前Android操作系统已经成为全球市场上所占份额最高的移动终端系统,基于Android操作系统的应用程序数量也逐年增多。由于Android平台的开放性,应用程序能够较容易的被逆向分析、修改破解、重新打包。针对Android应用程序的攻击行为层出不穷,攻击者利用程序中因设计疏忽或逻辑错误产生的漏洞,攻击运行Android系统的智能设备,对用户的隐私和安全产生了极大的威胁。为了防止软件被恶意攻击利用,许多开发者采取了应用加固的方式,对程序关键代码进行混淆、加密、隐藏,极大的增加了逆向分析的难度,从而达到对程序进行保护的效果。应用加固逐渐成为增加应用分析破解门槛,保障应用不被恶意篡改的重要手段。与此同时,以Android平台为目标的恶意软件也利用了加固技术的特性,用于躲避杀毒引擎的检测和安全研究人员的分析。从安全研究的角度而言,对加固应用脱壳,还原出程序代码,能够辅助静态分析工具对程序进行更加深入的分析,有利于增强对恶意行为的检测。在早期的加固方案中,Dex文件被整体加密,并存放于Android应用程序APK文件之中。在程序运行时,壳代码首先将Dex文件进行解密,然后回写至文件系统,并最终利用系统的类加载器ClassLoader进行加载执行。虽然可以在Dex文件被加载后,将其从文件系统删除,但仍然不能防止脱壳进程拦截对应函数,并获得完整Dex文件。随后的加固技术对Dex文件的加载过程进行了改进,将Dex文件解密至内存后,直接调用Dalvik虚拟机内部接口,完成代码的动态加载。但在这一过程中,内存中将出现完整的原始Dex文件,因此可以通过直接搜索内存、Hook关键系统函数等方式,对程序进行脱壳。为了防止解密后的Dex文件被整体转储,加固技术进而从两个主要方面对内存中的Dex文件进行防护。其一是减少用于定位Dex文件位置的内存特征,删除冗余结构信息,破坏原有文件结构;其二是破坏Dex文件的内存连续性。经常使用的手段有,清除内存中的Dex文件头标志,用于对抗暴力内存搜索;分离映射Dex文件,达到内存中的不连续效果;增加了一些错误的数据,提高恢复成本;将java方法native化,并利用JNI机制重新还原字节码等等。综上所述,当前加固技术使得对恶意软件的检测和分析面临诸多困难,其核心问题在于加固技术为隐藏了恶意软件中原有的代码逻辑,极大提高了逆向和分析的门槛。
技术实现思路
针对现有技术中存在的技术问题,本专利技术的目的在于提供一种Android加固应用程序通用自动化脱壳方法和装置,对于进行加固处理后的Android应用程序,可以在不具备专业逆向分析知识的前提下,完成自动化的对加固程序进行脱壳,还原出程序原有逻辑代码。Android系统通过为每一个应用程序创建对应的虚拟机来执行应用程序中的代码逻辑,本专利技术通过对Android系统的虚拟机源代码进行修改,具备一定的通用性,可以处理采取不同加固方式的应用,同时也规避了加固应用采取反调试等手段阻止对程序进行脱壳的问题,从而达到通用自动化脱壳的效果。为了实现上述目的,本专利技术采用以下技术方案:一种Android加固应用程序通用自动化脱壳方法,包括:1)Dex文件定位单元在加固应用被系统加载至内存且尚未执行任何加固应用所包含代码的时刻完成初始化操作,用于在后续加固应用运行过程中进行持续化监测。当出现新的Dex文件加载时(即Dex文件定位单元监测到虚拟机加载新的Dex文件时),Dex文件定位单元将记录虚拟机内部用于表示内存中Dex文件信息的DexOrJar结构,并发送给类加载器验证单元;其中,DexOrJar是虚拟机内部用于表示内存中Dex文件信息的一个结构体,每一DexOrJar对应一个Dex文件信息。2)由类加载器验证单元对监测到的每一项Dex文件匹配相应的类加载器ClassLoader,并形成关联记录。即对于每一Dex文件a,如果能够匹配查询到Dex文件a的类加载器ClassLoader,则形成Dex文件a与匹配类加载器ClassLoader的关联记录,如果未找到匹配的类加载器ClassLoader,则不形成关联记录。3)根据上述关联记录,模拟系统类加载和数据解析过程,遍历并获取Dex文件不同组成部分所在内存中的内容,此时获取到的内容为Dex文件的解密后数据内容。4)根据Dex文件标准规范,创建脱壳后Dex文件模板,完全重构Dex文件,将对应解密部分填充至Dex文件模板中,即得到脱壳后包含完整解密数据的Dex文件。进一步,步骤1)具体包括:1-1)在虚拟机中创建一个新的线程,该线程的作用为周期性地主动轮询Dex文件加载信息。通过虚拟机运行过程中的全局变量gDvm,可以访问DvmGlobals结构,并从中获取到有关Dex文件加载的相关信息。gDvm.userDexFiles保存了由自定义类加载器加载的Dex文件集合,通过主动遍历这个集合,可以得到虚拟机内部用于表示内存中Dex文件信息的DexOrJar结构,用这种方法得到的集合记为Pm。由于每一个DexOrJar对应了一个Dex文件,所以此时,获得DexOrJar的集合Pm,即等价于获得了已加载Dex文件集合。1-2)被动监测Dex文件加载事件。在执行Dex文件中的代码前,系统需要完成Dex文件加载、类加载以及类初始化等操作。动态钩取在这个过程中的关键系统函数,即可获得Dex文件的加载信息。具体而言,将选取dvmRawDexFileOpen和defineClassNative函数,记录函数被调用时的参数信息。以defineClassNative为例,该函数一共接收4个参数,name:待加载类的名称;loader:加载该类使用的classloader;cookie:待加载类所在的dex文件;suppressed:处理加载过程中产生的异常。此时,cookie参数的值恰为指向DexOrJar结构的指针。用这种方法得到的集合记为Pn。1-3)在加固程序启动至当前时刻,由加固程序本身已加载至内存中Dex文件的总集合Pa=Pm∪Pn,将被发送至类加载器验证单元。进一步,步骤2)具体包括:2-1)从gDvm.loadedClasses获取虚拟机中所有已经加载类的信息,每一个类都对应一个ClassObject结构,而ClassObject中的pDvmDex成员,表明了当前类所对应的Dex文件,classLoader成员保存了加载此类的类加载器的值。故pDvmDex与classLoader形成对应关系。2-2)对于Pa中的每一项DexOrJar,先取得其成员DvmDex的值,若所有ClassObject的pDvmDex成员均没有指向上述DvmDex,则说明当前Dex文件中并没有任何类被加载;反之,则获取正确的classLoader值。进一步,步骤3)具体包括:3-1)根据Dex文件与ClassLoader的关联记录,使用ClassLoader加载对应Dex文件中所有的类,使得该Dex文件中的类被加载至内容中;3-2)根据关联记录中,代表了Dex文件在内存中表达的DexOrJa本文档来自技高网
...

【技术保护点】
1.一种Android加固应用程序通用自动化脱壳方法,其步骤包括:1)为每一加载的加固应用创建一虚拟机;虚拟机中的Dex文件定位单元持续化监测加载的加固应用,当监测到虚拟机加载新的Dex文件时,Dex文件定位单元记录虚拟机内部用于表示内存中Dex文件信息的DexOrJar结构,并发送给类加载器验证单元;2)类加载器验证单元对每一项Dex文件匹配查找相应的类加载器ClassLoader,并形成关联记录;3)根据所述关联记录,模拟系统类加载和数据解析过程,获取对应Dex文件的解密后的数据内容;4)根据Dex文件标准规范创建Dex文件模板,将解密后的数据内容填充至对应Dex文件模板中,得到加固应用脱壳后包含解密数据的Dex文件。

【技术特征摘要】
1.一种Android加固应用程序通用自动化脱壳方法,其步骤包括:1)为每一加载的加固应用创建一虚拟机;虚拟机中的Dex文件定位单元持续化监测加载的加固应用,当监测到虚拟机加载新的Dex文件时,Dex文件定位单元记录虚拟机内部用于表示内存中Dex文件信息的DexOrJar结构,并发送给类加载器验证单元;2)类加载器验证单元对每一项Dex文件匹配查找相应的类加载器ClassLoader,并形成关联记录;3)根据所述关联记录,模拟系统类加载和数据解析过程,获取对应Dex文件的解密后的数据内容;4)根据Dex文件标准规范创建Dex文件模板,将解密后的数据内容填充至对应Dex文件模板中,得到加固应用脱壳后包含解密数据的Dex文件。2.如权利要求1所述的方法,其特征在于,形成所述关联记录的方法为:首先获取虚拟机中所有已加载类的信息,每一个类对应一个ClassObject结构,其中ClassObject结构中的pDvmDex成员代表当前类所对应的Dex文件,ClassObject结构中的classLoader成员保存了加载此类的类加载器的值,ClassObject结构中pDvmDex与classLoader具有对应关系;然后对于每一项Dex文件对应的DexOrJar结构,先取得其成员DvmDex的值,若所有ClassObject结构中的pDvmDex成员均没有指向该DvmDex,则说明当前Dex文件中并没有任何类被加载;反之,则获取classLoader值并与对应的Dex文件形成关联记录。3.如权利要求1或2所述的方法,其特征在于,获取对应Dex文件的解密后的数据内容的方法为:首先根据Dex文件与类加载器ClassLoader的关联记录,使用类加载器ClassLoader加载对应Dex文件中所有的类;然后根据关联记录中,代表了该Dex文件对应的DexOrJar结构,解析该Dex文件不同组成部分中的内容,若获取到的内容是指向其它内存区域的指针,则进行递归获取,若获取到的内容是数据,则将其复制保存至临时的内存空间中,最终得到该Dex文件的解密后的数据内容。4.如权利要求1所述的方法,其特征在于,所述Dex文件模板包含的结构有Dex文件头、数据索引结构区、数据区和静态链接数据区。5.如权利要求1所述的方法,其特征在于,将解密后的数据内容填充至对应Dex文件模板中,得到加固应用脱壳后包含解密数据的Dex文件的方法为:将获取的解密后的数据内容按照Dex文件标准规范依次填充至对应的Dex文件模板;判断填充数据的有效性,若填充数据无效,则判断填充数据的冗余性,若填充数据是冗余的,则自动计算该填充数据的内容,否则清空Dex文件中该填充数据对应的结构。6.一种Android加固应用程序通用自动化脱壳装置,其特...

【专利技术属性】
技术研发人员:韩心慧简容黎桐辛武新逢
申请(专利权)人:北京大学
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1