IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> DEX文件解析 - type_ids解析 -> 正文阅读

[移动开发]DEX文件解析 - type_ids解析

在上一篇中介绍了string_ids的解析,那么接下来就要学习type_ids的解析。

1. type_ids结构

androidaosp源码中,type_ids的结构如下:
aosp源码位置:art/libdexfile/dex/dex_file.h

TypeId

 // Raw type_id_item.
  struct TypeId {
    dex::StringIndex descriptor_idx_;  // index into string_ids

   private:
    DISALLOW_COPY_AND_ASSIGN(TypeId);
  };

StringIndex

class StringIndex {
 public:
  uint32_t index_;
  ....  
  ....
};

TypeId的结构,存储着一个无符号的4字节数据(StringIndex对应的是无符号的int类型),descriptor_idx_对应的是字符串索引列表的索引/下标

2. 010Editor解析

如图,仔细观察
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. type_ids解析

java语言解析type_ids

/**
 * 解析TypeIds
 * @param raf
 * @return
*/
private static List<TypeId> toParseDexTypeIds(RandomAccessFile raf) {
    try {
        List<TypeId> typeIdList = new ArrayList<>();
        //获取类型索引列表的文件偏移量
        int type_ids_off = mDexFile.getType_ids_off();
        //获取类型索引列表的大小
        int type_ids_size = mDexFile.getType_ids_size();
        //偏移到类型索引列表的开始位置
        raf.seek(type_ids_off);
        //遍历类型索引列表,类型索引列表中存储着 字符串索引列表的 索引(下标)
        for (int i=0;i<type_ids_size;i++) {
            //获取 类型数据在字符串索引列表的索引(下标)
            byte[] type_string_index_bytes = readData(raf, 4);
            int type_string_index = NumConversion.byteToInt(type_string_index_bytes, false);
            //获取 类型数据
            StringId stringId = mStringIds.get(type_string_index);
            String TypeData = new String(stringId.getData());
            System.out.println("索引:"+i+" 索引对应的数据:"+TypeData);
            //创建TypeIds实体类
            TypeId typeId = new TypeId();
                typeId.setTypeDescriptorIdx(type_string_index);
                typeIdList.add(typeId);
        }
        return typeIdList;
    }catch (Exception e){
        e.printStackTrace();
    }


    return null;
}

public static byte[] readData(RandomAccessFile raf,int limit) {
    byte[] buff = new byte[limit];
    try {
        raf.read(buff);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return buff;
}

实体类TypeId

public class TypeId {
    private int typeDescriptorIdx; //存储着 字符串索引列表中的索引

    public int getTypeDescriptorIdx() {
        return typeDescriptorIdx;
    }

    public void setTypeDescriptorIdx(int typeDescriptorIdx) {
        this.typeDescriptorIdx = typeDescriptorIdx;
    }
}

工具类NumConversion

public class NumConversion {

    public static int byteToInt(byte[] bytes,boolean isBigEndian) {
        if (bytes.length <=0 || bytes.length > 4) return -1;
        int result = 0;
        for (int i=0;i<bytes.length;i++) {
            int b ;
            if(isBigEndian){
                b = (bytes[i] & 0xFF) << (8*(bytes.length-1-i));
            }else {
                b = (bytes[i] & 0xFF) << (8*i);
            }
            result = result | b;
        }
        return result;
    }
}

asjhan for Android reverse

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:02:21  更:2022-03-21 21:03:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:27:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码