吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3914|回复: 86

[原创逆向图文] 《从零开始学Android逆向(08)-什么是dalvik节字码》

  [复制链接]
174888 发表于 2020-2-21 15:35 | 显示全部楼层 |阅读模式

本帖最后由 174888 于 2020-2-21 15:40 编辑

前言    写这从零开始学破解的教程是因为有很多人想学习Android逆向但是不知道怎么去学习,网上教程是找到一大堆,但是大多讲的都杂乱无章,看了都看不懂的感觉,也有不少刚接触Android逆向或者说也学习了一段时间的逆向了.但是还是不知道自己学的啥,感到很迷茫.
    从今天开始我会通过写图文的教程方式手把手的教大家如何学习逆向.由于Android系统在电脑运行的特殊性,那么我们需要提前准备好可以调试运行安卓的环境以及各项工具的使用通用性,下面我会逐步讲解每一个详细的步骤.


    如果有不明白的小伙伴,可以私信给我,告诉我哪里没有看懂,我会在教程中再作补充.

    本教程还有后续内容,更新时间不固定,但会持续更新,目前我总结出来的差不多应该有200个帖子左右的内容,由浅及深,但由于我本人水平有限,关于更难的部分,我会在更靠后的章节部分来讲解,由于是免费分享给大家.所以本教程仅以图文方式展现,并无视频.

那么下面开始今天的课程吧:
1. dalvik指令格式
基础字节码-名称后缀/字节码后缀 目的寄存器源寄存

名称后缀是wide,表示数据宽度为64位
字节码后缀是from16,表示源寄存器为16位

move-wide/from16 vAA,vBBBB
                          move基础字节码,opcode
wide名称后缀,标识指令操作的数据宽度64位。
from16为字节码后缀,标识源一个16寄存器引用变量
vAA为目的寄存器, 它始终在源的前面,取值范围为v0~v255
vBBBB源寄存器,取值范围为v0~v65535

Dalvik 指令集中大多数指令用到了寄存器作为目的操作数或源操
作数,其中 A/B/C/D/E/F/G/H 代表一个4位的数值,  AA/BB/.../HH代表一个8位的数值,AAAA/BBBB/.../HHHH 代表一个16位的数值

接下来我们学习13种dalvik指令的使用。

1. 空操作指令
空操作指令的助记符为nop。它的值为00,通常nop指令被用来
作对齐代码之用,无实际操作。


2. 数据操作指令
move

Move vA,vB  vB寄存器的值赋给vA寄存器,源寄存器与目的寄存器都为4位。
Move/form16 vAA,vBBBB  vBBBB寄存器的值赋给vAA寄存器,源寄存器为16位,目的寄存器为8位。

“move-wide vA, vB”:为4位的寄存器对赋值。源寄存器与目的寄存器都为4位。

“move-object vA, vB”:object是对象的意思,出现这个词即为对象。那这里就是为对象赋值。源寄存器与目的寄存器都为4位。

“move-object/from16 vAA, vBBBB”:为对象赋值。源寄存器为16位,目的寄存器为8位。

“move-object/16 vAA, vBBBB”:为对象赋值。源寄存器与目的寄存器都为16位。
“move-result vAA”:将上一个invoke类型指令操作的单字非对象结果赋给vAA寄存器。

“move-result-wide vAA”:将上一个invoke类型指令操作的双字非对象结果赋给vAA寄存器。

“move-result-object vAA":将上一个invoke类型指令操作的对象结果赋给vAA寄存器。

“move-exception vAA”:保存运行时发生的异常到vAA寄存器,


分析了这么多,总结起来move指令有三种作用:
第一种作用:进行赋值操作
第二种作用:move-result 接收方法返回值操作
第三种作用:处理异常的操作


3.返回指令(重点)
return就是返回的意思,大家根据这个英文就可以理解啦。

“return-void”:表示函数从一个void方法返回,返回值为空。

  “return vAA”:表示函数返回一个32位非对象类型的值,返回值寄存器为8位的寄存器vAA。

  “return-wide vAA”:表示函数返回一个64位非对象类型的值,返
回值为8位的寄存器对vAA。

  “return-object vAA”:这里面出现了object,表示函数返回一个
对象类型的值。返回值为8位的寄存器vAA。

4数据定义指令(重点)
数据定义指令用来定义程序中用到的常量,字符串,类等数据。

“const/4 vA, #+B”:将数值符号扩展为32位后赋给寄存器vA。

“const/16 vAA, #+BBBB”:将数据符号扩展为32位后赋给寄存器
vAA。
“const vAA, #+BBBBBBBB”:将数值赋给寄存器vAA。

“const/high16 vAA, #+BBBB0000“:将数值右边零扩展为32位后赋给
寄存器vAA。

“const-wide/16 vAA, #+BBBB”:将数值符号扩展为64位后赋给寄存
器对vAA。

