Android动态加载oat文件总结一

来源:互联网 发布:linux运维培训 编辑:程序博客网 时间:2024/06/05 00:12

    Andriod的Dalvik时代已经过去,Art时代的到来,引发了一些列的变化,或许在开发者的眼里,没有任何的改变,概念上的一些解释也只是入耳即过,但是作为学习安全的一名菜鸟级人物,虽说没有大牛们的高瞻远瞩,但是也略有自己的一点看法与总结。

    早在Dalvik上就有动态加载这么回事,当然到了Art时代,动态加载依旧存在,好了,现在开始开门见山地来说说吧!

    Dalvik上地动态加载机制是说动态加载一个apk,zip或dex文件进内存,然后开始解析dex文件到一个数据结构中,最后Dalvik会边解释边执行Dex文件中的每一条smali指令;

然而在Art时代时,却发生了质的改变,早在apk进行安装的时候,Android系统就将apk中的dex文件编译成了集dex内容和arm指令于一身的oat文件,这样当开始运行软件的时候,就可以直接运行arm指令,而这时候art虚拟机只是充当了一个索引一样,从dex中找寻和arm相关的映射,于是就舍去了原来的"大无畏”的解释的职责,那么可想而知,软件的运行效率自然上升了,同样会说编译的时候做了牺牲,但这点牺牲应当是在用户能够接受的范围内的!那么,说到这里,动态加载载art时代究竟是怎样的?

    大家可以想像,当你开发一款产品时,如果你时开发者,那么你写的一段代码中动态加载的文件,会是什么文件?毫无疑问,还是dex文件或apk,zip等格式的压缩文件,对,那么这时候就有一个文件,既然apk里面的dex主文件已经被翻译成了oat文件,那么这里动态加载的这个dex文件会被变成oat吗?如果你能想到这一点,那么接下来的答案就是:YES!是的,正如你们的预期,在源代码中也存在相应的证据(我看的源代码是5.0的,不知道和大家有没有出入),当动态加载一个dex文件时,Android系统会自发地先将其翻译成oat文件,然后在执行,此时你应该对dalvik时代和art时代地动态加载地一些细节有了一些了解(更多地,当然是要看源码地)。

    上述这些都是个人看了很多博客,资料来总结地一些想法,接下来,会记录下一些在项目过程中地一些知识点,我主要是研究安全,所以仿照之前一些成熟地加壳方案,在这里,我想做这么一件事情,就是在上面动态加载地基础上来改进一点,我能不能直接加载一个oat文件,而不是dex文件,这样在运行的时候就不用在经历编译这个过程,而且也在内存中多了一点保密性,因为oat文件中带有了很多的arm指令,arm指令相对于smali指令来说分析的难度要大的多,那么这样的话,对于那些逆向人员来说,难度就成倍的增加了(对于了解安全的,请对小生的这点愚见提出批评与建议,对于不了解安全的,希望对android这方面给予多多的指导与帮助)。


知识点总结:

1. 今天在mac搭建jni的时候,发现跟往常的linux和windows下eclipse的用法不同,所以稍微耗费了点时间,配置NDK,这里提供如下大牛写的一篇博客,对大家有帮助

http://blog.csdn.net/zengyangtech/article/details/7019350。

2. 当配好环境过后,发现仍然有些莫名的问题,就是在c文件里面的一些jni关键字上总有下划红线报错,

如上图所示,提示说这些类型无法被解析,后来找到解决方案:

主要是没有倒入ndk库中的一些库文件,导入就好了。


3.当解决了以上两个问题,又有了一个新鲜问题,就是:

虽然找到了解决方案,但是仍然不太理解,还请明白的人及时告知,小生不胜感激,

这里当我选中Generate makefiles automatically,但是Builder Type还是不可选的,但是项目编译可以通过了,这里也不太明白。


4.解决了以上问题过后,我就开始着手写代码了,代码正在续写过程中,相关问题等写完会做记录,暂时先写到这里,谢谢



0 0
原创粉丝点击