CN106775843B - 基于内存加载的dalvik字节码优化方法 - Google Patents

基于内存加载的dalvik字节码优化方法 Download PDF

Info

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
Application number
CN201611080987.8A
Other languages
English (en)
Other versions
CN106775843A (zh
Inventor
翟栋
谭源泉
康红娟
邓密密
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sichuan Changhong Electric Co Ltd
Original Assignee
Sichuan Changhong Electric Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Sichuan Changhong Electric Co Ltd filed Critical Sichuan Changhong Electric Co Ltd
Priority to CN201611080987.8A priority Critical patent/CN106775843B/zh
Publication of CN106775843A publication Critical patent/CN106775843A/zh
Application granted granted Critical
Publication of CN106775843B publication Critical patent/CN106775843B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

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字节码优化方法
技术领域
本发明涉及移动终端应用安全领域,具体涉及基于内存加载的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对象。
CN201611080987.8A 2016-11-30 2016-11-30 基于内存加载的dalvik字节码优化方法 Active CN106775843B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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 北京奇虎科技有限公司 一种动态脱壳方法、装置和设备

Patent Citations (1)

* Cited by examiner, † Cited by third party
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