首页
社区
课程
招聘
[原创][分享]Dex动态加载关键函数调用链
发表于: 2020-3-21 17:35 5783

[原创][分享]Dex动态加载关键函数调用链

2020-3-21 17:35
5783
  • 写在前面: 最近实在是太忙了,本来说好上个周上完课之后就发篇帖子的,但是手头上一直有事,就一直没发,今天稍微整理了一下也不写具体细节了,就只是简单的分享几张我整理的图片吧,具体流程还是看源码吧。(由于论坛md上传图片原因,详细高清图见附件)

    Android 4.4下Dex动态加载

    在Android4.4之前,Android是基于Dalvik虚拟机实现的,如果想要实现动态的dex的加载,正常来说就得借助DexClassLoader,DexClassLoader加载dex的具体流程,不再赘述,见附件图

    Android 8.0下Dex动态加载

    在Android4.4开始,Android引入Art虚拟机,大大加快了Android应用的运行速度,此时Dex的动态加载主要还是通过DexClassLoader进行加载,只是so层基于Art重写了,这里基于Android 8.0做了整理,注意!!!这个整理是基于禁用了dex2oat的流程,上图!

    在Android 8.0之后,Android又引入了InMemoryDexClassLoader机制,实现了直接从内存中加载dex的方式,这样也实现了Dex的动态加载,上图
  • 写在后面,以上所有图,都是上完@hanbingle师傅的课程后,自己看源码后整理的,如果有错误,欢迎指摘;最后在这里感谢@hanbingle师傅的指导和鼓励。
    ----------------------------更新实践部分-------------------
    为了证实我的图中标注的脱壳点有效,拿了一个腾讯加固的例子
    这里选取我之前总结的调用图中的DexFileVerifier::VerifyDexFileVerifier以及OpenFile函数与DexFile::DexFile函数作为脱壳点,
    在函数中插入以下dump dex的代码

    DexFileVerifier(const DexFile* dex_file,
                      const uint8_t* begin,
                      size_t size,
                      const char* location,
                      bool verify_checksum)
          : dex_file_(dex_file),
            begin_(begin),
            size_(size),
            location_(location),
            verify_checksum_(verify_checksum),
            header_(&dex_file->GetHeader()),
            ptr_(nullptr),
            previous_item_(nullptr)  {
          // 以下是添加的代码
          char dexfilepath[100]={0};
          int pid=getpid();
                      sprintf(dexfilepath,"/sdcard/%d_%d_DexFileVerifier.dex",(int)(size),pid);
    
          int fd=open(dexfilepath,O_CREAT|O_RDWR,0666);
          if(fd>0){
            write(fd,begin,size);
            close(fd);
          }
    }
    

编译源码,刷机,
刷机成功后,安装并给予应用存储权限,然后运行app,并在sdcard目录下使用grep命令过滤dex,最终得到脱壳后的文件如下

可以发现最终是可以脱下来的,有兴趣的可以测一测其他的加固,应当都是能脱下来的,测试的apk见
链接:https://pan.baidu.com/s/1zHzMVJ9XYT4q-NgwPRb12A 密码:q7x4


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2020-3-27 10:10 被Simp1er编辑 ,原因: 更新代码
上传的附件:
  • 1.zip (2.83MB,113次下载)
收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 112
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
没什么用吧
2020-3-21 19:06
0
雪    币: 2153
活跃值: (5347)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
3
东纹 没什么用吧
正常的壳都是可以脱下的,只不过完整不完整的问题
2020-3-25 12:54
0
雪    币: 14481
活跃值: (5738)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
1、图片100%比例都看不清任何文字,你自己看得清?
2、dump dex关键代码没贴出来,base、size怎么获取?
最后于 2020-3-25 14:38 被tDasm编辑 ,原因:
2020-3-25 14:22
0
雪    币: 2153
活跃值: (5347)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
5
tDasm 1、图片100%比例都看不清任何文字,你自己看得清?2、dump dex关键代码没贴出来,base、size怎么获取?
第一,图看不清我知道,我在文中也说了,高清图我放在附件里了
第二,关键代码我已经贴出来了,base和size就是函数的参数。
2020-3-27 09:01
0
雪    币: 2153
活跃值: (5347)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
6
tDasm 1、图片100%比例都看不清任何文字,你自己看得清?2、dump dex关键代码没贴出来,base、size怎么获取?
我更新了函数头,这下代码应该很明了了
2020-3-27 10:12
0
雪    币: 1759
活跃值: (2334)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
可以,很6,相关文件也都提供了下载
2020-3-30 14:37
0
雪    币: 3707
活跃值: (18325)
能力值: ( LV12,RANK:277 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2020-4-6 11:47
0
游客
登录 | 注册 方可回帖
返回
//