年初,bluebox 发布一个可以在运行时修改自身 dalvik 字节码的 demo,在论坛的相关信息
http://bbs.pediy.com/showthread.php?t=170381。
该 demo 通过 native 层代码修改自身 dex 从而增加静态分析难度。 Demo 及伪加密解除代码链接如下
https://github.com/blueboxsecurity/DalvikBytecodeTampering
出于好奇,我对其简单逆向,并了解该程序的执行原理,并进行小记。
首先使用 Apktools,发现不能对其进行反编译。使用压缩包工具打开查看
后并尝试解包则遇到如下图 1 情形:
图 1
突然想起这或许就是之前论坛上有人遇到的 zip 伪加密。在 android 解析apk 时,由于忽略了加密 zip,直接跳过了加密头部的解析,因此通过修改 zip格式的加密标识,可以是实现伪加密。bluebox 也提供了 python 代码进行解压
缩。解压缩完成后将所有内容再次通过 zip 压缩成 apk,即可开始使用 VTS 对其分析。
使用 VTS 载入 delta.apk, 找到 activity(Lcom/bluebox/lab/poc/Action;),
看到有类的静态构造函数如图 2,对应于源代码 static{}代码段:
图 2
从该段代码中可以看出,在 delta.apk 主 activity 运行后,会加载自身native so,并执行该 so 下的 readmem()I 函数。由于该代码段在该类加载时最先执行的,因此余下的算法分析可以暂时不予考虑,我们重点关注如何运行时自
修改 dalvik 代码。打开 IDA 载入 libnet.so 进行静态分析,找到 native 对应的readmem 函数,该函数主要执行一个 search 函数,也就是该程序的主要核心。进入 search 函数,进行主要功能分析,代码流程图如下图 3:
图 3
关键点大致解释如下:
接下来我们将对关键函数进行分析, 需要我们对 dex 文件可是有一定的了解,
循环调用 findmagic,该函数用于找到 dex 在内存中的起始地址,用于在内存中
分析 dex 结构
循环体:
Findmagic 函数:
找到之后开始查找需要修改的代码地址,这需要熟悉 dex 文件中各种索引的关系:
我们可以查看相关的头文件来了解各个结构(字符,类型,函数,类等)对
应关系 , 相 关 头 文 件 位 于 源 码 \dalvik\libdex\DexClass.h 和\dalvik\libdex\DexFile.h 中,如果要修改对应类中的方法, 过程大致如下 (具体过程查看相关书籍材料) :
(1) 首先,要修改函数代码肯定对应于 dalvik 指令, 而结构 DexCode 存放了关
dex 代码的信息,我们的目标就是要修改该结构相应的内容。
(2)如何找到对应dexcode结构,将由以下结构DexMethod的成员指明了dexcode
结构偏移
该结构存放了对应函数有关的信息, 一个确定的函数就存在这么一个结构,确定
了这一个函数,找到这一个结构体,就可以沿着往下修改 dalvik 指令了。
(3)而找到这么一个结构,我们需要一个确定的函数信息,包括所在的类,函
数签名,函数名字,返回类型等,当这些确定了,这个函数也就唯一确定了。
这也就是如下 get*函数的用途:
1)先找到 Ljava/lang/String;和 add 对应的字符串 ID。
2)在找 Ljava/lang/String;字符串对应的类型。
3)通过该类型找到对应的类 Ljava/lang/String;
4)接着寻找该类函数 ADD 对应的 ID
5)之后就找到了上文提到的 DexMethod 结构体
6)通过结构体找到了存放代码的缓冲区
也就是对应了 VTS 中解析到的类,如图 4:
图 4
也就是说该程序就是修改了 Ljava/lang/String;->add 函数代码
最后:
inject_ptr 也就是注入代码的二进制。
http://bbs.pediy.com/showthread.php?t=170381。
该 demo 通过 native 层代码修改自身 dex 从而增加静态分析难度。 Demo 及伪加密解除代码链接如下
https://github.com/blueboxsecurity/DalvikBytecodeTampering
出于好奇,我对其简单逆向,并了解该程序的执行原理,并进行小记。
首先使用 Apktools,发现不能对其进行反编译。使用压缩包工具打开查看
后并尝试解包则遇到如下图 1 情形:
图 1
突然想起这或许就是之前论坛上有人遇到的 zip 伪加密。在 android 解析apk 时,由于忽略了加密 zip,直接跳过了加密头部的解析,因此通过修改 zip格式的加密标识,可以是实现伪加密。bluebox 也提供了 python 代码进行解压
缩。解压缩完成后将所有内容再次通过 zip 压缩成 apk,即可开始使用 VTS 对其分析。
使用 VTS 载入 delta.apk, 找到 activity(Lcom/bluebox/lab/poc/Action;),
看到有类的静态构造函数如图 2,对应于源代码 static{}代码段:
图 2
从该段代码中可以看出,在 delta.apk 主 activity 运行后,会加载自身native so,并执行该 so 下的 readmem()I 函数。由于该代码段在该类加载时最先执行的,因此余下的算法分析可以暂时不予考虑,我们重点关注如何运行时自
修改 dalvik 代码。打开 IDA 载入 libnet.so 进行静态分析,找到 native 对应的readmem 函数,该函数主要执行一个 search 函数,也就是该程序的主要核心。进入 search 函数,进行主要功能分析,代码流程图如下图 3:
图 3
关键点大致解释如下:
循环调用 findmagic,该函数用于找到 dex 在内存中的起始地址,用于在内存中
分析 dex 结构
循环体:
我们可以查看相关的头文件来了解各个结构(字符,类型,函数,类等)对
应关系 , 相 关 头 文 件 位 于 源 码 \dalvik\libdex\DexClass.h 和\dalvik\libdex\DexFile.h 中,如果要修改对应类中的方法, 过程大致如下 (具体过程查看相关书籍材料) :
(1) 首先,要修改函数代码肯定对应于 dalvik 指令, 而结构 DexCode 存放了关
dex 代码的信息,我们的目标就是要修改该结构相应的内容。
结构偏移
了这一个函数,找到这一个结构体,就可以沿着往下修改 dalvik 指令了。
(3)而找到这么一个结构,我们需要一个确定的函数信息,包括所在的类,函
数签名,函数名字,返回类型等,当这些确定了,这个函数也就唯一确定了。
这也就是如下 get*函数的用途:
2)在找 Ljava/lang/String;字符串对应的类型。
3)通过该类型找到对应的类 Ljava/lang/String;
4)接着寻找该类函数 ADD 对应的 ID
5)之后就找到了上文提到的 DexMethod 结构体
6)通过结构体找到了存放代码的缓冲区
也就是对应了 VTS 中解析到的类,如图 4:
图 4
也就是说该程序就是修改了 Ljava/lang/String;->add 函数代码
最后: