好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 Mr白白小武 于 2017-3-17 15:22 编辑
前提
首先思路参考了MultiDex,代码参考了某某早期加固。
总览
Davlikvm
Davlik 内存加载技术比较成熟,网上资料也比较多
采用最简单的方法:
实现下面这个系统方法:具体代码就不贴出来了
[C++] 纯文本查看 复制代码 Dalvik_dalvik_system_DexFile_openDexFile_bytearray(const u4* args,JValue* pResult)
在这个过程中需要注意如何拿到gDvm.userDexFiles这个指针 :
解决方法:
[C++] 纯文本查看 复制代码 void dvmInternalNativeShutdown()
{
dvmHashTableFree(gDvm.userDexFiles);
}
Hook dvmHashTableFree方法然后调用dvmInternalNativeShutdown方法,通过dvmHashTableFree参数拿到指针(方法来自看雪论坛)通过这种方法可以实现简单的内存加载和对dex加密,具体实现方法可以参考代码
Art
art 内存加载技术网上资料不多,也没实现完整的。思路参考某某加固的早期代码。这样兼容性可能好一点。
首先是通过反射调用DexFiel.loadDex方法
[Asm] 纯文本查看 复制代码 static public DexFile loadDex(String sourcePathName, String outputPathName,
int flags) throws IOException
在调用loadDex之前hook下面这些方法
[C++] 纯文本查看 复制代码 [/size][/font][/color]
[color=#000][font=Helvetica, "][size=15px]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
|
免费评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 学习及教程|主题: 1131, 订阅: 1124
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|