彻底弄懂dalvik字节码【三】_Omni-Space的博客-程序员ITS203_dalvik字节码解读

技术标签: dalvik  Android / Dalvik  Android  

【一】【二】中从代码的角度分析了dalvik字节码解释执行的过程,这篇文章以一个例子来实际分析一下。

我们以这篇文章中提到的crackme为例,下载链接参见那篇文章。我们只分析dalvik字节码,因此忽略so。

0x01:

使用Jeb打开crackme.apk,找到MainActivity的onCreate方法,其smali内容是:

.method protected onCreate(Bundle)V
          .registers 5
          .param p1, "savedInstanceState"
          .prologue
00000000  invoke-super            AppCompatActivity->onCreate(Bundle)V, p0, p1
00000006  const                   v2, 0x7F040019
0000000C  invoke-virtual          MainActivity->setContentView(I)V, p0, v2
00000012  const                   v2, 0x7F0C0050
00000018  invoke-virtual          MainActivity->findViewById(I)View, p0, v2
0000001E  move-result-object      v1
00000020  check-cast              v1, EditText
          .local v1, txt:Landroid/widget/EditText;
00000024  const                   v2, 0x7F0C0051
0000002A  invoke-virtual          MainActivity->findViewById(I)View, p0, v2
00000030  move-result-object      v0
00000032  check-cast              v0, Button
          .local v0, btn:Landroid/widget/Button;
00000036  sget-boolean            v2, MainActivity->$assertionsDisabled:Z
0000003A  if-nez                  v2, :4E
:3E
0000003E  if-nez                  v0, :4E
:42
00000042  new-instance            v2, AssertionError
00000046  invoke-direct           AssertionError-><init>()V, v2
0000004C  throw                   v2
:4E
0000004E  new-instance            v2, MainActivity$1
00000052  invoke-direct           MainActivity$1-><init>(MainActivity, EditText)V, v2, p0, v1
00000058  invoke-virtual          Button->setOnClickListener(View$OnClickListener)V, v0, v2
0000005E  return-void
.end method

smali 对于Android,可以理解为汇编对于C。smali中定义了一套完整的dalvik操作码(类似于汇编的指令集),构成了dalvik虚拟机最核心的部分。

字节码是二进制的,这些二进制通过一定的方式可以被解释成为smali指令。我们来看看这个过程。

0x02:

使用010editor打开crackme.apk中的classes.dex,应用dex模板,结果如下:


dex文件格式参见这篇文章

我们分析的目标是MainActivity的onCreate方法,直接找到它:



因为onCreate是重写的父类方法,所以在virtual_methods中,我们看到这个方法需要5个寄存器,2个参数,3个内部方法调用参数,48条指令。字节码在insns中。

0x03:

下面进入对字节码的分析,在【二】中分析方法执行时, dvmInterpretPortable的最后一个语句:

FINISH(0); /* fetch and execute first instruction */

即为定位到insns的起始处,并取2个字节的内容放置到inst变量中,之后取出inst的低字节数值作为handlerTable数组的索引号,然后跳转到对应符号去执行。

代码上的跟踪比较繁琐,好在google有相关的文档:【Dalvik bytecode】【Dalvik Executable instruction formats】,我们根据文档来分析。

在这个例子中,第一个“两字节”是:6F 20, 其低字节是6F,代表着handlerTable数组的索引号,查询文档:


表示操作符是invoke-super

查看OP_INVOKE_SUPER.cpp,里面有对此指令的执行过程:

HANDLE_OPCODE(OP_INVOKE_SUPER /*vB, {vD, vE, vF, vG, vA}, [email protected]*/)
    GOTO_invoke(invokeSuper, false);
OP_END

其中:

# define HANDLE_OPCODE(_op) op_##_op:
OP_INVOKE_SUPER                 = 0x6f,
#define GOTO_invoke(_target, _methodCallRange)                              \
    do {                                                                    \
        methodCallRange = _methodCallRange;                                 \
        goto _target;                                                       \
    } while(false)

翻译一下就是:

op_0x6f:
  do{
      methodCallRange = false;
      goto invokeSuper;
  }while(false)

invokeSuper在gotoTargets.cpp中定义:

