首页
社区
课程
招聘
[求助]Android ART 模式下 DEX 内存加载
发表于: 2016-10-8 10:00 14276

[求助]Android ART 模式下 DEX 内存加载

2016-10-8 10:00
14276
目前在实现 ART 模式下 DEX 内存加载,参照 http://bbs.pediy.com/showthread.php?t=205577 实现,

在 Android 5.0.1 版本hook openDexFileNative,直接通过 DexFile::OpenMemory 获得 cookie 并返回,成功在内存加载DEX。

在 三星 5.1.1 系统中同样 hook openDexFileNative,直接通过 DexFile::OpenMemory 可以获得cookie并返回,但系统在加载java类的时候如下错误:

art/runtime/class_linker.cc:3112] Check failed: ConvertPathForAndroidRoot(dex_cache->GetLocation()->ToModifiedUtf8().c_str()) == ConvertPathForAndroidRoot(dex_file.GetLocation().c_str()),

求助如何解决这个问题,是不是哪里出错了?代码已经放在 https://github.com/aa3000/TestShell

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 7
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这日志已经说的很清楚了,文件路径错误(dex_cache != dex_file),后面是检查路径的那一行代码。话说你都能hook了 也顺便把检查路径的那行代码也hook了不就行了
2016-10-19 12:13
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
jmethodID mtd_mark = env->GetStaticMethodID(javaClass, "nativeMark", "()V");
    if (!mtd_mark)
        return -1;

    size_t startAddress = (size_t) mtd_mark;
    size_t targetAddress = (size_t) mark;

    void* art_work_around_app_jni_bugs = ptr_art_work_around_app_jni_bugs();

//    if (art_work_around_app_jni_bugs) {
//        targetAddress = (size_t)art_work_around_app_jni_bugs;
//    }

    int offset = 0;
    bool found = false;
    size_t addr = 0;
    while (true) {

        addr =  startAddress + offset;

        if (addr == targetAddress) {
            found = true;
            break;
        }
        offset += 4;
        if (offset >= 100) {
            LOGW("Ops: Unable to find the jni function.");
            break;
        }
    }

    env->UnregisterNatives(javaClass);
    env->DeleteLocalRef(javaClass);

    if (found) {
        if (!isArt) {
            offset += (sizeof(int) + sizeof(void *));
        }
        LOGW("Hoho, Get the offset : %d.", offset);

        return offset;
    }

楼主,这个地方去获取本地函数和java函数的偏移一直报错,为什么不直接HookopenDexFile这个函数
2016-11-9 17:34
0
雪    币: 4
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请问作者你解决问题了么?内存加载dex不是主要用在加密dex文件内从中解密得到byte[]直接内存中加载么,怎么传到进这个DexFile::OpenMemory里面啊。。看你的demo是mmap一个class.dex文件做的。
2016-11-15 12:09
0
雪    币: 4
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
他这个是三星的rom,没源码都不知道hoot那个函数,原生的没有这个检查的
2016-11-28 23:56
0
雪    币: 4
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主,你试过6.0么,照着你的试了下6.0,,崩了
2016-11-29 13:28
0
雪    币: 4
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
崩在opemmemory函数里面
2016-11-29 13:29
0
雪    币: 2
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
代码目前还在完善中,后面会用不同的方案实施,这里就不一一回答了,原来的方案的确会有不少问题,但至少Hook JNI 方法应该是没有问题的。至于在什么情况下出问题,请说一下设备环境吧,有空我去测试一下。
2016-11-30 12:20
0
雪    币: 4
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
随便找了两个6.0的手机,一个华为的,一个小米的,直接参照你的demo代码,加上api23的处理,调用libart.so中的DexFile::OpenMemory(const uint8_t* base,...)函数,两台手机都崩来在openmemory函数内部,似乎是地址出错了,比如小米MAX:
11-30 15:35:54.195 533-533/? A/DEBUG: pid: 11195, tid: 11224, name: Thread-153  >>> com.test.shellapp <<<
11-30 15:35:54.195 533-533/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xfe9cec1e
11-30 15:35:54.209 533-533/? A/DEBUG:     r0 f5418ed0  r1 00000000  r2 00000000  r3 00000002
11-30 15:35:54.209 533-533/? A/DEBUG:     r4 e042e424  r5 ab5f73d0  r6 12d1bfa0  r7 e042e410
11-30 15:35:54.209 533-533/? A/DEBUG:     r8 001839f0  r9 df5ee00c  sl 716d0c18  fp fe9cec1e
11-30 15:35:54.209 533-533/? A/DEBUG:     ip f74c45dc  sp e042e3c0  lr f7495e89  pc f513509c  cpsr 80030030
11-30 15:35:54.213 533-533/? A/DEBUG: backtrace:
11-30 15:35:54.213 533-533/? A/DEBUG:     #00 pc 0016109c  /system/lib/libart.so (_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_+43)
2016-11-30 15:37
0
雪    币: 4
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
请问楼主你hookjni(opendexnative)是想把cookie返回给java层的DexFile么?我直接用调用
openmemory得到cookie,直接返回给java层的classloader(参照4.*版本的实现),似乎没啥问题(三星手机还是碰到你文章提到的错误(defineclass失败),感觉这里怎么也绕不过去,路住了)
如果你有什么新思路,能否共享下?我qq9770825.多谢
2016-11-30 15:52
0
雪    币: 148
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
6.0很简单,so easy
2016-12-2 22:20
0
雪    币: 729
活跃值: (1306)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
12
大神。请问hook  openDexFileNative  是hook系统调用的。还是自己调用  的
2017-8-3 19:17
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
skyun 大神。请问hook openDexFileNative 是hook系统调用的。还是自己调用 的
当然是系统,  把自己加载好的返回给系统
2017-10-13 17:42
0
雪    币: 4392
活跃值: (881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
如果是多个Dex文件要在内存里进行加载,需要多次调用并获取cookie吗
2019-2-28 14:06
0
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
请问作者你解决问题了么
最后于 2019-9-2 14:25 被mb_acxlveya编辑 ,原因:
2019-8-29 17:58
0
游客
登录 | 注册 方可回帖
返回
//