“const-wide/32 vAA, #+BBBBBBBB”:将数值符号扩展为64位后赋给
寄存器vAA。

“const-wide vAA, #+BBBBBBBBBBBBBBBB”:将数值赋给寄存器vAA。

“const-wide/high16 vAA, #+BBBB000000000000”:将数值右边零扩展
64位后赋给寄存器vAA。

“const-string vAA, string@BBBB”:
通过字符串索引构造一个字符串并赋给寄存器vAA。

“const-string/jumbo vAA, string@BBBBBBBB”:
通过字符串索引(较大)构造一个字符串并赋给寄存器vAA。

“const-class vAA, type@BBBB”:通过类型索引获取一个类引用并赋给寄存器vAA。

“const-class/jumbo vAAAA, type@BBBBBBBB”:
通过给定的类型索引获取一个类引用并赋给寄存器vAAAA。
这条指令占用两个字节,值为0xooff(Android4.0中新增的指令)。


5.实例操作指令
“check-cast vAA, type@BBBB”:check-cast v0 ,
vAA寄存器中的对象引用转换成指定的类型。
如果失败会报ClassCastException异常。
如果类型B指定的是基本类型,对于非基本类型的A来说,运行时
始终会失败。

“instance-of vA, vB, ”:
判断vB寄存器中的对象引用是否可以转换成指定的类型。
如果可以vA寄存器赋值为1,否则vA寄存器赋值为0。

“new-instance vAA, type@BBBB”:
构造一个指定类型对象的新实例,并将对象引用赋值给vAA寄存器。类型符type指定的类型不能是数组类。

6、数组操作指令
数组操作包括获取数组长度,新建数组,数组赋值,数组元素取值与赋值等操作。

“array-length vA, vB”:
获取给定vB寄存器中数组的长度并将值赋给vA寄存器。
数组长度指的是数组的条目个数。

“new-array vA, vB, type@CCCC”:
构造指定类型(type@CCCC)与大小(vB)的数组,并将值赋给vA寄存器。

  “filled-new-array {vC, vD, vE, vF, vG},type@BBBB”
构造指定类型(type@BBBB)与大小(vA)的数组并填充数组内容。vA寄存器是隐含使用的,除了指定数组的大小外还指定了参数的个数,vC~vG是使用到的参数寄存序列。

  “filled-new-array/range {vCCCC  ..vNNNN}, type@BBBB”:
指令功能与“filled-new-array {vC,vD,vE,vF,vG},type@BBBB”相同,只是参数寄存器使用range字节码后缀指定了取值范围 ,vC是第一个参数寄存器,N = A +C -1。

“fill-array-data vAA, +BBBBBBBB”:
用指定的数据来填充数组,vAA寄存器为数组引用,引用必须为基
础类型的数组,在指令后面会紧跟一个数据表。

7、异常指令
“throw vAA”抛出vAA寄存器中指定类型的异常。


8、跳转指令(重点)
跳转指令用于从当前地址跳转到指定的偏移处。
Dalvik指令集中有三种跳转指令
        1)goto:无条件跳转
        2)switch:分支跳转
             packed-switch:有规律跳转
sparse-switch: 无规律跳转
        3)if:条件跳转            
           if-eq:等于/if-ne:不等于
             if-lt:小于/if-le:小于等于
             if-gt:大于/if-ge:大于等于
             if-eqz:等于0/if-nez:不等于0
             if-ltz:小于0/if-lez:小于等于0
             if-gtz:大于0/if-gez:大于等于0

9、比较指令(cmp)
        比较指令用于对两个寄存器的值(浮点型或长整型)进行比较。
        大于(1)/等于(0)/小于(-1)=>cmpg、cmp
例子:cmpg  v1,v2,v3
大于(-1)/等于(0)/小于(1)=>cmpl

        例如:cmp-long vAA, vBB, vCC
              比较两个长整型数。如果vBB寄存器大于vCC寄存器,
则结果为1,相等则结果为0,小则结果为-1。

        例如:cmpl-float vAA, vBB, vCC
                 比较两个单精度浮点数。如果vBB寄存器大于vCC寄存器,
结果为-1,相等则结果为0,小于的话结果为1。

        例如:cmpl-double vAA, vBB, vCC
             比较两个单精度浮点数。如果vBB寄存器大于vCC寄存器,
结果为-1,相等则结果为0,小于的话结果为1。

        例如:cmpg-float vAA, vBB, vCC
            比较两个单精度浮点数。如果vBB寄存器大于vCC寄存器,
结果为-1,相等则结果为0,小于的话结果为1。


例如:cmpg-double vAA, vBB, vCC
             比较两个单精度浮点数。如果vBB寄存器大于vCC寄存器,
结果为-1,相等则结果为0,小于的话结果为1。


