CN106775843B - 基于内存加载的dalvik字节码优化方法 - Google Patents
基于内存加载的dalvik字节码优化方法 Download PDFInfo
- Publication number
- CN106775843B CN106775843B CN201611080987.8A CN201611080987A CN106775843B CN 106775843 B CN106775843 B CN 106775843B CN 201611080987 A CN201611080987 A CN 201611080987A CN 106775843 B CN106775843 B CN 106775843B
- Authority
- CN
- China
- Prior art keywords
- dex file
- loading
- dalvik
- memory
- byte code
- 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.)
- Active
Links
Images
Classifications
-
- 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/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Abstract
本发明公开了一种基于内存加载的dalvik字节码优化方法,它包括以下步骤:步骤1,读取加密的DEX文件进行解密解压后,并将解密解压后的DEX文件以字节码的形式保存到栈内存中;步骤2,采用反射调用DexFile的openDexFile方法,解析步骤1中的DEX文件字节码得到一个DexOrJar结构体,将DexOrJar结构体的内容加载到gDvm中的userDexFile结构的hash表中,最后返回存储DEX文件信息的DexOrJar结构体指针,记为cookie值;步骤3,定义本地方法loadDex,传递DEX文件的字节数组和字节大小;步骤4,重写类加载器加载指定的类,本发明在读取加密压缩DEX文件后,便一直在内存中利用字节码的形式进行DEX文件的解密解压、存储和加载,极大程度的保护了DEX文件,提高了加固后APK的抗攻击性。
Description
技术领域
本发明涉及移动终端应用安全领域,具体涉及基于内存加载的dalvik字节码优化方法。
背景技术
据最新智能终端销量统计,中国的Android系统目前已占据移动端73%以上的市场份额,各种Android应用程序也在成级数式增长且涉及的业务越来越广,涵盖娱乐、支付、生活等各个领域。由于android平台软件使用的语言是JAVA,而JAVA源代码编译后的二进制代码极易被反编译,导致android应用程序易被黑客通过二次打包、篡改、恶意注入等手段进行恶意破坏。因此应用安全问题已经成为开发者/发布者/使用者关注的热点。
目前市场上比较主流的应用软件加固措施可分为加壳和脱壳两个过程。其中,加壳技术主要是通过用一个新的classes.dex文件替换掉APP中的核心代码文件,将原dex文件通过加密技术处理,生成加密文件另行存储,最后修改应用配置文件,并加入对应解密算法库,形成加固后的APP安装包。加壳后APK中的dex文件便是壳dex。该方法可防止破解者还原真实代码逻辑。
脱壳技术则是指程序在运行过程中将原APK的dex文件解密出来并加载到内存中,让该APK正常运行起来。APK的脱壳过程需要利用壳dex来完成。现有的脱壳方法多是通过Android API提供的DexClassLoader类加载原dex文件中的核心代码,并通过反射将Android默认的类加载器android.app.ActivityThread中的mClassLoader置换为为DexClassLoader,这样既保证加载了源程序又没有放弃原先加载的资源与系统代码。这种做法中解密之后的dex会端在存放在/data/data/包名/cache目录下,然后再用DexClassLoader加载dex,运行程序。这种做法虽然可行但仍旧存在一些问题。首先,解密之后的dex文件需要存放在特定目录下,增大了被破解的风险。其次,先解密得到源程序的dex,然后再用DexClassLoader进行加载,相当于在解密时和加载原dex时两次把dex加载到内存中,大大降低了程序的启动效率。
发明内容
本发明克服了现有技术的不足,提供一种基于内存加载的dalvik字节码优化方法。
为解决上述的技术问题,本发明采用以下技术方案:
一种基于内存加载的dalvik字节码优化方法,它包括以下步骤:
步骤1,读取加密的DEX文件进行解密解压,并将解密解压后的DEX文件以字节码的形式保存到栈内存中;
步骤2,采用反射调用DexFile的openDexFile方法,解析步骤1中的DEX文件字节码得到一个DexOrJar结构体,将DexOrJar结构体的内容加载到gDvm中的userDexFile结构的hash表中,最后返回存储DEX文件信息的DexOrJar结构体指针,记为cookie值;
步骤3,定义本地方法loadDex,传递DEX文件的字节数组和字节大小;
步骤4,重写类加载器加载指定的类。
更进一步的技术方案是,所述步骤1中是在java层调用本地方法对DEX文件进行解密解压。
更进一步的技术方案是,所述步骤2具体包括:
步骤2.1,采用dlopen函数打开动态链接库libdvm.so,返回一个句柄和符号;
步骤2.2,采用dlsym函数根据步骤2.1中返回的句柄和符号,拿到动态链接库libdvm.so中内存加载DEX文件;
步骤2.3,调用native方法,得到并保存返回的cookie值。
更进一步的技术方案是,所述步骤2.2得到的native方法位于源码:
dalvik/vm/native/dalvik_system_DexFile.cpp类中,方法名称是Dalvik_dalvik_system_DexFile_openDexFile_bytearray。
更进一步的技术方案是,所述步骤3还包括定义一个Common.h类,所述Common.h类用于定义本地方法中用到的各个变量类型。
更进一步的技术方案是,所述步骤4采用重写类加载器的findClass方法,具体包括:
步骤4.1,采用反射调用DexFile的getClassNameList方法,传递步骤2中的cookie值得到DEX文件中的所有类;
步骤4.2,采用反射调用defineClass方法获取Class对象。
更进一步的技术方案是,所述步骤4中直接调用父类加载器的loadClass方法返回一个Class对象。
本技术方案在native层对加密压缩的DEX文件进行解密解压缩,并重写了内存直接加载DEX文件的字节码的方法,在该方法中对解密的DEX文件字节码进行解析,从而得到存储DEX文件信息的DexOrJar结构体指针,并将解析后的DexOrJar类型对象的指针添加到gDvm.userDexFiles的HashTable中,直接加载到系统gDvm中。本发明对加密DEX文件信息的解密,传输,保存,加载等过程都是以字节码的形式在内存中进行的,绕过了dexopt的过程并且避免了新建DexClassLoader的耗时操作,在极大程度的提高DEX文件加载安全性的同时提高了应用启动速度。
与现有技术相比,本发明的有益效果是:
1,本发明在读取加密压缩DEX文件后,便一直在内存中利用字节码的形式进行DEX文件的解密解压、存储和加载,极大程度的保护了DEX文件,提高了加固后APK的抗攻击性。
2,本发明利用反射重写了底层加载DEX文件字节码的方法,绕过了dalvik系统加载时dexopt的过程并且避免了一次新建DexClassLoader的耗时操作,使得该方法可以提升应用的启动效率。
附图说明
图1为本发明一种实施例基于内存加载的dalvik字节码优化方法的流程图。
图2为本发明一种实施例基于内存加载的dalvik字节码优化方法中DEX文件在内存中的传输流程。
具体实施方式
下面结合附图对本发明作进一步阐述。
基于内存加载的dalvik字节码优化方法,它包括以下步骤:
步骤1,读取加密的DEX文件进行解密解压后,并将解密解压后的DEX文件以字节码的形式保存到栈内存中;
步骤1中是在java层调用本地方法对DEX文件进行解密解压。
步骤2,采用反射调用DexFile的openDexFile方法,解析步骤1中的DEX文件字节码得到一个DexOrJar结构体,将DexOrJar结构体的内容加载到gDvm中的userDexFile结构的hash表中,最后返回存储DEX文件信息的DexOrJar结构体指针,记为cookie值;
步骤2中得到的cookie值就是对应加载dex的值,后续可使用这个cookie值访问这个DEX文件附属的所有对象,步骤2中DexFile包含两个openDexFile方法,一个参数变量为文件路径,一个为文件字节码,同时这两个方法都是native层函数,作用是解析dex文件。本发明调用的是参数为字节码的openDexFile方法。达到了在native层利用字节码的形式对dex文件进行传输加载的目的,有效的提高了加载过程的安全性;
步骤2中调用的opneDexFIle方法所对应的native方法并没有被虚拟机导出,所以需要利用反射获得该native方法,具体步骤如下:
步骤2.1,采用dlopen函数打开动态链接库libdvm.so,返回一个句柄和符号;
步骤2.2,采用dlsym函数根据步骤2.1中返回的句柄和符号,拿到动态链接库libdvm.so中内存加载DEX文件;步骤2.2得到的native方法位于源码:
dalvik/vm/native/dalvik_system_DexFile.cpp类中,方法名称是Dalvik_dalvik_system_DexFile_openDexFile_bytearray
步骤2.3,调用native方法,得到并保存返回的cookie值。
步骤3,定义本地方法loadDex,传递DEX文件的字节数组和字节大小;
步骤3还包括定义一个Common.h类,所述Common.h类用于定义本地方法中用到的各个变量类型。
步骤4,重写类加载器加载指定的类;所述步骤4采用重写类加载器的findClass方法,具体包括:
步骤4.1,采用反射调用DexFile的getClassNameList方法,传递步骤2中的cookie值得到DEX文件中的所有类;
步骤4.2,采用反射调用defineClass方法获取Class对象。
调用类加载器的loadClass方法,加载指定的类。
根据本发明的一个实施例,步骤1中对DEX文件解密解压缩方式为任意已知的解密方式。
以上具体实施方式对本发明的实质进行详细说明,但并不能对本发明的保护范围进行限制,显而易见地,在本发明的启示下,本技术领域普通技术人员还可以进行许多改进和修饰,需要注意的是,这些改进和修饰都落在本发明的权利要求保护范围之内。
Claims (5)
1.一种基于内存加载的dalvik字节码优化方法,其特征在于,它包括以下步骤:
步骤1,在java层调用本地方法读取加密的DEX文件进行解密解压,并将解密解压后的DEX文件以字节码的形式保存到栈内存中;
步骤2,采用反射调用DexFile的openDexFile方法,解析步骤1中的DEX文件字节码得到一个DexOrJar结构体,将DexOrJar结构体的内容加载到gDvm中的userDexFile结构的hash表中,最后返回存储DEX文件信息的DexOrJar结构体指针,记为cookie值;
所述步骤2具体包括:
步骤2.1,采用dlopen函数打开动态链接库libdvm.so,返回一个句柄和符号;
步骤2.2,采用dlsym函数根据步骤2.1中返回的句柄和符号,拿到动态链接库libdvm.so中内存加载DEX文件;
步骤2.3,调用native方法,得到并保存返回的cookie值;
步骤3,定义本地方法loadDex,传递DEX文件的字节数组和字节大小;
步骤4,重写类加载器加载指定的类。
2.根据权利要求1所述的基于内存加载的dalvik字节码优化方法,其特征在于,所述步骤2.2得到的native方法位于源码:dalvik/vm/native/dalvik_system_DexFile.cpp类中,方法名称是Dalvik_dalvik_system_DexFile_openDexFile_bytearray。
3.根据权利要求1所述的基于内存加载的dalvik字节码优化方法,其特征在于,所述步骤3还包括定义一个Common.h类,所述Common.h类用于定义本地方法中用到的各个变量类型。
4.根据权利要求1所述的基于内存加载的dalvik字节码优化方法,其特征在于,所述步骤4采用重写类加载器的findClass方法,具体包括:
步骤4.1,采用反射调用DexFile的getClassNameList方法,传递步骤2中的cookie值得到DEX文件中的所有类;
步骤4.2,采用反射调用defineClass方法获取Class对象。
5.根据权利要求1所述的基于内存加载的dalvik字节码优化方法,其特征在于,所述步骤4中直接调用父类加载器的loadClass方法返回一个Class对象。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611080987.8A CN106775843B (zh) | 2016-11-30 | 2016-11-30 | 基于内存加载的dalvik字节码优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611080987.8A CN106775843B (zh) | 2016-11-30 | 2016-11-30 | 基于内存加载的dalvik字节码优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106775843A CN106775843A (zh) | 2017-05-31 |
CN106775843B true CN106775843B (zh) | 2020-04-28 |
Family
ID=58898149
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611080987.8A Active CN106775843B (zh) | 2016-11-30 | 2016-11-30 | 基于内存加载的dalvik字节码优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106775843B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109214184B (zh) * | 2018-07-20 | 2021-08-20 | 北京大学 | 一种Android加固应用程序通用自动化脱壳方法和装置 |
CN112445487A (zh) * | 2019-09-02 | 2021-03-05 | 深圳Tcl新技术有限公司 | 一种dex优化方法、系统、智能终端及存储介质 |
CN111240766B (zh) * | 2020-01-22 | 2023-12-29 | 抖音视界有限公司 | 应用启动方法、装置、电子设备及计算机可读存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8892876B1 (en) * | 2012-04-20 | 2014-11-18 | Trend Micro Incorporated | Secured application package files for mobile computing devices |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104850423B (zh) * | 2015-01-16 | 2017-12-26 | 中国矿业大学 | 识别android系统下应用程序启动阶段的方法 |
CN105574411B (zh) * | 2015-12-25 | 2018-12-28 | 北京奇虎科技有限公司 | 一种动态脱壳方法、装置和设备 |
-
2016
- 2016-11-30 CN CN201611080987.8A patent/CN106775843B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8892876B1 (en) * | 2012-04-20 | 2014-11-18 | Trend Micro Incorporated | Secured application package files for mobile computing devices |
Also Published As
Publication number | Publication date |
---|---|
CN106775843A (zh) | 2017-05-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106203120B (zh) | 一种针对Android加固应用的多点Hook逆向方法 | |
KR101471589B1 (ko) | 공통중간언어 기반 프로그램을 위한 보안 제공 방법 | |
CN107480029B (zh) | 一种函数调用时间的监控方法及装置 | |
CN108491235B (zh) | 结合动态加载和函数Native化的DEX保护方法 | |
CN105303072B (zh) | 基于art模式的软件加固方法及装置 | |
CN107273723B (zh) | 一种基于so文件加壳的Android平台应用软件保护方法 | |
CN108229148B (zh) | 一种基于Android虚拟机的沙箱脱壳方法及系统 | |
WO2015192637A1 (zh) | 软件安装包的加固保护方法和装置 | |
CN106775843B (zh) | 基于内存加载的dalvik字节码优化方法 | |
CN105574411A (zh) | 一种动态脱壳方法、装置和设备 | |
US8434073B1 (en) | Systems and methods for preventing exploitation of byte sequences that violate compiler-generated alignment | |
CN109062582A (zh) | 一种应用安装包的加密方法及装置 | |
CN106650330A (zh) | 一种基于Dex加载器的Android应用软件加固保护方法 | |
CN109598107A (zh) | 一种基于应用安装包文件的代码转换方法及装置 | |
CN109255235B (zh) | 基于用户态沙箱的移动应用第三方库隔离方法 | |
CN104318160A (zh) | 查杀恶意程序的方法和装置 | |
CN105989252A (zh) | 一种针对函数级别加壳的脱壳方法及系统 | |
CN108134673A (zh) | 一种生成白盒库文件的方法及装置 | |
WO2022078366A1 (zh) | 应用保护方法、装置、设备及介质 | |
CN108985096B (zh) | 一种Android SQLite数据库安全增强、安全操作方法以及装置 | |
CN104915594A (zh) | 应用程序运行方法及装置 | |
US20240061933A1 (en) | Systems and methods for causing nonpredictable environment states for exploit prevention and malicious code neutralization for javascript-enabled applications | |
KR101557455B1 (ko) | 응용 프로그램 코드 분석 장치 및 그것을 이용한 코드 분석 방법 | |
CN110119601A (zh) | 基于应用程序安装包的程序加固方法及装置 | |
CN113893550A (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 |