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

Android平台上一种绕过虚假函数的自动脱壳技术制造技术

技术编号:29330959 阅读:28 留言:0更新日期:2021-07-20 17:48
本申请是对当前加固程序将部分方法执行时动态加解密,即调用时解密,结束时加密,针对防止脱壳程序设置的一些虚假函数提出了一种基于hook以及代码抽取的通用自动化脱壳方法。本方法监控应用程序的运行,还原出应用程序的原始Dex文件。通过查找Dex文件中所有的Class对象,然后再使用多线程分组遍历所有类并反射调用所有method。当执行完虚假函数后,将hook代码写入该method,随后重启应用程序,待下次进入此method时就会调用自己的代码,以达到绕过虚假函数的目的。待所有方法都被调用后,重组脱壳后的Dex文件。

【技术实现步骤摘要】
Android平台上一种绕过虚假函数的自动脱壳技术
本专利技术涉及一种Android平台上一种绕过虚假函数的自动脱壳技术,属于计算机应用安全

技术介绍
Android作为现在主流的移动端操作系统,由于对第三方应用程序的监控和审核机制存在缺陷,涌现出大量的第三方Android应用程序,很多恶意应用程序通过各种手段来窃取用户的个人隐私信息。为了防止软件被逆向破解或攻击利用,许多开发采用应用加壳的方式,极大地增加逆向分析的难度,从而达到对程序保护的效果。但是以Android平台为目标的恶意软件也利用了加壳技术的特性,对自身携带的恶意代码进行隐藏,无法利用静态分析工具准确检测应用内部是否存在隐私窃取等安全隐患。因此,研究者们提出了一系列的脱壳方案,这些脱壳方案可以分为以下几类:第一类脱壳方案是找到原应用程序的入口出,因为壳程序会将被加壳的应用程序进行解密,跳入程序的原入口并将解密后的原dex文件加载到内存中。这类脱壳方案可以通过直接搜索或转储内存的方式,从而达到对加壳的应用程序的脱壳。然而,对于目前的加壳应用,这类脱壳方案在一个指定的解密点进行脱壳,并不适用于目前壳程序采用的分阶段解密策略,在壳程序解密时不能保证被加壳的程序进行完全的解密,因此脱壳后的应用程序并不完整。第二类脱壳方案是通过Hook对应的系统函数对应用程序的运行进行监控,在应用程序运行的过程中部分代码会被解密,最后将收集到的解密后的代码和其它数据对原Dex文件进行重组。由于要保证应用程序能够正常运行,因此在运行时收集到的被解密的代码一定是可靠的。这类方案无法保证能收集到应用程序行的所有代码,且脱壳效率较为低。随着加壳技术的更新,针对防止脱壳程序设置的一些虚假函数,这类方案无法做到准确有效的脱壳。综上所述,加壳技术的出现使得安全研究人员难以对被加壳的恶意软件进行深入的分析。现有的脱壳方案对被加壳的应用程序无法做到完美的脱壳。
技术实现思路
针对现有脱壳方案中存在的缺陷,本专利技术的目的在于使用hook技术来解决应用程序代码中存在的虚假函数和多线程解决脱壳效率的问题。提供了一种绕过虚假函数的自动脱壳技术。为实现上述目的,本专利技术研究的一种Android平台上一种绕过虚假函数的自动脱壳技术,包括:在目标应用程序主线程启动前,插入hook代码,从系统类中获取已加载的所有类名称和类加载器,并遍历dvmUserDexFiles结构,获取所有cookie(已加载的dex);创建多个子线程分组获取Java类中的所有方法,利用堆内存中产生的真实对象参数来强制放射调用上述方法;在上述方法执行时收集被解密的代码,通过修改quick_code的值进入Interpreter(解释器)其会由解释器解释执行,通过修改解析器完成代码的收集。待所有的数据收集完成之后,按照Dex文件的结构进行重组。通过退出异常判断是否是因进入了虚假函数,如果是则对该方法进行hook,插入自己的代码,不执行原有代码。重启目标应用程序,并重新对该类进行脱壳。进一步地,hook系统类的方法是:在目标应用程序启动前,将hook代码插入ActivityThread类的bindApplication方法中,通过对DexFile类中方法对已加载的类进行监控,获取所有已加载的类的名称和加载器并过滤掉加载的系统类。再对attch方法进行hook获取该dex上下文的context,防止发生ClassNotFoundError异常。进一步地,创建多个子线程的方法是:在ActivityThread类中的handleBindApplication方法中添加新的逻辑,通过实现Runnable接口的方式,实现多线程的操作,这样的话可以很容易实现共享数据。进一步地,通过使用Class.getDeclaredConstructors和Class.getDeclaredMethods分别获取构造器方法和普通方法。反射调用方法时的参数选取,对基本数据类型的参数,使用设置的默认值;对于其它参数,可以从堆内存中获取该类已存在实例来进行反射调用上述方法,可以很大程度上的保证应用程序不会出现异常,如若堆内存中不存在该类的实例对象,则调用该类的构造函数进行参数的创建。进一步地,将获取的类信息存入一个集合中,添加新的逻辑,通过多线程分组反射调用上述方法,避免重复调用同一方法。进一步地,通过ShouldUseInterpreterEntrypoint函数判断是否使用解释器,通过修改quick_code的值进入Interpreter(解释器)模式,使用解释器执行时会调用ArtInterpreterToInterpreterBridge函数,并将代码收集点设置在此。该函数就是从执行本地机器码的方式转为使用解释器执行。而在使用解释器执行前,加密服务需要保证传入解释器的字节码时应用被加固前原始的字节码,正确的字节码必然已经被恢复在内存中。进一步地,Dex文件由文件头、索引区和数据区组成,其中dex文件头部,记录了整个dex文件的相关信息;索引区则包含了字符串数据索引、数据索引、原型数据索引、字段数据索引、类方法索引、类定义数据索引;数据区则包含了各个类的真实数据。待所有的数据收集完成之后,按照Dex文件的结构进行重组。整个重组的方法为:重新计算方法、类的数量和偏移地址信息填入新建的Dex文件的文件头,在计算数据在Dex文件中的偏移填入索引区,最后将脱壳得到的代码填入。进一步地,当调用虚假函数时,大多是强制退出应用程序,并不会产生程序的异常。进一步地,在每次调用方法之前,记录类的相关信息以及方法的相关信息,通过退出异常判断是否是因进入了虚假函数,如果是则对方法进行hook,插入自己的代码,不执行原有代码。重启目标应用程序,并重新对该类进行脱壳。附图说明图1是基于Android平台上一种绕过虚假函数的自动脱壳技术的工作流程图。具体实施方式通过遍历dvmUserDexFiles结构,获取所有cookie(已加载的dex)。并对Android框架进行修改,在目标应用程序主线程启动前,插入hook代码,从系统类中获取加载的所有名称和类加载器,将这些信息存入一个集合中,并将这些信息发送给子线程以便后续进行强制反射调用。创建多个子线程的方法是:在ActivityThread类中的handleBindApplication方法中添加新的逻辑,通过实现Runnable接口的方式,实现多线程的操作,这样的话可以很容易实现共享数据。通过在多个子线程分组进行反射调用所有方法,通过获取所有类的Class对象,使用Class.getDeclaredConstructors获取构造器方法,使用Class.getDeclaredMethods获取普通方法。调用方法时的参数选取,对基本数据类型的参数,使用设置的默认值;对于其它参数,可以从堆内存中获取该类已存在实例来进行反射调用上述方法,可以很大程度上的保证应用程序不会本文档来自技高网
...

