基于内存加载的dalvik字节码优化方法技术

技术编号:15540982 阅读:107 留言:0更新日期:2017-06-05 10:36
本发明专利技术公开了一种基于内存加载的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的抗攻击性。

Dalvik bytecode optimization method based on memory loading

The invention discloses a memory loaded Dalvik byte code optimization based method, which comprises the following steps: 1, read to decrypt the encrypted DEX file after decompression, and extract the DEX file to decrypt the byte code stored to the stack memory; step 2, the openDexFile method uses reflection to call DexFile in step 1, parsing DEX file byte code to get a DexOrJar structure, the DexOrJar structure of the content is loaded into the userDexFile structure in gDvm hash table, DexOrJar structure pointer and finally return to store the DEX file information, denoted as cookie; step 3, the definition of local loadDex method, DEX file transfer byte array and byte size; step 4, rewrite the class loader loads the specified class, the invention in the read encrypted compressed DEX files, has been in memory using byte code form DEX file decryption, decompression, storage and loading, to a great extent protect the DEX file, and enhance the anti attack of APK after reinforcement.

【技术实现步骤摘要】
基于内存加载的dalvik字节码优化方法
本专利技术涉及移动终端应用安全领域,具体涉及基于内存加载的dalvik字节码优化方法。
技术介绍
据最新智能终端销量统计,中国的Android系统目前已占据移动端73%以上的市场份额,各种Android应用程序也在成级数式增长且涉及的业务越来越广,涵盖娱乐、支付、生活等各个领域。由于android平台软件使用的语言是JAVA,而JAVA源代码编译后的二进制代码极易被反编译,导致android应用程序易被黑客通过二次打包、篡改、恶意注入等手段进行恶意破坏。因此应用安全问题已经成为开发者/发布者/使用者关注的热点。目前市场上比较主流的应用软件加固措施可分为加壳和脱壳两个过程。其中,加壳技术主要是通过用一个新的classes.dex文件替换掉APP中的核心代码文件,将原dex文件通过加密技术处理,生成加密文件另行存储,最后修改应用配置文件,并加入对应解密算法库,形成加固后的APP安装包。加壳后APK中的dex文件便是壳dex。该方法可防止破解者还原真实代码逻辑。脱壳技术则是指程序在运行过程中将原APK的dex文件解密出来并加载到内存中,让该APK正常运行起来。APK的脱壳过程需要利用壳dex来完成。现有的脱壳方法多是通过AndroidAPI提供的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,返回一个句柄和符号;本文档来自技高网
...
基于内存加载的dalvik字节码优化方法

【技术保护点】
一种基于内存加载的dalvik字节码优化方法,其特征在于,它包括以下步骤:步骤1,读取加密的DEX文件进行解密解压,并将解密解压后的DEX文件以字节码的形式保存到栈内存中;步骤2,采用反射调用DexFile的openDexFile方法,解析步骤1中的DEX文件字节码得到一个DexOrJar结构体,将DexOrJar结构体的内容加载到gDvm中的userDexFile结构的hash表中,最后返回存储DEX文件信息的DexOrJar结构体指针,记为cookie值;步骤3,定义本地方法loadDex,传递DEX文件的字节数组和字节大小;步骤4,重写类加载器加载指定的类。

【技术特征摘要】
1.一种基于内存加载的dalvik字节码优化方法,其特征在于,它包括以下步骤:步骤1,读取加密的DEX文件进行解密解压,并将解密解压后的DEX文件以字节码的形式保存到栈内存中;步骤2,采用反射调用DexFile的openDexFile方法,解析步骤1中的DEX文件字节码得到一个DexOrJar结构体,将DexOrJar结构体的内容加载到gDvm中的userDexFile结构的hash表中,最后返回存储DEX文件信息的DexOrJar结构体指针,记为cookie值;步骤3,定义本地方法loadDex,传递DEX文件的字节数组和字节大小;步骤4,重写类加载器加载指定的类。2.根据权利要求1所述的基于内存加载的dalvik字节码优化方法,其特征在于,所述步骤1中是在java层调用本地方法对DEX文件进行解密解压。3.根据权利要求1所述的基于内存加载的dalvik字节码优化方法,其特征在于,所述步骤2具体包括:步骤2.1,采用dlopen函数打开动态链接库libdvm.so,返回一个句柄和符号;步骤2.2,采用dlsym函数根据步骤2.1中返回的句柄和符号,拿到动态链接库libdvm.so中内存加载DEX文件;步骤2.3,调用nativ...

【专利技术属性】
技术研发人员:翟栋谭源泉康红娟邓密密
申请(专利权)人:四川长虹电器股份有限公司
类型:发明
国别省市:四川,51

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

1