安卓逆向学习——Dalvik虚拟机与Smali代码

首先我们要清楚JAVA虚拟机和Dalvik虚拟机的关系,我们想要我们的android程序运行在Dalvik虚拟机上首先需要选择一种语言执行的环境,Android开发目前最多用的就是JAVA语言,凯特琳语言也在飞速发展,也许以后可能就要取代Java在安卓开发的地位。JAVA代码想要运行在Java虚拟机上首先要编译成Class文件,Java虚拟机才可以识别程序命令运行程序。想要在Dalvik虚拟机上运行,还需要将Java虚拟机内的代码提取出来转换成Dalvik所能识别的机器指令并进行打包成Dex文件,所以需要进一步将Class文件转换成Dex文件,才能运行在Dalvik上。这种Dalvik可以识别的字节码符号就是Smali代码。
Dex文件相比Class文件更小,因为Dalvik虚拟机的文件结构已经被谷歌公司所优化过,Java虚拟机运行是依赖栈结构的,而Dalvik虚拟机是基于寄存器传递的。(栈的存储介质是内存肯定不如直接相连于CPU上的寄存器快了)
在这里插入图片描述
有趣的是,虽然它们都是依赖于虚拟机的语言,但是它们并没有进行编译成可执行程序,它们编译后的代码更类似于脚本语言。(脚本语言都是依赖对应的一个调用脚本语言的解释器,我们实际上写的脚本都只是符号,不可以直接运行,需要这些解释器进行解析,将这些符号替换成解释器里早就设置好的各种调用接口,通过这些调用接口进一步进行系统调用,才能看到我们想要的执行效果)解释一步就执行一步,所以调试起来比正常的EXE困难。而JAVA语言就更加有趣,他不同于脚本的是需要首先将代码编译成虚拟机可以识别的字节码符号,然后虚拟机通过编译后的符号进行解释,这种介于编译和解释之间的操作还是很有趣的。
下图是整个安卓程序的运行框架。
在这里插入图片描述

发布了30 篇原创文章 · 获赞 5 · 访问量 1914

猜你喜欢

转载自blog.csdn.net/AlexSmoker/article/details/104493070