使用 libdvm.so 内部函数dvm* 加载 dex

简介:

首先要清楚,odex只是对代码段(我将dex文件与elf文件类比,大家都将执行文件分成不同的段)作优化,而其它用于类反射信息的段都应用原来的dex,所以odex文件内部还包含了一个dex。

打开一个dex或一个odex文件,就是要将其中用于类反射的信息加载到虚拟机运行时中。对于打开一个odex文件,目的也是要将其中包含的dex部分的信息进行加载。

 

dalvik(libdvm.so)打开dex文件,实质就是要将dex里的反射信息加载到一个DexFile组织的结构体。这个结构有一个查找表,DexClassLookup。这个结构不直接被 libdvm.so 使用,而是由一个上层的DvmDex代替,为libdvm.so其它函数调用使用。但这个DvmDex不被JNI层,也就是libdvm.so最接近java的一层所直接使用,这里有一个DexOrJar结构体关联DvmDex,DexOrJar为最上层可寻找到的对象,并且插入到hash表中。

DexOrJar,JNI 层

DvmDex,libdvm 内部函数

DexFile,最后的执行委托处

 

对于dalvik.system.DexFile.openDexFile,它的native实现Dalvik_dalvik_system_DexFile_openDexFile的工作,就是调用libdvm内部相关的函数完成,从dex文件加载进DexFile,分配DvmDex关联DexFile,最后用一个DexOrJar关联DvmDex,并将DexOrJar放入hash表中。

 

我们c/c++则可以直接绕开java层或jni,直接去调用libdvm.so的内部函数去进行打开,以及打开后的使用。这些内部函数使用的是DvmDex。

在内部支持的打开函数里面,最上层的是dvmRawDexFileOpen,也就是Dalvik_dalvik_system_DexFile_openDexFile直接调用的内部函数。这个函数完成了比较多的事,如创建odex,优化dex进odex,然后才是实质上的打开。

实质上去打开dex的内部函数分别有dvmDexFileOpenFromFd以及dvmDexFileOpenPartial。dvmDexFileOpenFromFd的参数是odex的文件描述符,dvmDexFileOpenPartial的参数是odex或dex的映像。这两个函数都会返回DvmDex。并且最终使用dexFileParse实质地将dex的反射内容加载进DexFile。

dvmRawDexFileOpen,最上层的内部打开函数

dvmDexFileOpenPartial和dvmDexFileOpenFromFd,返回DvmDex,可用于其它内部函数调用

dexFileParse,最低端,也就是最实质的打开函数

 

使用dvmDefineClass就可是直接将类从Dex加载到ClassLoader,并不需要经过Java层或Jni来进行类的加载。

在libdvm.so只有少数几个函数是用extern "C"风格的链接符号导出的,dalvik却是c++项目,也就是说其它符号都使用了c++的风格,所以你并不能直接通过直观的函数名来进行函数符号的获取,而必须使用它对应的c++风格的真实链接符号。

下面是我将python移植后使用的pyjni.py,使用ctypes获取符号将名字做映射。这些符号可以通过objdump取得。






      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1932726,如需转载请自行联系原作者



相关文章
|
6月前
|
Linux Go API
MemoryModule内存反射DLL加载探索
MemoryModule内存反射DLL加载探索
|
9月前
|
C++ Windows
C++ --- Dll文件的生成与调用(二)之动态库注入技术
C++ --- Dll文件的生成与调用(二)之动态库注入技术
107 0
|
7月前
|
机器学习/深度学习 Python
加载变量
在机器学习中,加载变量通常指从数据集中提取特征变量和目标变量,以便在后续建模和训练过程中使用。特征变量是描述数据样本的属性或特征,而目标变量则是用于评估模型性能的变量。 以下是一个简单的示例,说明如何在 Python 中加载变量:
86 1
|
10月前
|
Java
有几种方式获取字节码文件对象?
有几种方式获取字节码文件对象?
84 0
|
缓存 安全 Java
JNI之缓存与引用
NDK连载系列
48 0
|
JavaScript Java Android开发
dex加载后导入类报错
牙叔教程 简单易懂
263 0
|
Java Android开发
【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )
【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )
182 0
|
安全 Java Android开发
【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )
【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )
207 0
动态加载Dll时,通过Type生成类对象
原文:动态加载Dll时,通过Type生成类对象 转:http://www.cnblogs.com/zfanlong1314/p/4197383.html “反射”其实就是利用程序集的元数据信息。
914 0