CN108229148A - 一种基于Android虚拟机的沙箱脱壳方法及系统 - Google Patents
一种基于Android虚拟机的沙箱脱壳方法及系统 Download PDFInfo
- Publication number
- CN108229148A CN108229148A CN201611191775.7A CN201611191775A CN108229148A CN 108229148 A CN108229148 A CN 108229148A CN 201611191775 A CN201611191775 A CN 201611191775A CN 108229148 A CN108229148 A CN 108229148A
- Authority
- CN
- China
- Prior art keywords
- intended application
- class
- android
- packet
- classloader
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于Android虚拟机的沙箱脱壳方法及系统,该方法包括以下步骤:启动Android虚拟机,将系统的类加载器替换为预定义类加载器,加载用于沙箱脱壳的自定义Android虚拟机代码包,得到可执行Android脱壳代码的运行环境;在虚拟机中读取待脱壳的目标应用的包名和主Acitivity名,并根据包名和主Acitivity名构建目标应用的上下文环境和资源访问接口;构架目标应用的资源访问接口,模拟目标应用的正常执行流程,将与目标应用匹配的上下文环境传递进目标应用的启动参数中,在沙箱中对目标应用进行程序代码解密,得到目标应用的程序代码。本发明执行环境不需要提供最高访问权限,保证了用户的设备环境安全性;且使用简单,执行效率较高。
Description
技术领域
本发明涉及信息安全技术领域,尤其涉及一种基于Android虚拟机的沙箱脱壳方法及系统。
背景技术
Android设备发展迅速,从手机扩展到平板、智能电视等等,设备上相应的风险类、恶意类应用也越来越多。一般的恶意检测方式大多基于特征检测,对于加固的样本的恶意行为基本无效。所以,急需一种方案能在用户场景提供快速的检测功能。
一般的在用户端的脱壳技术需要用到hook(钩子)技术,并且涉及到系统root(获取最高权限),这相当于给移动端系统打开了一扇大门,造成了安全隐患。系统root,是基于类似linux的账户权限机制,root账户拥有最高权限,能够修改几乎所有文件。Android是基于linux的,所以同样可以获取root权限。在Android系统中,利用hook技术,能够读取其他程序的内存,从而获取内存中其他程序的可执行代码。这就是利用Hook脱壳的技术。同时,其他恶意程序也可以获取root权限,导致系统被而已篡改,或者手机中的敏感信息被窃取,发生安全隐患。其次,hook技术是利用替换系统层关键函数达到获取内存的目标,处理不得当可能导致系统崩溃。因此,急需一种无需较高权限也能给程序脱壳从而检测恶意程序的方法。
发明内容
本发明要解决的技术问题在于针对现有技术中的脱壳技术需要获取系统的最高权限的缺陷,提供一种基于Android虚拟机的沙箱脱壳方法及系统。
本发明解决其技术问题所采用的技术方案是:
本发明提供一种基于Android虚拟机的沙箱脱壳方法,包括以下步骤:
启动Android虚拟机,将系统的类加载器替换为预定义类加载器,加载用于沙箱脱壳的自定义Android虚拟机代码包,得到可执行Android脱壳代码的运行环境,其中,所述自定义Android虚拟机代码包用于为应用程序执行提供接口,并为脱壳流程提供入口;
在虚拟机中读取待脱壳的目标应用的包名和主Acitivity名,并根据包名和主Acitivity名构建目标应用的上下文环境和资源访问接口;
构架目标应用的资源访问接口,模拟目标应用的正常执行流程,将与目标应用匹配的上下文环境传递进目标应用的启动参数中,在沙箱中对目标应用进行程序代码解密,得到目标应用的程序代码。
进一步地,本发明的启动Android虚拟机时还包括构建应用执行所需的基本接口的方法,该方法包括以下步骤:
创建虚拟机对象,在内存结构中初始化用于查找类的缓存;
在虚拟机中创建用于构建基本接口的基础类;
加载Android系统框架层代码包,根据基础类构建Android应用执行时能够直接调用的基本接口。
进一步地,将系统的类加载器替换为预定义类加载器的方法为:
Android虚拟机启动时指定系统的类加载器的全局变量,判断系统查找类的方式;
若为无类加载器的方式,在全局变量中指定自定义Android虚拟机代码包,并查找类;
若为使用类加载器的方式,构造预定义类加载器并替换系统的类加载器,通过该预定义的类加载器查找自定义Android虚拟机代码包的路径,加载自定义Android虚拟机代码包。
进一步地,本发明的自定义Android虚拟机代码包的实现方法为:
获取自定义Android虚拟机代码包的jar文件,存放到与目标应用同名的DexFile结构体中;
将DexFile结构体存放到全局的ClassPath扩展变量中;
执行查找系统类的流程,从全局变量中通过类名查找系统类;从全局的扩展变量中查找自定义Android虚拟机的类,并将其添加到哈希表中,下次查找该类时直接从哈希表中获取;
若为自定义Android虚拟机未实现的类,从全局变量中的系统类进行替换;若为与系统类同名的类,用自定义Android虚拟机的类替换系统类。
进一步地,本发明的所述模拟的目标应用的程序代码在内存中的存放形式为DexFile结构体,包括dex文件内存映射指针,dex文件各区域地址指针和区域大小,以及执行时期直接相关的结构体DexClassDef和Method。
进一步地,本发明的在沙箱中对模拟的目标应用进行程序代码解密的方法为:
获取与目标应用同包名的DexFile结构体;
修复内存映射文件的dex文件魔术字段,内存区域地址指针根据连续性偏移大小计算指针位置;
根据模拟的目标应用的类找到DexClassDef结构体,获取真实的类代码,并修复区域大小;
根据模拟的目标应用的类找到Method结构体,修复单个函数的代码区域,并修复区域大小;
根据修复后的代码区域,修复dex文件结构的头部,得到完整的解密的程序代码。
进一步地,本发明的所述的Android虚拟机为dalvik虚拟机。
本发明提供一种基于Android虚拟机的沙箱脱壳系统,包括:
执行控制模块,启动Android虚拟机,通过特殊jar包热补丁技术,加载用于沙箱脱壳的自定义Android虚拟机代码包,实现部分系统接口,得到可执行Android脱壳代码的运行环境;
系统框架模块,在虚拟机中读取待脱壳的目标应用的包名和主Acitivity名,并根据包名和主Acitivity名构建目标应用的上下文环境和资源访问接口;
脱壳模块,构建目标应用的资源访问接口,调用目标应用执行入口,模拟目标应用的正常执行流程,将与目标应用匹配的上下文环境传递进目标应用的启动参数中,在沙箱中对目标应用进行程序代码解密,得到目标应用的程序代码。
本发明产生的有益效果是:本发明的基于Android虚拟机的沙箱脱壳方法及系统,执行环境不需要提供最高访问权限,保证了用户的设备环境安全性;该系统的使用简单,只需要提供目标程序的路径;启动该系统,就能自动输出被脱壳的代码;效率较高,该系统的启动是一个简化的Android系统,并且加载少量的补丁代码,所以整体效率较高。
附图说明
下面将结合附图及实施例对本发明作进一步说明,附图中:
图1是本发明实施例的方法流程图;
图2是本发明实施例的查找类的过程;
图3是本发明实施例的代码替换功能流程图;
图4是本发明实施例的系统框图;
图中,10-执行控制模块,20-系统框架模块,30-脱壳模块。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,本发明实施例的基于Android虚拟机的沙箱脱壳方法,包括以下步骤:
S1、启动Android虚拟机,将系统的类加载器替换为预定义类加载器,加载用于沙箱脱壳的自定义Android虚拟机代码包,得到可执行Android脱壳代码的运行环境,其中,所述自定义Android虚拟机代码包用于为应用程序执行提供接口,并为脱壳流程提供入口;
启动Android虚拟机时还需要构建应用执行所需的基本接口,该方法包括以下步骤:
步骤一、创建虚拟机对象gDvm,启动虚拟机实例,在内存结构中初始化用于查找类的缓存,着重为hashTable,为类查找使用的缓存;
步骤二、创建程序基本接口,着重为Java_lang_Class,为所有类的基础类,在缓存中创建用于构建基本接口的基础类;
步骤三、加载Android系统框架层代码包,着重为framework.jar,根据基础类构建Android应用执行时能够直接调用的基本接口。
Android虚拟机为dalvik虚拟机,dalvik虚拟机执行代码时通过类名,用系统接口Findclass查找类;Findclass是通过ClassLoader的层级关系,以委托代理的形式分级查找;找到类以后,通过函数名调用方法。dalvik虚拟机加载自定义Android虚拟机代码包的方法具体为:
dalvik虚拟机启动时指定系统的bootClassPath,加载应用代码时构造一个Classloader,里面存放来自目标应用的代码路径或者存放DexFile结构用于类查找;系统在启动时到bootclassPath里面去加载dex或者jar文件;此时加载自定义Android虚拟机代码包。
将系统的类加载器替换为预定义类加载器的方法为:
Android虚拟机启动时指定系统的类加载器的全局变量,判断系统查找类的方式;
若为无类加载器的方式,在全局变量中指定自定义Android虚拟机代码包,并查找类;
若为使用类加载器的方式,构造预定义类加载器并替换系统的类加载器,通过该预定义的类加载器查找自定义Android虚拟机代码包的路径,加载自定义Android虚拟机代码包。
自定义Android虚拟机代码包的实现方法为:
包括但不限于实现Acvitity接口提供脱壳功能的调用,实现Context接口提供系统服务的调用等与应用直接相关的API及功能模块。
将DexFile结构体存放到全局的扩展变量中;
执行查找系统类的流程,从全局变量中通过类名查找系统类;从全局的扩展变量中查找自定义Android虚拟机的类,并将其添加到哈希表中,下次查找该类时直接从哈希表中获取;
若为自定义Android虚拟机未实现的类,从全局变量中的系统类进行替换;若为与系统类同名的类,用自定义Android虚拟机的类替换系统类。
S2、在虚拟机中读取待脱壳的目标应用的包名和主Acitivity名,并根据包名和主Acitivity名构建目标应用的上下文环境和资源访问接口;
S3、构架目标应用的资源访问接口,模拟目标应用的正常执行流程,将与目标应用匹配的上下文环境传递进目标应用的启动参数中,在沙箱中对目标应用进行程序代码解密,得到目标应用的程序代码。
模拟的目标应用的程序代码在内存中的存放形式为DexFile结构体,包括dex文件内存映射指针,内存区域地址指针和区域大小,以及执行时期直接相关的结构体DexClassDef和Method。
在沙箱中对模拟的目标应用进行程序代码解密的方法为:
步骤一、从gDvm中获取与目标应用同包名的DexFile结构体;
步骤二、修复内存映射文件的dex文件魔术字段,内存区域地址指针根据连续性偏移大小计算指针位置;
步骤三、根据模拟的目标应用的类找到DexClassDef结构体,获取真实的类代码,并修复区域大小;
步骤四、根据模拟的目标应用的类找到Method结构体,修复单个函数的代码区域,并修复区域大小;
步骤五、根据修复后的代码区域,修复dex文件结构的头部,得到完整的解密的程序代码;
步骤六、将修复后的dex文件写入到文件中,完成脱壳环节。
如图4所示,本发明实施例的基于Android虚拟机的沙箱脱壳系统,包括:
执行控制模块10,用于启动Android虚拟机,将系统的类加载器替换为预定义类加载器,加载用于沙箱脱壳的自定义Android虚拟机代码包,得到可执行Android脱壳代码的运行环境,其中,所述自定义Android虚拟机代码包用于为应用程序执行提供接口,并为脱壳流程提供入口;
系统框架模块20,在虚拟机中读取待脱壳的目标应用的包名和主Acitivity名,并根据包名和主Acitivity名构建目标应用的上下文环境和资源访问接口;
脱壳模块30,构建目标应用的资源访问接口,调用目标应用执行入口,模拟目标应用的正常执行流程,将与目标应用匹配的上下文环境传递进目标应用的启动参数中,在沙箱中对目标应用进行程序代码解密,得到目标应用的程序代码。
在本发明的另一个具体实施例中,Android应用程序是运行在Dvm(Android虚拟机)程序中的,在自己的进程当中创建Dvm环境,与系统的Dvm独立开,互不影响。在该系统中,其他应用的代码运行在该系统进程当中,执行流程是可控的。有目标性的去执行加固应用的入口代码。从而模拟应用程序执行并且解密的过程,在该可控系统中获取系统内存中的原应用程序代码。以达到脱壳的目的。
Android系统上应用程序是运行在一个基于指令解释执行的Dalvik虚拟机环境上。Android系统应用程序的存在形式为apk文件,一种压缩包文件。里面包括classes.dex主要代码文件,resource文件包括资源配置文件xml和图片等媒体文件,so原生层代码文件,以及签名文件。的沙盒为简化版的Dalvik虚拟机,支持加载classes.dex代码文件和so原生层代码文件,以及resourse资源文件,来保证程序主体的正常执行。
Classes.dex代码文件是一个树状结构化文件,以类名为索引存储类的属性、变量信息,以方法名为索引存储方法的属性信息及代码。所以、程序的执行流程为解包apk文件,解析classes.dex代码文件和资源文件,构建程序执行的上下文环境,按需链接so代码文件。在classes.dex里面会调用系统或自身的接口执行功能,系统的接口由Dalvik虚拟机和框架层代码提供。Dalvik虚拟机根据约定查找应用的Application类和Activity类,并执行相关函数达到启动应用的目的。
ClassLoader为Android代码执行的类加载器,用于类查找的时候用于指定和限定查找代码的位置。系统FindClass分为有ClassLoader和无ClasserLoader两种方式,当没有ClassLoader的时候会从bootClassPath直接从加载的代码包中查找类方法。系统层接口用的为该种查找方法。当使用ClassLoader查找类的时候,优先从ClassLoader种存储的路径种查找类方法,当找不到的时候会依次向自己的上级ClassLoader请求查找。最后无法查找的时候会从classPath种指定的代码包中查找。
该脱壳方法的详细步骤如下:
创建一个可以执行Android加壳代码的沙箱。Android的应用程序的主要部分为class.dex文件,其为smali代码的打包文件。Android系统提供了一个称为dalvik的虚拟机,解释执行smali代码。Dalvik虚拟机是一个修改版的java虚拟机,执行代码的时候通过类名,用系统接口Findclass查找类。而Findclass是通过ClassLoader的层级关系,以委托代理的形式,分级查找。找到类之后,就可以通过函数名去调用方法了。而Method方法结构体中会存放目标代码。虚拟机执行的时候,就是根据Method的代码解释执行指令。
Dalvik虚拟机启动的时候会指定系统的bootClassPath,加载应用代码的时候会构造一个Classloader,里面存放来了目标应用的代码路径或者存放DexFile结构用于类查找。FindClass的搜索原理:当系统在启动的时候所有的搜索都是没有Classloader的,这时候就会到bootclassPath里面去加载dex或者jar文件。Android框架层代码就是在这个时候加载起来的。
本发明在保证了很好的兼容性的情况下,实现了一个简化的应用运行框架。并且透明替换Android。这依赖于本发明的系统层代码置换功能。在Android的dalvik虚拟机启动完成后,本发明实现了以下功能:
步骤一:打开自定义Android虚拟机的jar文件。存放在DexFile结构中。
步骤二:将上一步骤的DexFile存放到全局的bootClassPathOptExtra扩展路径中。
步骤三:执行流程进入dvmFindSystemClassNoInit以类名查找系统类的方法。在该过程不提供ClassLoader和DvmDex结构,所以默认会从bootClassPath列表搜索类。
步骤四:优先从步骤设置的bootClassPathOptExtra路径中查找类。如果找到则添加到hashTable,则下次查找该类时直接从hashTable中取,即为最新的类。如果出现同名的系统类则会替换掉原来的类。
步骤五:如果为自定义Android虚拟机未实现的类,则会从bootClassPath中查找类。
从而,本发明在既能兼容Android框架本身的接口情况下,替换了简化的系统框架。
本发明实施例的系统用于在dalvik虚拟机上执行脱壳代码。该系统包括执行控制模块、系统框架模块、脱壳模块。该系统公开如下:
在dalvik虚拟机启动完成之后,控制模块读取目标待脱壳程序。获取应用的包名和主Activity名。将包名和主Acitivity名传递给ActivityThread,构造对应该应用的环境和接口。
系统框架模块根据包名和主Activity名构造上下文环境、资源访问等接口。
调用目标应用的attachBaseContext接口模仿应用的正常执行流程,并将与目标应用匹配的上下文环境传递进去。目标应用进行正常的代码解密,并且执行Application的OnCreate和Activity的OnCreate等待执行。
系统框架层实现的Application和Activity接口,会接管后续的执行流程。将已经解密的目标应用代码重构输出为文件,系统脱壳流程完成。
如图2所示,基于dalvik虚拟机的类查找机制,可分为以下步骤。
全局类hashTable是一个表,里面用类名的hash对应存放着类的ClassObject对象。该过程先使用dvmLookupClass从类hashTable中查找。如果找到即返回ClassObject,供类实例化。否则进入下一步骤。
如果提供了Classloader则进入findClassFromLoaderNoInit,该步骤后续会调用提供的classloader的loadclass方法。
如果没有提供Classloader则进入dvmFindSystemClassNoInit,因为此处无法提供classLoader和dvmDex所以进入searchBootPathForClass从系统的bootClassPath加载的类中查找。
具体实施例1:
结合图3所示,本发明在Android系统原理之上,提供了一种对Android系统框架代码进行修改的功能。该功能步骤如下:
S01,启动Android虚拟机,直到系统框架代码加载完毕。
S02,使用系统dvmJarOpen加载本发明的自定义Android虚拟机代码包,获得DexFile对象。
S03,调用dvmSetBootPathExtraDex将上述DexFile对象存放至bootClassPathOptExtra。
S04,调用loadAllClass,循环查找上述DexFile中的类,如此全部加入到hashTable中,用于后续使用。
S041,此处不提供classloader和DvmDex供类查找,使用dvmFindSystemClassNoInit从bootclass中查找。
S042,使用dexFindClass直接从bootClassPathOptExtra中查找,找到则返回,反之进行下一步。
S043,使用dexFindClass从bootclasspath路径加载的类中查找。找到则返回。
S05,使用dvmAddClassToHash添加到全局hashTable,下次查找相应的类,即可快速优先找到本系统框架实现的类。
具体实施例2:
本系统参照Android系统运行原理,实现了从Activity、Application到ActivityThread等,供应用直接调用的接口。还实现了ApplicationInfo,LoadedApk,Context等与环境,资源相关的类。由于涉及系统原理较多,本实施例只说明参照步骤。
S01,控制模块启动dalvik虚拟机。
S02,控制模块使用实施例1的功能加载本系统框架jar包。
S03,传入目标应用app路径,解析获取Application名和主Activity名。
S04,使用Jni接口FindClass查找目标Application类,并且调用<init>初始化函数,调用NewObject生成对象。
S05,使用Jni接口FindClass查找ActivityThread,此时该ActivityThread为本系统框架实现的ActivityThread。传入包名和目标应用路径,调用构造函数。
S051,使用AssetManager,添加资源路径,生成Resources资源。
S052,构造本框架实现的Context,写入相关文件路径、Resource资源以及ApplicationInfo信息。供目标应用获取资源文件等。
S06,获取构造的Context对象,调用目标Application的attachBaseContext。
S07,调用目标Application的OnCreate方法。
S08,由于目标Application继承与本系统框架实现的Application,进入Application脱壳流程。
S09,获取gDvm.userDexFiles结构,找到与目标包名相同的DexFile结构,生成文件。
本发明实现Android系统框架层部分接口,生成独立的可执行代码文件。通过设置系统的ClassPath变量,由系统加载本发明的补丁程序。由于Android本身原理的限制,在正式加载dex之前会进入dexopt流程。在该流程跨dex检测,class依赖检测。
本发明通过修改loadAllClass执行流程,在这里修改通过dex查找类的过程,将bootClassPathOptExtra提高到bootclassPath前面,这样补丁程序的dex文件将优先被查找到并且加载到系统hashTable中。从而,在不破坏原系统原理的情况,加载了系统框架层补丁代码。
系统级指令选择行执行功能。基于Android系统解释执行程序的开发,达到有目标性的过滤部分Androidopcode指令。
Android的Dvm虚拟机的核心是一个指令解释执行器。在执行器中,以二进制的形式读取操作指令,并转换成对应的内存分以及函数调用功能。在解析完成指令,根据获取的对象id,知道操作对象。根据获取当前的函数接口,判断当前指令是否为需要过滤的指令。如果需要过滤的,让该指令返回默认操作结果。完成虚拟机相关的指令过滤功能。
定制化的Android运行框架。原生Android框架接口提供了一套服务管理接口,当前应用相关的Context接口,该系统庞大而且复杂。
本发明编写自己的Activity、ActivityThread接口,提供应用对Activity做为程序入口的相关功能。编写Context接口提供系统环境和本程序资源等的访问接口。编写applicationinfo、LoaderApk等接口提供加固应用构建ClassLoader加载被加固dex的功能。然后利用上述的系统级补丁功能,加载到系统。
本发明的关键函数及结构体说明:
本发明具有如下优点:
1、执行该系统的环境不需要root(提供最高访问权限),保证了用户的设备环境安全性。
2、该系统的使用简单,只需要提供目标程序的路径。启动该系统,就能自动输出被脱壳的代码dex。
3、效率较高,该系统的启动是一个简化的Android系统,并且加载少量的补丁代码,所以整体效率较高。
上述说明示出并描述了本发明的若干实施例,但如前所述,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。
Claims (9)
1.一种基于Android虚拟机的沙箱脱壳方法,其特征在于,包括以下步骤:
启动Android虚拟机,将系统的类加载器替换为预定义类加载器,加载用于沙箱脱壳的自定义Android虚拟机代码包,得到可执行Android脱壳代码的运行环境,其中,所述自定义Android虚拟机代码包用于为应用程序执行提供接口,并为脱壳流程提供入口;
在虚拟机中读取待脱壳的目标应用的包名和主Acitivity名,并根据包名和主Acitivity名构建目标应用的上下文环境和资源访问接口;
构架目标应用的资源访问接口,模拟目标应用的正常执行流程,将与目标应用匹配的上下文环境传递进目标应用的启动参数中,在沙箱中对目标应用进行程序代码解密,得到目标应用的程序代码。
2.一种基于Android虚拟机的沙箱脱壳系统,其特征在于,包括:
执行控制模块,用于启动Android虚拟机,将系统的类加载器替换为预定义类加载器,加载用于沙箱脱壳的自定义Android虚拟机代码包,得到可执行Android脱壳代码的运行环境,其中,所述自定义Android虚拟机代码包用于为应用程序执行提供接口,并为脱壳流程提供入口;
系统框架模块,在虚拟机中读取待脱壳的目标应用的包名和主Acitivity名,并根据包名和主Acitivity名构建目标应用的上下文环境和资源访问接口;
脱壳模块,构建目标应用的资源访问接口,调用目标应用执行入口,模拟目标应用的正常执行流程,将与目标应用匹配的上下文环境传递进目标应用的启动参数中,在沙箱中对目标应用进行程序代码解密,得到目标应用的程序代码。
3.根据权利要求1所述的方法或权利要求2所述的系统,其特征在于,启动Android虚拟机时还包括构建应用执行所需的基本接口的方法,该方法包括以下步骤:
创建虚拟机对象,在内存结构中初始化用于查找类的缓存;
在虚拟机中创建用于构建基本接口的基础类;
加载Android系统框架层代码包,根据基础类构建Android应用执行时能够直接调用的基本接口。
4.根据权利要求1所述的方法或权利要求2所述的系统,其特征在于,将系统的类加载器替换为预定义类加载器的方法为:
Android虚拟机启动时指定系统的类加载器的全局变量,判断系统查找类的方式;
若为无类加载器的方式,在全局变量中指定自定义Android虚拟机代码包,并查找类;
若为使用类加载器的方式,构造预定义类加载器并替换系统的类加载器,通过该预定义的类加载器查找自定义Android虚拟机代码包的路径,加载自定义Android虚拟机代码包。
5.根据权利要求1所述的方法或权利要求2所述的系统,其特征在于,自定义Android虚拟机代码包的实现方法为:
获取自定义Android虚拟机代码包的jar文件,存放到与目标应用同名的DexFile结构体中;
将DexFile结构体存放到全局的ClassPath扩展变量中;
执行查找系统类的流程,从全局变量中通过类名查找系统类;从全局的扩展变量中查找自定义Android虚拟机的类,并将其添加到哈希表中,下次查找该类时直接从哈希表中获取;
若为自定义Android虚拟机未实现的类,从全局变量中的系统类进行替换;若为与系统类同名的类,用自定义Android虚拟机的类替换系统类。
6.根据权利要求1所述的方法或权利要求2所述的系统,其特征在于,所述模拟的目标应用的程序代码在内存中的存放形式为DexFile结构体,包括dex文件内存映射指针,dex文件各区域地址指针和区域大小,以及执行时期直接相关的结构体DexClassDef和Method。
7.根据权利要求6所述的方法,其特征在于,在沙箱中对模拟的目标应用进行程序代码解密的方法为:
获取与目标应用同包名的DexFile结构体;
修复内存映射文件的dex文件魔术字段,内存区域地址指针根据连续性偏移大小计算指针位置;
根据模拟的目标应用的类找到DexClassDef结构体,获取真实的类代码,并修复区域大小;
根据模拟的目标应用的类找到Method结构体,修复单个函数的代码区域,并修复区域大小;
根据修复后的代码区域,修复dex文件结构的头部,得到完整的解密的程序代码。
8.根据权利要求6所述的系统,其特征在于,在沙箱中对模拟的目标应用进行程序代码解密的方法为:
获取与目标应用同包名的DexFile结构体;
修复内存映射文件的dex文件魔术字段,内存区域地址指针根据连续性偏移大小计算指针位置;
根据模拟的目标应用的类找到DexClassDef结构体,获取真实的类代码,并修复区域大小;
根据模拟的目标应用的类找到Method结构体,修复单个函数的代码区域,并修复区域大小;
根据修复后的代码区域,修复dex文件结构的头部,得到完整的解密的程序代码。
9.根据权利要求1所述的方法或权利要求2所述的系统,其特征在于,所述的Android虚拟机为dalvik虚拟机。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611191775.7A CN108229148B (zh) | 2016-12-21 | 2016-12-21 | 一种基于Android虚拟机的沙箱脱壳方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611191775.7A CN108229148B (zh) | 2016-12-21 | 2016-12-21 | 一种基于Android虚拟机的沙箱脱壳方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108229148A true CN108229148A (zh) | 2018-06-29 |
CN108229148B CN108229148B (zh) | 2022-06-21 |
Family
ID=62650875
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611191775.7A Active CN108229148B (zh) | 2016-12-21 | 2016-12-21 | 一种基于Android虚拟机的沙箱脱壳方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108229148B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109255235A (zh) * | 2018-09-17 | 2019-01-22 | 西安电子科技大学 | 基于用户态沙箱的移动应用第三方库隔离方法 |
CN109684846A (zh) * | 2018-12-28 | 2019-04-26 | 微梦创科网络科技(中国)有限公司 | 一种文件提取方法及装置 |
CN110610097A (zh) * | 2019-09-09 | 2019-12-24 | 杭州天宽科技有限公司 | 一种基于安卓应用的文件传输保密系统 |
CN111177753A (zh) * | 2019-12-24 | 2020-05-19 | 广州极点三维信息科技有限公司 | 一种对Java内容仓库数据的加密处理方法、装置和设备 |
CN111931167A (zh) * | 2020-10-09 | 2020-11-13 | 广州宸祺出行科技有限公司 | 一种防止Android应用被沙盒劫持的方法及系统 |
CN112379973A (zh) * | 2020-12-01 | 2021-02-19 | 腾讯科技(深圳)有限公司 | 重载方法和装置 |
CN112445543A (zh) * | 2020-11-26 | 2021-03-05 | 杭州趣链科技有限公司 | 智能合约的类调用方法、装置及电子设备 |
CN112580035A (zh) * | 2019-09-30 | 2021-03-30 | 奇安信安全技术(珠海)有限公司 | 程序脱壳方法及装置、存储介质、计算机设备 |
CN112883374A (zh) * | 2021-02-02 | 2021-06-01 | 电子科技大学 | 一种基于ART环境下的Android平台应用程序通用脱壳方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102760219A (zh) * | 2011-12-20 | 2012-10-31 | 北京安天电子设备有限公司 | 一种Android平台软件保护系统、方法及设备 |
CN103019740A (zh) * | 2012-12-28 | 2013-04-03 | 北京神州绿盟信息安全科技股份有限公司 | 一种获取导入表和重定位表的方法及装置 |
CN105631335A (zh) * | 2015-12-25 | 2016-06-01 | 北京奇虎科技有限公司 | 一种动态脱壳方法、装置和设备 |
CN105989252A (zh) * | 2015-12-12 | 2016-10-05 | 武汉安天信息技术有限责任公司 | 一种针对函数级别加壳的脱壳方法及系统 |
-
2016
- 2016-12-21 CN CN201611191775.7A patent/CN108229148B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102760219A (zh) * | 2011-12-20 | 2012-10-31 | 北京安天电子设备有限公司 | 一种Android平台软件保护系统、方法及设备 |
CN103019740A (zh) * | 2012-12-28 | 2013-04-03 | 北京神州绿盟信息安全科技股份有限公司 | 一种获取导入表和重定位表的方法及装置 |
CN105989252A (zh) * | 2015-12-12 | 2016-10-05 | 武汉安天信息技术有限责任公司 | 一种针对函数级别加壳的脱壳方法及系统 |
CN105631335A (zh) * | 2015-12-25 | 2016-06-01 | 北京奇虎科技有限公司 | 一种动态脱壳方法、装置和设备 |
Non-Patent Citations (1)
Title |
---|
YUEQIAN,ETC: "DexHunter: Toward Extracting Hidden Code from Packed Android Applications", 《EUROPEAN SYMPOSIUM ON RESEARCH IN COMPUTER SECURITY》 * |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109255235A (zh) * | 2018-09-17 | 2019-01-22 | 西安电子科技大学 | 基于用户态沙箱的移动应用第三方库隔离方法 |
CN109684846A (zh) * | 2018-12-28 | 2019-04-26 | 微梦创科网络科技(中国)有限公司 | 一种文件提取方法及装置 |
CN110610097A (zh) * | 2019-09-09 | 2019-12-24 | 杭州天宽科技有限公司 | 一种基于安卓应用的文件传输保密系统 |
CN112580035A (zh) * | 2019-09-30 | 2021-03-30 | 奇安信安全技术(珠海)有限公司 | 程序脱壳方法及装置、存储介质、计算机设备 |
CN112580035B (zh) * | 2019-09-30 | 2024-02-06 | 奇安信安全技术(珠海)有限公司 | 程序脱壳方法及装置、存储介质、计算机设备 |
CN111177753A (zh) * | 2019-12-24 | 2020-05-19 | 广州极点三维信息科技有限公司 | 一种对Java内容仓库数据的加密处理方法、装置和设备 |
CN111931167A (zh) * | 2020-10-09 | 2020-11-13 | 广州宸祺出行科技有限公司 | 一种防止Android应用被沙盒劫持的方法及系统 |
CN112445543A (zh) * | 2020-11-26 | 2021-03-05 | 杭州趣链科技有限公司 | 智能合约的类调用方法、装置及电子设备 |
CN112379973A (zh) * | 2020-12-01 | 2021-02-19 | 腾讯科技(深圳)有限公司 | 重载方法和装置 |
CN112379973B (zh) * | 2020-12-01 | 2023-10-24 | 腾讯科技(深圳)有限公司 | 重载方法和装置 |
CN112883374A (zh) * | 2021-02-02 | 2021-06-01 | 电子科技大学 | 一种基于ART环境下的Android平台应用程序通用脱壳方法及系统 |
CN112883374B (zh) * | 2021-02-02 | 2022-07-01 | 电子科技大学 | 一种基于ART环境下的Android平台应用程序通用脱壳方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108229148B (zh) | 2022-06-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108229148A (zh) | 一种基于Android虚拟机的沙箱脱壳方法及系统 | |
CN109710384B (zh) | 一种安全的Java智能合约解释执行引擎及方法 | |
US11687645B2 (en) | Security control method and computer system | |
CN107273148B (zh) | 数据的更新驱动迁移 | |
CN111095338A (zh) | 用于执行不同类型区块链合约的系统和方法 | |
CN101446903B (zh) | 构件自动分类的方法 | |
CN103970563B (zh) | 动态加载安卓类的方法 | |
CN110022311B (zh) | 一种基于攻击图的云外包服务数据泄露安全测试用例自动化生成方法 | |
CN104049986A (zh) | 插件加载方法及装置 | |
CN101226569A (zh) | 在虚拟机中验证代码模块的方法及装置 | |
CN113986459A (zh) | 一种容器访问的控制方法、系统、电子设备及存储介质 | |
JP3706065B2 (ja) | 様々なソース言語の実行メディアへの移植 | |
WO2018032653A1 (zh) | 一种Java卡应用的功能实现方法及装置 | |
US10248795B2 (en) | Implementing method for JavaCard application function expansion | |
CN108229107A (zh) | 一种Android平台应用程序的脱壳方法及容器 | |
US8959485B2 (en) | Security protection domain-based testing framework | |
CN108090360A (zh) | 一种基于行为特征的安卓恶意应用分类方法及系统 | |
CN104063303B (zh) | 一种获取和释放root权限的方法 | |
CN102902911A (zh) | 一种在Java虚拟机中安全运行第三方代码的方法 | |
WO2022247300A1 (zh) | 沙箱初始化方法、图形界面及相关装置 | |
CN108229147B (zh) | 一种基于Android虚拟容器的内存检测装置及方法 | |
CN106506163B (zh) | Rom包处理方法及装置 | |
CN110414218A (zh) | 内核检测方法、装置、电子设备及存储介质 | |
CN115659340B (zh) | 一种仿冒小程序识别方法、装置、存储介质及电子设备 | |
CN101751258A (zh) | 智能卡与智能卡应用的开发方法、开发系统及部署方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |