android 8 dex o,Android逆向之Dex文件

Android逆向之Dex文件

最简单的一个 dex 文件-HelloWorld

① 编译 smali 为 dex java -jar smali.jar -o classes.dex HelloWorld.smali ② 查看设备信息 adb devices ③ 上传文件 adb push HelloWorld.zip /data/local ④ 执行程序 adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld

最简单的 dex 文件的分析,主要分为三大块: ① Dex 文件头 ② 各种数据的数组,包括字符串、类型、方法原型、字段、方法 ③ 类数据 ④ 其他

1e949cae5bb92f083d5e48601de92bc9.png

Dex 文件头

43d2ae5aa813a69abb57500380bd6a98.png

字段 1:dex_magic,表示 dex 文件的文件标识,特征字符串 字段 2:checksum, 表示校验和,对文件求了 32 位的 hash 值(从字段 3 开始到文件末尾)

字段 3:signature[], 表示 SHA1(沙 one),对文件求 hash 值(从字段 4 开始到文件末尾) 字段 4:file_size, 表示文件大小

ad2bab6f8bbdd8b8dbd907bb47b8bec9.png

字段 5:dex 文件头大小 字段 6:数据排列方式-小端方式

dd09d5e6e4aeb5eef0afb927bed656f9.png

各种表的大小以及偏移 ① string_ids_size 和 string_ids_off ,字符串表的大小和偏移 ② type_ids_size 和 type_ids_off,类型表的大小和偏移 ③ proto_ids_size 和 proto_ids_off,原型表的大小和偏移 ④ field_ids_size 和 field_ids_off,字段表的大小和偏移 ⑤ method_ids_size 和 method_ids_off,方法表的大小和偏移 ⑥ class_defs_size 和 class_defs_off,类数据表的大小和偏移

各种数据的数组,包括字符串、类型、方法原型、字段、方法 ① 字符串表

fa272716cd3f4127d6576f351097209a.png

字符串表项,是一个字符串数据的偏移,偏移指向的是一个 string_data 结构。 String_data 结构中有两个字段:

字段 1: 代表长度,数据类型是 uleb128,变长的数据类型(1-5 字节) 字段 2: 存储数据,字符串以 0 结尾。 ② 类型表

d38b20889f05a9d12574acefc8fd3a0c.png

49d11241c216e6bde37cd01091d421cb.png

类型表表项,是一个索引值,类型描述符字符串在字符串表中的索引,图中的索引是 1,表 示在字符串表中的数组索引 1 中的元素。

24cd31a80eef42551e0a6de59ff93689.png

类型描述符包括基本数据类型的描述符和类类型的描述符。 LHelloWorld; 是 HelloWorld 类的类描述符。

③ 原型表

3685a116409847525c27890b867fceb5.png

原型表项中存储的是函数原型的各部分描述信息。包括短类型(shorty_idx)、返回类型 (return_type_idx)、参数的类型(parameters_off,最终还是一个指向字符串表的数组下标) 注意:字段为返回类型(return_type_idx)的值,是类型表中的索引。 ④ 字段表

fb74b53cd1bc3dbd100496a857eaa449.png

字段表项中内容存储的是字段的信息。包括字段所在类(class_idx)、字段的类型(type_idx)、 字段的名称(name_idx), class_idx 是类型表中的索引,type_idx 是类型表中的索引,字段名称 的索引是字符串表的数组下标。 ⑤ 方法表

597ee5dbee42a09f001db5bc12da6cc2.png

方法表项中存储的是方法的信息,包括方法所在的类(class_idx)、方法的原型(proto_idx)、方 法的名称(name_idx),其中 class_idx 是类型表中的索引,proto_idx 是在原型表中的索引,方 法名称的索引是字符串表的数组下标。

类数据 类数据也是一个数组,每一个元素就是一个类的相关信息。

6f0be9b4c63594dbe177db67e95a1646.png

在表项中的 class_data 中存储的是类数据,包括类名索引、访问属性、父类索引、接口偏移、 源码索引、注解偏移、类数据偏移。

447fe0c50e3c0946ce14fd60f4403ec1.png

在类数据中有存储类中的字段和方法信息,在每一个方法中的 code_item 结构中有一个字段 insns 数组,存储的是 dalvik 虚拟机指令。指令可以使用 baksmali 反汇编成 smali 代码。 ushort insns[8] = 62 00 00 00 1A 01 00 00 6E 20 01 00 10 00 0E 00 第一字节:

9fa43f9938f933428aefddb452b81103.png

指令 1:62 00 00 00 sget-object v0,field@0000

4eb06f6694d8045152834a68a659639c.png

伪代码:sget-object v0,out Smali 代码:sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; Java 代码:System.out

6202797e7f88029d18d26066c73e196a.png

指令 2:1A 01 00 00 const-string v1,string@0000

5afd4d7a9b4cc834f34a4e29c47304ca.png

伪代码:const-string v1,string[0] Smali 代码:const-string v1,“Hello World!” 指令 3:6E 20 01 00 10 00 invoke-virtual {v0,v1} , method@0001

8410637f88284dbb35d9ad6e126d966a.png

伪代码:invoke-virtual {v0, v1}, method[1]

cc80443f8756464ad8a87d7fcbbe458b.png

Smali 代码:invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 更详细的需要查看 baksmali 的源代码。

指令 4:0E 00 return-void

6d036429bb8d879b44a24141fc6407a6.png

在线分析 Android

17c72e923f16e49825c1e270b6033075.png

解决 修改 x dex 文件之后的错误

当我们修改 dex 文件之后,即使再签名,再打包,最终还是无法安装,因为 dex 文件对文件 有校验,安装时会读取 dex 文件头部的 hash 值和重新计算的值进行比对,完成校验。

1fef6a53c832ed51c98998562ebc1358.png

此时模拟器中有安装残留,需要在/data/data/目录中删除对应的安装目录 重新安装,即可完成。

修复 dex文件的原理

将 dex 文件头部的两个 Hash 值重新计算,然后写回去。 ① 先计算 SHA-1 值(第三个字段),修改值 ② 再计算 CheckSum 值(第二个字段),修改值

Android 架构

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值