Android逆向工程-基础概念:Arm、Art、Dalvik、Smali、dex、NDK、JNI之间的关系

mac2024-03-20  27

Android逆向工程-基础概念:Arm、Art、Dalvik、Smali、dex、NDK、JNI之间的关系

        接触逆向以来遇到过Smali、dex几个概念,接触脱壳的时候又遇到ART、Dalvik、的概念,.so文件逆向的时候接触到Arm汇编、NDK、JNI的概念,今天简单梳理下这几者的关系。

一、Dalvik虚拟机

        安卓(Android)是google收购的自由及开放源代码的操作系统,运行于Linux kernel之上。谷歌为了降低应用的开发难度,在Linux底层之上构筑了一个名为“Dalvik”的虚拟机。Dex文件是Dalvik Executable file,是Dalvik虚拟机上的可执行程序。Smali则是Dex文件运行在Dalvik虚拟机上的汇编语言。

二、NDK与JNI

        NDK(Native Development Kit,原生开发工具包)是一组可以让开发人员在Android应用中调用C和c++代码的工具集。而JNI是一种Java字节码调用C/C++的解决方案,JNI描述的是一种技术。

        JNI技术调用的C/C++代码会被编译成动态链接库(.so)文件,.so文件的文件格式是ELF,也就是linux下的可执行文件。.so文件可以采用多种架构,包括x86、arm等,ARM架构的文件逆向会需要ARM汇编知识。我们直接解压.apk看到lib文件夹下的x86、armeabi文件夹就是不同架构的.so文件,他们通过JNI技术被Android程序的dex文件调用。

三、运行模式

 

        Dalvik虚拟机的传统运行模式是Dalvik模式,Dalvik模式每次执行应用的时候Dalvik虚拟机都会将程序的语言由高级语言编译为机器语言。Dalvik模式从Android5.0开始被弃用。

        Dalvik虚拟机的优化运行模式是Art模式(Android RunTime模式),“谷歌的这次优化源于前不久其收购的一家名为Flexycore的公司,该公司一直致力于Android系统的优化,而ART模式也是在该公司的优化方案上演进而来”(百度百科)。ART模式由于高效、快速,被Android系统使用至今。

        ART模式与Dalvik模式最大的不同在于,在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。

        此外,ART模式中的dex加载函数与Dalvik模式有很大的不同,例如Dalvik模式下的dvmDexFileOpenPartial、Art模式下的openMemory,某些脱壳机往往要根据运行模式的不同,编写不同的脱壳程序。

 

 

以上概念均是个人理解,如果发现有错,欢迎留言交流。

参考:

https://www.cnblogs.com/LoongEmbedded

https://www.cnblogs.com/carlo/p/4947796.html

http://blog.sina.com.cn/s/blog_d9ec461b0102x1rl.html

https://www.jianshu.com/p/40908a016480

最新回复(0)