CN113139188A - Android平台上一种绕过虚假函数的自动脱壳技术 - Google Patents
Android平台上一种绕过虚假函数的自动脱壳技术 Download PDFInfo
- Publication number
- CN113139188A CN113139188A CN202110471467.4A CN202110471467A CN113139188A CN 113139188 A CN113139188 A CN 113139188A CN 202110471467 A CN202110471467 A CN 202110471467A CN 113139188 A CN113139188 A CN 113139188A
- Authority
- CN
- China
- Prior art keywords
- class
- code
- data
- application program
- index
- 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.)
- Pending
Links
- 238000005516 engineering process Methods 0.000 title description 8
- 238000000034 method Methods 0.000 claims abstract description 76
- 230000006870 function Effects 0.000 claims abstract description 29
- 235000014510 cooky Nutrition 0.000 claims description 4
- 238000013480 data collection Methods 0.000 claims description 4
- 238000004364 calculation method Methods 0.000 claims description 3
- 230000006798 recombination Effects 0.000 claims description 3
- 238000005215 recombination Methods 0.000 claims description 3
- 238000000605 extraction Methods 0.000 abstract 1
- 230000002787 reinforcement Effects 0.000 abstract 1
- 230000002159 abnormal effect Effects 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 2
- 230000007547 defect Effects 0.000 description 2
- 230000005856 abnormality Effects 0.000 description 1
- 238000004883 computer application Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000007429 general method Methods 0.000 description 1
- 238000010921 in-depth analysis Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000002265 prevention Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000008685 targeting Effects 0.000 description 1
Images
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/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
-
- 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/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- 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/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5018—Thread allocation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Abstract
本申请是对当前加固程序将部分方法执行时动态加解密,即调用时解密,结束时加密,针对防止脱壳程序设置的一些虚假函数提出了一种基于hook以及代码抽取的通用自动化脱壳方法。本方法监控应用程序的运行,还原出应用程序的原始Dex文件。通过查找Dex文件中所有的Class对象,然后再使用多线程分组遍历所有类并反射调用所有method。当执行完虚假函数后,将hook代码写入该method,随后重启应用程序,待下次进入此method时就会调用自己的代码,以达到绕过虚假函数的目的。待所有方法都被调用后,重组脱壳后的Dex文件。
Description
技术领域
本发明涉及一种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获取普通方法。调用方法时的参数选取,对基本数据类型的参数,使用设置的默认值;对于其它参数,可以从堆内存中获取该类已存在实例来进行反射调用上述方法,可以很大程度上的保证应用程序不会出现异常,如若堆内存中不存在该类的实例对象,则调用该类的构造函数进行参数的创建。
在进行反射调用的过程中不管是否有类方法是否存在本地机器码,都强制进入解释器解释执行。通过ShouldUseInterpreterEntrypoint函数判断是否使用解释器,通过修改quick_code的值进入Interpreter(解释器)模式,通过使用解释器执行时会调用ArtInterpreterToInterpreterBridge函数,并将代码收集点设置在此。该函数就是从执行本地机器码的方式转为使用解释器执行。而在使用解释器执行前,加密服务需要保证传入解释器的字节码时应用被加固前原始的字节码,正确的字节码必然已经被恢复在内存中。
待应用程序的所有方法都被强制反射调用后,进行重组脱壳后的Dex文件。Dex文件由文件头、索引区和数据区组成,其中dex文件头部,记录了整个dex文件的相关信息;索引区则包含了字符串数据索引、数据索引、原型数据索引、字段数据索引、类方法索引、类定义数据索引;数据区则包含了各个类的真实数据。待所有的数据收集完成之后,按照Dex文件的结构进行重组。整个重组的方法为:重新计算方法、类的数量和偏移地址信息填入新建的Dex文件的文件头,在计算数据在Dex文件中的偏移填入索引区,最后将脱壳得到的代码填入。
当调用虚假函数时,大多是强制退出应用程序,并不会产生程序的异常。因此,在每次调用方法之前,记录类的相关信息以及方法的相关信息,通过退出异常判断是否是因进入了虚假函数,如果是则对方法进行hook,插入自己的代码,不执行原有代码。重启目标应用程序,并重新对该类进行脱壳。
Claims (7)
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.getDeclaredMethods获取普通方法。调用方法时的参数选取,对基本数据类型的参数,使用设置的默认值;对于其它参数,可以从堆内存中获取该类已存在实例来进行反射调用上述方法。
4.如权利要求1所述的方法,其特征在于,包括:
通过修改quick_code的值进入Interpreter(解释器)模式,使用解释器执行时会调用ArtInterpreterToInterpreterBridge函数,并将代码收集点设置在此。该函数就是从执行本地机器码的方式转为使用解释器执行。
5.如权利要求1所述的方法,其特征在于,包括:
Dex文件由文件头、索引区和数据区组成,其中dex文件头部,记录了整个dex文件的相关信息;索引区则包含了字符串数据索引、数据索引、原型数据索引、字段数据索引、类方法索引、类定义数据索引;数据区则包含了各个类的真实数据。
6.如权力要求5所述的方法,其特征在于,包括:
待所有的数据收集完成之后,按照Dex文件的结构进行重组。整个重组的方法为:重新计算方法、类的数量和偏移地址信息填入新建的Dex文件的文件头,在计算数据在Dex文件中的偏移填入索引区,最后将脱壳得到的代码填入。
7.如权力要求1所述的方法,其特征在于,包括:
在每次调用方法之前,记录类的相关信息以及方法的相关信息,通过退出异常判断是否是因进入了虚假函数,如果是则对方法进行hook,插入自己的代码,不执行原有代码。重启目标应用程序,并重新对该类进行脱壳。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110471467.4A CN113139188A (zh) | 2021-04-29 | 2021-04-29 | Android平台上一种绕过虚假函数的自动脱壳技术 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110471467.4A CN113139188A (zh) | 2021-04-29 | 2021-04-29 | Android平台上一种绕过虚假函数的自动脱壳技术 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113139188A true CN113139188A (zh) | 2021-07-20 |
Family
ID=76816485
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110471467.4A Pending CN113139188A (zh) | 2021-04-29 | 2021-04-29 | Android平台上一种绕过虚假函数的自动脱壳技术 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113139188A (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102184103A (zh) * | 2011-05-12 | 2011-09-14 | 电子科技大学 | 软件保护壳的壳特征提取方法 |
CN104850786A (zh) * | 2015-06-03 | 2015-08-19 | 舒辉 | 基于环境重构的恶意代码完整性分析方法 |
CN111581639A (zh) * | 2020-03-27 | 2020-08-25 | 北京大学 | 一种Android加壳应用程序通用自动化脱壳方法及系统 |
-
2021
- 2021-04-29 CN CN202110471467.4A patent/CN113139188A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102184103A (zh) * | 2011-05-12 | 2011-09-14 | 电子科技大学 | 软件保护壳的壳特征提取方法 |
CN104850786A (zh) * | 2015-06-03 | 2015-08-19 | 舒辉 | 基于环境重构的恶意代码完整性分析方法 |
CN111581639A (zh) * | 2020-03-27 | 2020-08-25 | 北京大学 | 一种Android加壳应用程序通用自动化脱壳方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106096338B (zh) | 一种具有数据流混淆的虚拟化软件保护方法 | |
CN102118512A (zh) | 一种手机应用程序防破解方法及系统 | |
CN110232262A (zh) | 一种安卓应用的加固方法和系统 | |
US10528729B2 (en) | Methods and systems for defending against cyber-attacks | |
CN114385189B (zh) | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 | |
CN104252594A (zh) | 病毒检测方法和装置 | |
CN108763924B (zh) | 一种安卓应用程序中不可信第三方库访问权限控制方法 | |
CN101599113A (zh) | 驱动型恶意软件防御方法和装置 | |
CN116150739A (zh) | 一种基于关键地址动态保护的栈溢出自动防御方法 | |
CN113946825B (zh) | 一种内存马处理方法及系统 | |
CN112214267A (zh) | 一种安卓脱壳加速方法、装置、存储介质及计算机设备 | |
CN109766690B (zh) | 一种基于多策略指令检测的rop及变种攻击动态检测方法 | |
CN111581639B (zh) | 一种Android加壳应用程序通用自动化脱壳方法及系统 | |
CN112287357B (zh) | 一种针对嵌入式裸机系统的控制流验证方法与系统 | |
CN110147653A (zh) | 应用程序安全加固方法及装置 | |
CN112134905B (zh) | 基于安卓系统的签名方法、装置以及设备 | |
CN113176926A (zh) | 一种基于虚拟机自省技术的api动态监控方法及系统 | |
CN113139188A (zh) | Android平台上一种绕过虚假函数的自动脱壳技术 | |
CN102831334A (zh) | 一种目标地址定位方法和系统 | |
CN112214266A (zh) | 欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备 | |
CN115659322B (zh) | 一种基于运行时顺序调度装载的代码复用攻击防御方法 | |
CN115357520B (zh) | 一种基于cpu的图形渲染方式的检测方法 | |
CN103824018A (zh) | 一种可执行文件处理方法以及可执行文件监控方法 | |
CN109033821A (zh) | 一种栈溢出攻击防护系统及方法 | |
CN109918872B (zh) | Android应用加固方法 |
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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20210720 |