android动态加载dex支持art
本帖最后由 Mr白白小武 于 2017-3-17 15:22 编辑前提
首先思路参考了MultiDex,代码参考了某某早期加固。
总览
Davlikvm
Davlik 内存加载技术比较成熟,网上资料也比较多
采用最简单的方法:
实现下面这个系统方法:具体代码就不贴出来了
Dalvik_dalvik_system_DexFile_openDexFile_bytearray(const u4* args,JValue* pResult)
在这个过程中需要注意如何拿到gDvm.userDexFiles这个指针 :
解决方法:
void dvmInternalNativeShutdown()
{
dvmHashTableFree(gDvm.userDexFiles);
}
Hook dvmHashTableFree方法然后调用dvmInternalNativeShutdown方法,通过dvmHashTableFree参数拿到指针(方法来自看雪论坛)通过这种方法可以实现简单的内存加载和对dex加密,具体实现方法可以参考代码
Art
art 内存加载技术网上资料不多,也没实现完整的。思路参考某某加固的早期代码。这样兼容性可能好一点。
首先是通过反射调用DexFiel.loadDex方法
static public DexFile loadDex(String sourcePathName, String outputPathName,
int flags) throws IOException
在调用loadDex之前hook下面这些方法
Hook::hookMethod(arthandle, "open", (void*)artmyopen, (void**)(&artoldopen));
Hook::hookMethod(arthandle, "read", (void*)artmyread, (void**)(&artoldread));
Hook::hookMethod(arthandle, "munmap", (void*)artmymunmap, (void**)(&artoldmunmap));
Hook::hookMethod(arthandle, "mmap", (void*)artmymmap, (void**)(&artoldmmap));
Hook::hookMethod(arthandle, "fstat", (void*)artmyfstat, (void**)(&artoldfstat));
Hook::hookMethod(arthandle, "fork", (void*)artmyfork, (void**)(&artoldfork));
Hook::hookMethod(arthandle, "execv", (void*)artmyexecv, (void**)(&artoldexecv));
在文件读取过程中做一些小动作,就可以实现dex文件简单的加密。这样也可以实现dex"不落地加载"。可能这种方法不太完美,但是相对来说可能稳定一点。兼容性也相对好一点。
使用方法:
目前集成工具暂时没做好。
demo:
给出一个测试demo:http://pan.baidu.com/s/1bpmtsUN
有任何问题可以私信我。也可以在github上提交崩溃日志
小结:
上面描述比较简单。整个过程还是比较复杂的,并且涉及到art dex2oat,代码有一定的参考价值。
工作量也是蛮大的。测试了4.4 、6.0、7.1 系统,其他机型没测试
代码稍后整理将会开源:https://github.com/xiaobaiyey/dexload
http://p1.bpimg.com/567571/9343e0fa70f18721.gif 7.1的内存加载(直接从byte字节数据加载,自构造内存DexFile后,还是过不了defineclassNative这一关,总是报错
Check failed: dex_cache_location == dex_file_suffix (dex_cache_location=ςက, dex_file_suffix=�@,�) '
A/DEBUG: r0 00000000r1 000050e6r2 00000006r3 00000008
A/DEBUG: r4 d3168978r5 00000006r6 d3168920r7 0000010c
A/DEBUG: r8 ece9790fr9 d3d37a00sl 0000000afp d3d37a00
A/DEBUG: ip 0000000bsp d3166d28lr eecd0507pc eecd2d88cpsr 200f0010
A/DEBUG: backtrace:
A/DEBUG: #00 pc 00049d88/system/lib/libc.so (tgkill+12)
A/DEBUG: #01 pc 00047503/system/lib/libc.so (pthread_kill+34)
A/DEBUG: #02 pc 0001d755/system/lib/libc.so (raise+10)
A/DEBUG: #03 pc 00019291/system/lib/libc.so (__libc_android_abort+34)
A/DEBUG: #04 pc 000172f8/system/lib/libc.so (abort+4)
A/DEBUG: #05 pc 0031a669/system/lib/libart.so (_ZN3art7Runtime5AbortEPKc+328)
A/DEBUG: #06 pc 000b5205/system/lib/libart.so (_ZN3art10LogMessageD2Ev+1132)
A/DEBUG: #07 pc 000dedb7/system/lib/libart.so (_ZN3art11ClassLinker21RegisterDexFileLockedERKNS_7DexFileENS_6HandleINS_6mirror8DexCacheEEE+1294)
A/DEBUG: #08 pc 000e6683/system/lib/libart.so (_ZN3art11ClassLinker15RegisterDexFileERKNS_7DexFileEPNS_6mirror11ClassLoaderE+362)
A/DEBUG: #09 pc 002a3337/system/lib/libart.so (_ZN3artL25DexFile_defineClassNativeEP7_JNIEnvP7_jclassP8_jstringP8_jobjectS7_S7_+230)
A/DEBUG: #10 pc 005d93a7/system/framework/arm/boot-core-libart.oat (offset 0x47e000) (dalvik.system.DexFile.defineClassNative+170) 精品帖当然要抢楼了 虽然现在看不懂,但以后会懂的 谢谢楼主的分享 果然精品 不懂,但感谢分享 谢谢分享 不错,感谢分享 感谢发布原创作品,吾爱破解论坛因你更精彩!