如何解释dalvik字节码
文档:
在Android系统源码目录dalvik\docs有相关指令文档
dalvik-bytecode.html

实战:
来直接实战模拟来理解枯燥的理论
用IDA打开一个dex文件, 设置显示指令


随便找一段代码


注意:
206E 28DE 0050是IDA的显示问题 在文件中的存储顺序是
6E 20 DE 28 50 00 

在WinHex搜索一下就知道了

上面截图的指令在文件中的排列顺序如下:
14 05 09 00 09 01
6E 20 DE 28 50 00
6E 20 81 29 04 00
6E 30 83 29 34 07
.....

我们分别对如上3个条指令做解释
1. 14 05 09 00 09 01
14 为操作码 (opcode) 去文档查询


3li表示 
第1个数字3表示指令由3个16位字组成
第2个数字1表示该条指令使用到1个寄存器
第3个字母i表示后面有一个32位立即数 

所以我们可以知道,这条指令一共有6个字节 其中4个字节是立即数

此时你肯定有疑问i哪里来的?
助记符 位大小 说 明
b 8 8位有符号立即数
c 16,32 常量池索引
f 16 接口常量(仅对静态链接格式有效)
h 16 有符号立即数(32位或64位数的高值位,低值位为0)
i 32 立即数,有符号整数或32位浮点数
l 64 立即数,有符号整数或64位双精度浮点数
m 16 方法常量(仅对静态链接格式有效)
n 4 4位的立即数
s 16 短整型立即数
t 8, 16, 32 跳转,分支
x 0 无额外数据

没错文档中后面的字母就可以查询上表的助记符


那么指令格式又如何约定呢?  instruction-formats.html


指令格式为: const VAA, #+BBBBBBBB
那么现在, 嗯! 又有一些很操蛋的约定了
● 每16位的字采用空格分隔开来。
● 每个字母表示4位,每个字母按顺序从高字节开始,排列到低字节。每4位之间可能使用竖线 “|” 来表示不同的内容。
● 顺序采用 A ~ Z 的单个大写字幕作为一个4位的操作码,op表示一个8位的操作码。
● “Φ” 来表示这字段所有位为0值

● 每条指令从操作码开始,后面紧跟参数,参数个数不定,每个参数之间采用逗号分开。
● 每条指令的参数从指令第一部分开始,op位于低8位,高8位可以是一个8位的参数,
   也可以是两个4位的参数,还可以为空,如果指令超过16位,则后面部       分一次作为参数
● 如果参数采用 “vX” 的方式表示,表示它是一个寄存器,如v0、v1等。
   这里采用v而不用r是为了避免与基于该虚拟机架构本身的寄存器名字产生冲突,如ARM架构寄存器命名采用r开头。
● 如果参数采用 “#+X” 的方式表示,表明它是一个常量数字。
● 如果参数采用 “+X” 的方式表示,表明它是一个相对指令的地址偏移。
● 如果参数采用 “kind@X” 的方式表示,表明它是一个常量池的索引值。其中kind表示常量池类型,它可以是 
    “string” 字符串常量池索引
    “type”   类型常量池索引
    “field    字段常量池索引
    “meth”  方法常量池索引

那么对于上面的指令 const VAA, #+BBBBBBBB
const                   op操作码
VAA                     8位来描述这个寄存器
#+BBBBBBBB      常量数值

于是有

14

05

09 00 09 01

op

寄存器下标

立即数

const

V5

0x01090009

最后翻译出指令 const V5, 0x01090009

2 .6E 30 83 29 34 07
同样的方法:
拿着6E查询dalvik-bytecode.html得到如下信息


指令格式下标为35c,拿着指令下表查询instruction-formats.html得到


对于6E 30 83 29 34 07
op = 6E
A   = 3
B   = 0
CCCC = 83 29
D = 4
E = 3
F = 7
G = 0

于是翻译成指令有
invoke-virtual {v4, v3, v7} kind@8329



