dex文件结构

DEX文件结构

dex结构定义位置

android-10.0.0_r41\dalvik\libdex\DexFile.h
/*
 * Direct-mapped "header_item" struct.
 */
struct DexHeader {
    u1  magic[8];           /* includes version number */
    u4  checksum;           /* adler32 checksum */
    u1  signature[kSHA1DigestLen]; /* SHA-1 hash */
    u4  fileSize;           /* length of entire file */
    u4  headerSize;         /* offset to start of next section */
    u4  endianTag;
    u4  linkSize;
    u4  linkOff;
    u4  mapOff;
    u4  stringIdsSize;
    u4  stringIdsOff;
    u4  typeIdsSize;
    u4  typeIdsOff;
    u4  protoIdsSize;
    u4  protoIdsOff;
    u4  fieldIdsSize;
    u4  fieldIdsOff;
    u4  methodIdsSize;
    u4  methodIdsOff;
    u4  classDefsSize;
    u4  classDefsOff;
    u4  dataSize;
    u4  dataOff;
};

图解
![在这里插入图片描述](https://img-blog.csdnimg.cn/6a323d34604d4cf89a441f66631c8a2d.png
在这里插入图片描述

例子

在这里插入图片描述
010editor 加上dex.bt
在这里插入图片描述

checksum(校验和)是DEX位于文件头部的一个信息,用来判断DEX文件是否损坏或者被篡改,它位于头部的0x08偏移地址处,占用4个字节,采用小端序存储。
    在DEX文件中,采用Adler-32校验算法计算出校验和,将DEX文件从0x0C处开始读取到文件结束,将读取到的字节数组使用Adler-32校验算法计算出结果即是校验和即checksum字段

字段名长度(bit)备注
magic864 65 78 0a 30 33 35 00
checksum46c 35 8a d00xd08a356c
signature200c 68 37 ef ab 09 36 3e 65 5b 47 24 af 54 75 fa 2e 7f 12 2f
filesize434 3a 20 000x203a34,2112052
headsize:470 00 00 000x70, 112
endiantag478 56 34 12
linksize400 00 00 00
linkOff400 00 00 00
mapOff478 56 34 12
stringIdsSize42f 52 00 000x522f, 21039
stringIdsOff470 00 00 000x70, 112
typeIdsSize442 08 00 000x0842,2114
typeIdsOff464 39 20 00
protoIdsSize42d 0d 00 000x0d2d,3373
protoIdsOff434 6a 01 00
fieldIdsSize4b8 2b 00 000x2bb8,11192
fieldIdsOff450 08 02 00
methodIdsSize4bb 3d 00 000x3dbb,15803
methodIdsOff410 66 03 00
classDefsSize453 05 00 000x0553,1363
classDefsOff4e8 53 05 00
dataSize4ec 3b 1a 000x1a3bec,1719276
dataOff448 fe 05 00

python计算checksum和signature

import hashlib
import zlib


def getCheckSum(dexfile):
    f = open(filename, 'rb', False)
    f.seek(0x0c)
    chs = f.read()
    f.close()
    return hex(zlib.adler32(chs))


def getSignature(dexfile):
    f = open(filename, 'rb', False)
    f.seek(0x20)
    chs = f.read()
    f.close()
    return hashlib.sha1(chs).hexdigest()


if __name__ == '__main__':
    filename = 'classes.dex'
    checksum = getCheckSum(filename)
    print(f'checksum = {checksum}')
    signature = getSignature(filename)
    print(f'signature = {signature}')

参考

dex文件格式介绍

pythonhash库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骇客之技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值