【技术保护点】
1.一种绕过虚假函数的自动脱壳技术,其特征在于,包括以下步骤:/n在目标应用程序主线程启动前,插入hook代码。获取并存储方法中的参数,即已加载的所有类名称和类加载器,并遍历dvmUserDexFiles结构,获取所有cookie(已加载的dex);/n创建多个线程通过每个类的Class对象,进行分组调用所有类的方法,以获取Java类中的所有方法代码,参数也可以是从堆内存中获取的真实数据;/n通过修改源码的方式,在方法执行时使用解释器解释执行,并在解析器中设置收集点,在方法执行时收集被解密的代码;/n遍历Dex文件不同组成部分的内容,重组出脱壳后的Dex文件,完成脱壳;/n如果方法在执行的过程中因进入了虚假函数而导致退出应用程序,对该方法进行hook,并重启应用程序继续脱壳。/n

【技术特征摘要】
1.一种绕过虚假函数的自动脱壳技术,其特征在于,包括以下步骤:
在目标应用程序主线程启动前,插入hook代码。获取并存储方法中的参数,即已加载的所有类名称和类加载器,并遍历dvmUserDexFiles结构,获取所有cookie(已加载的dex);
创建多个线程通过每个类的Class对象,进行分组调用所有类的方法,以获取Java类中的所有方法代码,参数也可以是从堆内存中获取的真实数据;
通过修改源码的方式,在方法执行时使用解释器解释执行,并在解析器中设置收集点,在方法执行时收集被解密的代码;
遍历Dex文件不同组成部分的内容,重组出脱壳后的Dex文件,完成脱壳;
如果方法在执行的过程中因进入了虚假函数而导致退出应用程序,对该方法进行hook,并重启应用程序继续脱壳。


2.如权利要求1所述的方法,其特征在于,包括:
在目标应用程序启动前,将hook代码插入ActivityThread类的方法中,通过对DexFile类中方法对已加载的类进行监控,获取所有已加载的类的名称和加载器并过滤掉加载的系统类,并遍历dvmUserDexFiles结构,获取所有cookie(已加载的dex)。


3.如权利要求1所述的方法,其特征在于,包括:
通过在ActivityThread中创建多个子线程,在每个子线程中通过类的包名分组获取每个类的Class对象。再通过使用Class.getDeclaredConstructors获取构造器方法,使用Class.getDec...

【专利技术属性】
技术研发人员:刘新张远明马中昊李广黄浩钰
申请(专利权)人:湘潭大学
类型:发明
国别省市:湖南;43

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

1