-
-
[转帖]http://bbs.csdn.net/topics/391025632
-
发表于:
2016-8-31 17:53
3793
-
[转帖]http://bbs.csdn.net/topics/391025632
在Android 4中,可以使用libdvm.so中提供的Dalvik_dalvik_system_DexFile_openDexFile_bytearray函数实现内存中动态加载解密后的dex文件。但是在ART中就没有这样的函数了,查看了ART中关于动态加载的代码,主要就是将dex文件转成oat文件,然后再加载到内存中,其中有一步就是要将加载的oat文件,放到ClassLinker类的一个oat文件列表中,就是这个注册函数,其他过程其实都是按照它的代码来实现,但是如何加载到这个列表中,我就不知道怎么弄了。
const OatFile* ClassLinker::RegisterOatFile(const OatFile* oat_file) {
WriterMutexLock mu(Thread::Current(), dex_lock_);
if (kIsDebugBuild) {
for (size_t i = 0; i < oat_files_.size(); ++i) {
CHECK_NE(oat_file, oat_files_[i]) << oat_file->GetLocation();
}
}
VLOG(class_linker) << "Registering " << oat_file->GetLocation();
oat_files_.push_back(oat_file);
return oat_file;
}
这段代码android5的源码中:art/runtime/class_linker.cc中,ART中给java层提供的动态加载函数,实际就是这个函数:DexFile_openDexFileNative,在art/runtime/native/dalvik_system_DexFile.cc中。跟踪这个函数,就可以大致了解art下动态加载dex文件的过程。
请教下各位大侠,android5中,如果我要实现内存中动态加载dex文件,要怎么完成上面提到的注册过程。还有没有更好的dex加固方法?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课