DEX文件解析--4、dex类的类型解析
一、前言
  前几篇系列文章链接:
    DEX文件解析---1、dex文件头解析
    DEX文件解析---2、Dex文件checksum(校验和)解析
    DEX文件解析--3、dex文件字符串解析
二、DEX文件中的类的类型
    1、Dex文件中关于类的类型需要知道字符串是怎么解析的,如果不知道的,可以看一下我的上一篇文章。好了,切入正题,关于类的类型,就是一个对象的所属的类(大概这么理解吧。。。),例如在java中一个字符串,它的类型就是java/lang/String。在Dex文件头中,跟类的类型有关的一共有八个字节,分别是位于0x40处占四个字节表示类的类型的数量和位于0x44处占四个字节表示类的类型索引值的起始偏移地址,如下所示:

    2、关于类的类型数量,没什么好说的,只需要注意它是以小端序存储的,读取的时候注意即可。对于类的类型偏移地址,找到偏移地址后,它是以四个字节为一组,对应了在解析出来的字符串数组中的索引值,例如下图中的第一组,它的数据是BE 04 00 00,我们读取出来就是0x04BE(同样采用的小端序存储),对应的类的类型就是字符串数组[0x04be]。

三、解析脚本
PS:我电脑上脚本运行环境python3.6
运行效果:


代码如下:
import binascii
import os
import sys
def getStringsCount(f):
    f.seek(0x38)
    stringsId = f.read(4)
    a = bytearray(stringsId)
    a.reverse()
    stringsId = bytes(a)
    stringsId = str(binascii.b2a_hex(stringsId),encoding='UTF-8')
    count = int(stringsId,16)
    return count
def getStringByteArr(f,addr):
    byteArr = bytearray()
    f.seek(addr + 1)
    b = f.read(1)
    b = str(binascii.b2a_hex(b),encoding='UTF-8')
    b = int(b,16)
    index = 2
    while b != 0:
        byteArr.append(b)
        f.seek(addr + index)
        b = f.read(1)
        b = str(binascii.b2a_hex(b),encoding='UTF-8')
        b = int(b,16)
        index = index + 1
    return byteArr
def BytesToString(byteArr):
    try:
        bs = bytes(byteArr)
        stringItem = str(bs,encoding='UTF-8')
        return stringItem
    except:
        pass
def getAddress(addr):
    address = bytearray(addr)
    address.reverse()
    address = bytes(address)
    address = str(binascii.b2a_hex(address),encoding='UTF-8')
    address = int(address,16)
    return address
def getStrings(f,stringAmount):
    stringsList = []
    f.seek(0x3c)
    stringOff = f.read(4)
    Off = getAddress(stringOff)
    f.seek(Off)
    for i in range(stringAmount):
        addr = f.read(4)
        address = getAddress(addr)
        byteArr = getStringByteArr(f,address)
        stringItem = BytesToString(byteArr)
        stringsList.append(stringItem)
        Off = Off + 4
        f.seek(Off)
    return stringsList
def getTypeAmount(f):
    f.seek(0x40)
    stringsId = f.read(4)
    a = bytearray(stringsId)
    a.reverse()
    stringsId = bytes(a)
    stringsId = str(binascii.b2a_hex(stringsId),encoding='UTF-8')
    count = int(stringsId,16)
    return count
def getTypeItem(f,count,strLists):
    f.seek(0x44)
    type_ids_off = f.read(4)
    a = bytearray(type_ids_off)
    a.reverse()
    type_ids_off = bytes(a)
    type_ids_off = binascii.b2a_hex(type_ids_off)
    type_ids_off = str(type_ids_off,encoding='utf-8')
    type_off = int(type_ids_off,16)
    f.seek(type_off)
    print('[+] type count ==> ',end='')
    print(count)
    for i in range(count):
        typeIndex = f.read(4)
        b = bytearray(typeIndex)
        b.reverse()
        typeIndex = bytes(b)
        typeIndex = binascii.b2a_hex(typeIndex)
        typeIndex = int(str(typeIndex,encoding='UTF-8'),16)
        print('[*] typeItem ==> ',end='')
        print(strLists[typeIndex])
        type_off = type_off + 0x04
        f.seek(type_off)