4. 如何解释dalvik字节码的更多相关文章

  1. APK反编译之一:基础知识—APK、Dalvik字节码和smali文件

    refs: APK反编译之一:基础知识http://blog.csdn.net/lpohvbe/article/details/7981386 APK反编译之二:工具介绍http://blog.csd ...

  2. 【腾讯内部干货分享】分析Dalvik字节码进行减包优化

    http://wetest.qq.com/lab/view/?id=96?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.192184.TAS ...

  3. Dalvik字节码的类型,方法与字段表示方法

    Dalvik字节码有着自己的类型,方法与字段表示方法,这些方法与Dalvik虚拟机指令集一起组成了一条条的Dalvik汇编代码. 1.类型 Dalvik字节码只有两种类型,基本类型与引用类型.Dalv ...

  4. Android逆向基础----Dalvik字节码

    参考此微博,更多详细内容可以到这里查看 http://blog.csdn.net/dd864140130/article/details/52076515 Dalvik字节码 1.寄存器位32位,64 ...

  5. 安卓逆向学习---初始APK、Dalvik字节码以及Smali

    参考链接:https://www.52pojie.cn/thread-395689-1-1.html res目录下资源文件在编译时会自动生成索引文件(R.java ), asset目录下的资源文件无需 ...

  6. PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述

    本文简要介绍 zend 虚拟机解释执行字节码的基本逻辑以及相关的数据结构,关于 PHP 源代码的下载,编译,调试可以参考之前的系列文章 execute_ex 我们来看看执行一个简单的脚本 test.p ...

  7. 实例具体解释:反编译Android APK,改动字节码后再回编译成APK

    本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能 ...

  8. JVM 内部原理(二)— 基本概念之字节码

    JVM 内部原理(二)- 基本概念之字节码 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Enviro ...

  9. lua执行字节码的过程介绍

    前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...

随机推荐

  1. 如何用Nsight调试C# OpenGL程序

    https://devtalk.nvidia.com/default/topic/804306/nsight-visual-studio-edition/nsight-4-5-can-t-debug- ...

  2. TEXshade教程- 多重比对着色软件包

    多重比对着色软件包 TEXshade 图解安装教程   [絮语]: TEXshade 是 Latex 的一个宏包,可以对 MSF或 ALN 格式的多重比对文件以不同的方式进行着色美化,并可以对重要的位 ...

  3. super的作用(转自百度)

    super出现在继承了父类的子类中.有三种存在方式:第一种super.xxx;(xxx为变量名或对象名)这种方法意义为,获取父类中的名字为xxx的变量或方法引用.使用这种方法可以直接访问父类中的变量或 ...

  4. iOS 在UILabel显示不同的字体和颜色(转)

    转自:http://my.oschina.net/CarlHuang/blog/138363 在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串, ...

  5. dom.style.left 与 dom.offsetLeft区别

    dom.style.left    初始空值,必须在html行内样式定义值才有值,在css样式定义仍为空值                         可读写,是字符串,读写是必须加px,否则无效 ...

  6. jQuery版本升级踩坑大全

    背景 -------------------------------------------------------------------------------- jQuery想必各个web工程师 ...

  7. Java多线程编程核心技术--定时器

    Timer类主要负责计划任务,也就是在指定的时间开始执行某一个任务. 方法schedule(TimerTask task, Date time) public class Task { private ...

  8. hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律

    http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...

  9. Python学习手册(1入门知识-数据类型)

    UNIX env查找技巧 在一些UNIX系统上,可以用这样一种方法避免硬编码Python解释器的路径,在文件的特定的第一行注释中写上这样一句话. #! usr/bin/env/ python...sc ...

  10. SQL Server2005主从复制实现

    转自:http://blog.csdn.net/gaojier1000/article/details/5805814 一.     准备工作:1 .在发布服务器上建立一个共享目录,作为发布快照文件的 ...