10、字段操作指令
        普通字段 => iget读 / iput 写
        静态字段 => sget读 / sput 写


11、方法调用指令(重点)
          根据方法类型不同,共有5条方法调用指令
        invoke-virtual :调用实例的虚方法 =java当中的普通方法
        invoke-super :调用实例的父类/基类方法
        invoke-direct :调用实例的直接方法  构造方法,静态语句块
        invoke-static :调用实例的静态方法
        invoke-interface :调用实例的接口方法


12、数据转换指令
数据转换指令用于将一种类型的数值转换成另一种类型。
它的格式为“opcode vA, vB”,vB寄存器存放需要转换的数据,转换后的结果保存在vA寄存器中。

        neg-数据类型 => 求补
        not-数据类型 => 求反
        数据类型1-to-数据类型2 => 将数据类型1转换为数据类型2
int-to-float  v1,v1

13、数据运算指令
        add/sub/mul/div/rem         /减/乘/除/取余
add-int v0, p1, p2
v0 = p1 + p2
sub-int v0, p1, p2
v0 = p1 - p2
mul-int v0, p1, p2
v0 = p1 * p2

div-int v0, p1, p2
v0 = p1 / p2
rem-int v0, p1, p2
v0 = p1 % p2



        and/or/xor  与/或/异或
and-int v0, p1, p2
v0 = p1 & p2
全1为1,有0为0
or-int v0, p1, p2
v0 = p1 │ p2
有1为1,全0为0
xor-int v0, p1, p2
v0 = p1 ^ p2
相同为0,不同为1



        shl/shr/ushr        有符号左移/有符号右移/无符号右移

shl-int/2addr v0, v1
v0 = v0 << v1
shr-int/2addr v0, v1
v0 = v0 >> v1
ushr-int/2addr v0, v1
v0 = v0 >>> v1


===============================


《从零开始学Android逆向(01)-逆向环境搭建-JDK的安装与配置》
https://www.52hb.com/thread-45952-1-1.html
(出处: 吾爱汇编论坛)

《从零开始学Android逆向(02)-逆向环境搭建-SDK与NDK的安装与配置》
https://www.52hb.com/thread-45953-1-1.html
(出处: 吾爱汇编论坛)

《从零开始学Android逆向(03)-APK的文件结构》
https://www.52hb.com/thread-45955-1-1.html
(出处: 吾爱汇编论坛)

《从零开始学Android逆向(04)-APK的打包流程》
https://www.52hb.com/thread-45957-1-1.html
(出处: 吾爱汇编论坛)

《从零开始学Android逆向(05)-APK的安装流程》
https://www.52hb.com/thread-46022-1-1.html
(出处: 吾爱汇编论坛)

《从零开始学Android逆向(06)-ADB常用命令指令集》
https://www.52hb.com/thread-46023-1-1.html
(出处: 吾爱汇编论坛)

《从零开始学Android逆向(07)-什么是dalvik虚拟机》
https://www.52hb.com/thread-46024-1-1.html
(出处: 吾爱汇编论坛)

下次更新->如何配置Androidkiller与使用!


依次帖子更新内容如下:
如何配置Androidkiller与使用
如何篡改APK的名称与图标.
怎样修改包名和实现应用的分身
如何通过修改AndroidManifest.xml去除单机游戏的广告
更多精彩内容,容我慢慢更新,本次帖子仅更新在吾爱汇编论坛.非允许,请勿转载~

评分

参与人数 26HB +23 THX +10 收起 理由
虚心学习 + 1
459121520 + 1
sjtkxy + 1 + 1
行行行行行行 + 1
消逝的过去 + 1
冷亦飞 + 1
l278785481 + 1
小菜虫 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
weiran324 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
zyyujq + 1 + 1
zoe + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
temp + 1
playboy + 1
zwj00544 + 1 + 1
无影无踪 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
五毒之首 + 1
上帝的恩赐 + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
我是好人 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
ldljlzw + 1
成丰羽 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
拿着雪糕 + 1 + 1
liugu0hai + 1 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
mengzhisuoliu + 1
mengzhisuoliu1 + 1
woyao + 1 + 1
liurong2000 + 1

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
拿着雪糕 发表于 2022-2-2 16:08 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Rrquk3 发表于 2022-2-22 22:08 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
xZHX 发表于 2022-2-22 22:29 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
雪很冷 发表于 2022-2-22 22:30 | 显示全部楼层


谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
XxrIL25901 发表于 2022-2-22 22:30 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
NkjsCOYQeKqH 发表于 2022-2-22 23:07 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hldcY791 发表于 2022-2-23 00:17 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
军工强国 发表于 2022-2-23 13:03 | 显示全部楼层

谢谢分享。楼主NB
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zXuEQvVk480 发表于 2022-3-1 00:24 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表