if __name__ == '__main__':
    filename = str(os.path.join(sys.path[0])) + '\\1.dex'
    f = open(filename,'rb',True)
    stringsCount = getStringsCount(f)
    strList = getStrings(f,stringsCount)
    typeCount = getTypeAmount(f)
    getTypeItem(f,typeCount,strList)
    f.close()
四、样本以及代码下载链接
百度网盘:https://pan.baidu.com/s/1Z1nn8hroxX-2jGaKvhmIZQ;提取码:1eao
DEX文件解析--4、dex类的类型解析的更多相关文章
- 一篇文章带你搞懂DEX文件的结构
		
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看 ...
 - DEX文件解析--7、类及其类数据解析(完结篇)
		
一.前言 前置技能链接: DEX文件解析---1.dex文件头解析 DEX文件解析---2.Dex文件checksum(校验和)解析 DEX文件解析--3.d ...
 - DEX文件解析--5、dex方法原型解析
		
一.前言 前几篇文章链接: DEX文件解析---1.dex文件头解析 DEX文件解析---2.Dex文件checksum(校验和)解析 DEX文件解析--3.dex文件字 ...
 - DEX文件解析--6、dex文件字段和方法定义解析
		
一.前言 前几篇文章链接: DEX文件解析---1.dex文件头解析 DEX文件解析---2.Dex文件checksum(校验和)解析 DEX文件解析--3. ...
 - DEX文件类型和虚拟机(摘抄)
		
DEX文件类型是Android平台上可执行文件的类型. Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动 ...
 - 插件化框架解读之Class文件与Dex文件的结构(一)
		
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 Class文件 Class文件是Java虚拟机定义并被其所识别的 ...
 - class 文件与dex文件区别 (dvm与jvm区别)及Android DVM介绍
		
区别一:dvm执行的是.dex格式文件 jvm执行的是.class文件 android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和 ...
 - Dex文件方法数超过65536怎么破?
		
你的应用中的Dex 文件方法数超过了最大值65536的上限,会提示你: UNEXPECTED TOP-LEVEL EXCEPTION:java.lang.IllegalArgumentExceptio ...
 - Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用
		
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...
 
随机推荐
- C++中为什么按两次ctrl+D才能结束标准I/O
			
参考资料: https://www.douban.com/group/topic/127062773/ 今天学习了C++语言的标准I/O,也就是std::cin和std::cout,但是我发现当系统在 ...
 - C#数据结构与算法系列(八):栈(Stack)
			
1.介绍 栈是一个先入后出(FILO-First In Last Out)的有序列表 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的特殊线性表.允许插入和删除的一端,为变化的一端,称为栈顶 ...
 - IP地址、计算机名称、MAC地址如何获取
			
以下的操作都在“命令提示窗口”中操作. 已知IP,如何获得计算机名称 方法(1): 使用ping -i ip地址 例如已知地址为192.168.1.168. 那么使用ping -i 192.168.1 ...
 - el-checkbox实现全选与单选
			
实现目的:实现全选与多选,点击确定的时候获取每个值的id传给后台 1.HTML <el-checkbox v-model="checkAll" @change="h ...
 - Jenkins中agent的使用
			
[前言] 很多小伙伴都已经会搭建Jenkins环境了,都想要用Jenkins来运行自动化接口,可我们的Jenkins在linux服务器上.服务器上默认的python包是2.6的这样不是很好,那么这边就 ...
 - spring框架中JDK和CGLIB动态代理区别
			
转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/ ...
 - django 分页器,序列化 ,MTV MVC
			
序列化组件## from django.core import serializers # django自带的一个小型的序列化工具# def reg(request):# user_list = mo ...
 - centos搭建nginx+fastdfs
			
软件地址 libfastcommon fastDFS fastdfs-nginx-module nginx 创建目录 mkdir -p /fastdfs/tracker mkdir -p /fastd ...
 - 一不小心,我就上传了 279674 字的 MySQL 学习资料到 github 上了
			
自从2019年11月我们出版了<千金良方--MySQL 性能优化金字塔法则>一书之后,持续不断有人来询问我MySQL 4 个系统字典库相关的问题,因为篇幅原因,书中并没有完整收录4个字典库 ...
 - openstack Rocky 社区版部署1.4 安装数据库
			
在控制节点安装mariadb,也可以单独服务器安装数据库,假如多个控制节点就在第一台安装数据库,计算节点不需要安装. 1 安装mariadb相关安装包. yum install mariadb mar ...