GOTO_TARGET(invokeSuper, bool methodCallRange)
    {
        Method* baseMethod;
        u2 thisReg;

        EXPORT_PC();

        vsrc1 = INST_AA(inst);      /* AA (count) or BA (count + arg 5) */
        ref = FETCH(1);             /* method ref */
        vdst = FETCH(2);            /* 4 regs -or- first reg */

        if (methodCallRange) {
            ILOGV("|invoke-super-range args=%d @0x%04x {regs=v%d-v%d}",
                vsrc1, ref, vdst, vdst+vsrc1-1);
            thisReg = vdst;
        } else {
            ILOGV("|invoke-super args=%d @0x%04x {regs=0x%04x %x}",
                vsrc1 >> 4, ref, vdst, vsrc1 & 0x0f);
            thisReg = vdst & 0x0f;
        }

      ... //此处省略后后面的内容

其中:

#define GOTO_TARGET(_target, ...) _target:

#define GOTO_TARGET_END

翻译一下就是:

invokeSuper:
    {
        Method* baseMethod;
        u2 thisReg;

        EXPORT_PC();

        vsrc1 = INST_AA(inst);      /* AA (count) or BA (count + arg 5) */
        ref = FETCH(1);             /* method ref */
        vdst = FETCH(2);            /* 4 regs -or- first reg */

        if (methodCallRange) {
            ILOGV("|invoke-super-range args=%d @0x%04x {regs=v%d-v%d}",
                vsrc1, ref, vdst, vdst+vsrc1-1);
            thisReg = vdst;
        } else {
            ILOGV("|invoke-super args=%d @0x%04x {regs=0x%04x %x}",
                vsrc1 >> 4, ref, vdst, vsrc1 & 0x0f);
            thisReg = vdst & 0x0f;
        }

      ... //此处省略后后面的内容

这样就找到了invokeSuper真正执行的地方了,可以看到,依然是解析字节码和获取新字节码解析的过程。代码跟踪同样比较复杂,我们直接看文档:


从图中可以看出6f的格式是35c(后面会用到),语法格式为:

invoke-*kind*{vC, vD, vE, vF, vG}, [email protected]

其中的A、B、C的解释在后面一列有说明,光看这个还不能看懂,看一下35c:


这个文档我一开始也看得不是太懂,简单的还能对应起来,复杂的(现在这个例子)就搞不清楚了,文档只能理解个大概,最后我选择看代码。这里直接说我看代码看明白的:

首先 6F 20 中的 6F表示操作码,20又分两个4位来解释,2表示寄存器的数量,0代表啥还没有看明白:(,随后的两个字节 47 2A 表示的是method id,47 2A 表示数值是0x2A47,即10823,如图:


所以我们大概明白了:

invoke-super            AppCompatActivity->onCreate(Bundle)V

随后的两个字节 43 00 也是需要被解析的,是用来确定寄存器标号的,至于怎么映射为 p0 p1,我也没有看懂(代码在gotoTargets.cpp的GOTO_TARGET(invokeSuper, bool methodCallRange)中,欢迎有兴趣的同学继续研究并加微信交流)。

0x04:

至此,我们分析完第一条指令的字节码解释过程了。在源码中,你可以看到,它不光是解释成smali这么简单,它真正的去寻找父类的onCreate方法,构造函数堆栈并进行调用。
pc指针随着执行过程不断往后移动,当方法返回后,继续去下一个“两字节”进行解释执行。这个例子中的下一个“两字节"是14 02,其中14为操作码,如图:


可以看到是const vAA, #+BBBBBBBB,和我们在Jeb中看到的const v2, 0x7F040019能够对上。后续的过程和前面完全一致,只是处理的是不同的操作码而已。

0x05:

至此,此系列文章结束。其中有一些细节我也没有弄得很清楚(回头弄明白再来更新),但是大致流程已经清晰了。欢迎有兴趣的同学在此基础上继续研究,可以加我微信进行交流。微信见首页二维码。



作者:difcareer
链接:http://www.jianshu.com/p/aba1f966d7f2
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/omnispace/article/details/77529821

智能推荐

FPGA是什么?为什么要使用它?_查里王的博客-程序员ITS203_fpga是什么

最近几年,FPGA这个概念越来越多地出现。例如,比特币挖矿,就有使用基于FPGA的矿机。还有,之前微软表示,将在数据中心里,使用FPGA“代替”CPU,等等。其实,对于专业人士来说,FPGA并不陌生,它一直都被广泛使用。但是,大部分人还不是太了解它,对它有很多疑问——FPGA到底是什么?为什么要使用它?相比 CPU、GPU、ASIC(专用芯片),FPGA有什么特点?……今天,带着这一系列的...

中企海外周报 | 海尔俄罗斯洗衣机互联工厂开业;奥克斯建造泰国智能生产基地..._美通社的博客-程序员ITS203

摘要华为云、Duubee、宝宝树、名创优品、相宜草本、晶澳太阳能、中圣集团、亨通集团、阳光电源、古瑞瓦特、海尔、奥克斯、TCL、海信、太平鸟、爱奇艺等中国企业海外业务发展...

houmee实习日记22-30<2>_choutingcheng5000的博客-程序员ITS203

--接houmee实习日记22-30&lt;1&gt;--rankingList_ui--rankingList_ui--排行榜--createdbygunon20i5-4-2imodule(...,package.seeall)localrRankingConfi...

聊聊如何做技术分享_qcrao的博客-程序员ITS203

最近在组织公司内部的技术分享,简单的聊聊如何写 tech slide, 以及现场 present 时要注意的地方,希望对大家能有帮助。当然个人理解,难免有错误,欢迎讨论。分享目的要纯粹,不...

ActiveMq安装_sunByFeng的博客-程序员ITS203

1、 安装 JDK 并配置环境变量(略) JAVA_HOME=/usr/local/java/jdk1.7.0_72 2、 下载 Linux 版的 ActiveMQ(当前最新版 apache-activemq-5.11.1-bin.tar.gz) 3、 解压安装$ tar -zxvf apache-activemq-5.11.1-bin.tar.gz $ mv apache-activem

随便推点

[BZOJ3224]普通平衡树_weixin_34204722的博客-程序员ITS203

Problem您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:插入x数删除x数(若有多个相同的数,因只删除一个)查询x数的排名(若有多个相同的数,因输出最小的排名)查询排名为x的数求x的前驱(前驱定义为小于x,且最大的数)求x的后继(后继定义为大于x,且最小的数)SolutionTreap模板题:Treap为一种节点的优先级满足堆性质的二叉搜索树...

Java方向(SSM+SpringBoot)项目实训Day15-周测+总结_猩猩之火可以疗源的博客-程序员ITS203_java ssm实训报告

Day15-周测+总结 周测1(7.26)周测2(8.2)Java方向(SSM+SpringBoot)项目实训Day15(2020.8.15)周测1(7.26)1.String,StringBuffer,StringBuilder的区别?2.String str = “i” 与 String str = new String(“i”)一样吗?3.Java中IO流分为几种?4.Collection 和 Collections有什么区别?5.List、Set、Map之间的区别是什么?6.Has

汉源高科4个万兆光口16个千兆光口+8个千兆Combo光电复用口管理型千兆工业以太网交换机机架式安装_北京汉源高科的博客-程序员ITS203

1,数据控制:支持802.3X全双工流控,支持网络风暴抑制2,冗余网络:支持STP/RSTP/MSTP,支持符合G.8032(ERPS)标准的以太环网保护技术(自愈时间&lt;30ms),保障网络的稳定性3,组播管理:支持IGMP Snooping V1/V2/V34,VLAN:支持IEEE 802.1Q VLAN,有效隔离广播域5,链路聚合:支持链路静态/动态聚合,提供完善的带宽利用率6,QOS:支持COSDSCP,4个队列,支持WRRSP调度模式7,安全管理:支持ACL访问控制列表,支持80

自己用qt编写的图片查看器_GreenHandBruce的博客-程序员ITS203

功能:1.能打开并显示所有QImage能识别的图片格式文件2.能缩放,拖动图片,Ctrl+右击还原到适应窗口大小3.右击可弹出菜单栏,菜单包括:适应宽度,适应窗口,原图大小,截图保存,批量重命名4.适应宽度的状态下,只能上下拖动图片5.左右方向键或者A和D键控制前后图片切换6.记录上一次关闭窗口时,窗口的位置和大小,并在下一次打开的时候按照该位置和大小显示窗口7.能接收拖动图片或者文...

CentOS7(8)安装/卸载MySQL_Java全栈小哥的博客-程序员ITS203

CentOS7(8)安装/卸载MySQL,另外通过本博客还能学会如何安装MySQL5.7

2020年第十五届全国大学生智能汽车竞赛技术报告_卓晴的博客-程序员ITS203

第十五届全国大学生智能汽车竞赛技术报告下载&nbsp;01基础四轮组 百度网盘下载链接::链接: https://pan.baidu.com/s/1SBmpET6oNkAUszGZVTQ8ow 提取码: dp9t序号技术报告名称1上海海洋大学 努力拿奖才队 基础四轮组.docx2东北大学 希望车没事队 四轮组技术报告.docx3中南民族大学 北纬30点49 基础四轮组.pdf4中国海洋大学 天生一队 四轮组.pdf5中国计量大学 赛博1

推荐文章

热门文章

相关标签