寄存器 Registers
描述smali文件中寄存器的具体信息,并概括在dalvik字节码中的信息。
介绍Introduction
在dalvik字节码中,寄存器总是32位,能够保存任何类型的值。2个寄存器用来保存64位的类型(Long和Double)。
说明方法中寄存器的个数
有两种方法指定方法中有多少个寄存器可用。类似 .registers的指令,指明了方法中总的寄存器数目;另一中 .locals指令,指明了方法中不包括参数(函数入参)在内的寄存器数目。方法中总的寄存器数目包括保存locals(本地变量)所需的和保存函数参数所需的寄存器数目。
方法的参数是怎样传递到方法中的?
当一个方法被调用时,方法的参数被放置在最后几个寄存器中。如果一个方法有2个入参和注册了5个寄存器(v0-v4),参数被放置在最后2个寄存器,v3和v4.
非静态方法的第一个参数总是调用改方法的对象(可以理解为this指针)。
例如,你写了一个静态方法,LMyObject;->callMe(II)V.这个方法有2个整形参数,但是在两个整形参数之前,它还有一个隐藏的参数LMyObject;,因此改方法的参数总数是3.
假设你通过.register 5(v0-v4)或者.locals 2指令(2个本定寄存器加3个参数寄存器),指定在方法中有5个寄存器可用。当这个方法被调用时,调用改方法的对象将被保存在v2寄存器中,第一个整形参数保存在v3中,第二个整形参数保存在v4中。
静态方法与此类似,只不过没有隐藏的this参数。
寄存器的名称
寄存器有2种命名设计,正常的v命名和为了参数设计的p命名。p命名方案中的p0是指方法中的第一个参数。让我们回到上一个例子当中,方法有3个参数,共5个寄存器。下面的表格表明了v命名方案中每个v参数和相应的p命名方案中的p参数。
v0 第一个本地寄存器
v1 第二个本地寄存器
v2 p0 第一个参数寄存器
v3 p1 第二个参数寄存器
v4 p2 第三个参数寄存器
引用参数寄存器时,这两种命名方式都可以采用。
引入参数寄存器的动机
作为一个特例,引入p命名方案的参数寄存器,是为了在编辑smali代码时解决一个常见的烦恼。
假设你现在有一个有大量参数的方法,并要向里面添加一些代码,这时你发现你需要一个额外的寄存器。你会认为,这是一个小事,增加 .registers指令后面跟的number就好。
不幸的是,事情并不是那么简单,要记住的是方法的参数保存在最后几个寄存器当中。如果你增加寄存器的数量,你就改变了保存方法参数的寄存器。这样你就必须要改变.register指令并且改变每一个参数寄存器的号码。
但是如果在方法中,p命名方法被用来指示参数寄存器,你可以简单的改变方法中参数寄存器的数目,而不用担心改变任何现存的寄存器的号码。
注意:默认的,baksmali对参数寄存器使用p命名方案。如果你想把这部分功能关调,强制要求baksmali使用v命名方案,你可以使用-p/--no-parameter-registers option.
Long/Double values
正如前面所提到的,long和double类型(缩写是J和D)是64位的值,它们需要2个寄存器。当你要引用函数参数的时候,这一点要记住。例如假设你有一个方法(非静态的)LMyObject;->MyMethod(IJZ)V. 方法的参数是LMyObject;,int,long,bool.因此这个方法需要5个寄存器保存参数。
p0 this
p1 I
p2,p3 J
p4 Z
并且,在你随后调用这个方法得时候,你必须在调用指令的寄存器列表中,为任何一个double长度的参数指定一个双寄存器。
分享到:
相关推荐
"Android反编译-全部工具包"提供了一个便捷的方式,将所有必要的反编译工具集合在一起,使得开发者无需分别下载和配置各个工具。下面,我们将详细介绍这个工具包中包含的组件及其用途。 1. **Apktool**:Apktool是...
本文将详细介绍Android反编译工具及其在Android反向工程中的应用。 首先,让我们了解一下什么是Android反编译。反编译是将已编译的二进制代码转换回接近原始源代码的过程。对于Android应用,这意味着将Dalvik字节码...
本文将深入探讨“android 反编译smali工具”,包括smali、smali-1.4.2.jar、baksmali-1.4.2.jar以及baksmali这四个工具,它们在Android反编译流程中的作用和使用方法。 首先,我们要知道,Android应用程序主要由...
android反编译工具---逆向助手,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/78533913
标题中的“Android反编译工具包(最完整的Android反编译工具包)”表明这是一个集合了多种工具的资源包,用于帮助开发者和安全研究人员进行APK的反编译工作。 首先,让我们来了解一下反编译的基本概念。反编译是将已...
### Android 反编译与smali语法:ROM适配的关键技术 #### 一、引言 在Android开发领域,反编译技术与smali语法的应用是进行深度定制、ROM适配以及逆向工程的重要手段。smali作为一种中间语言,与dalvik虚拟机紧密...
### baksmali 下载使用 #### 资源下载 [source -> 资源下载](https://github.com/JesusFreke/smali) ...[Android反编译工具baksmali最新版的使用方法]( https://blog.csdn.net/qysh123/article/details/79023007)
这通常涉及到使用各种Android反编译工具。这些工具可以帮助开发者、安全研究人员或者逆向工程师理解已编译的Android应用程序的工作原理。下面我们将详细探讨一些常用的Android反编译工具及其应用。 1. **Apktool**...
这篇“Android菜鸟日记25-android反编译”将带你走进Android反编译的世界,揭示APK背后的秘密。 首先,让我们了解什么是Android反编译。Android应用主要由Java语言编写,经过编译后生成Dalvik字节码(.dex文件),...
Android开发过程中,有时候为了分析APK的内部结构、理解代码逻辑或者进行二次开发,开发者可能需要对APK进行反编译。在这个场景下,`dex2jar`是一个非常实用的工具,它能将Android应用中的.dex(Dalvik执行二进制...
由于Android系统不直接支持Java字节码,因此反编译后的smali代码是理解APK行为的关键。通过编辑smali代码,我们可以对原始Java方法进行调整,实现代码注入、功能修改等目的。 同时,apk改之理还提供了与class文件...
本篇文章将详细介绍四个常用的Android反编译工具——Apktool、dex2jar、JD-GUI以及Smali2Java,并阐述它们各自的功能和使用场景。 1. Apktool Apktool是由IzzySoft开发的一款强大的Android反编译工具,它主要用于...
Android反编译工具Apktool是一款强大的开源工具,主要用于安卓应用程序(APK)的解包、反编译、修改和重新打包。版本2.9.3是该工具的一个更新版本,提供了一些修复和改进,以增强用户体验和处理各种APK文件的能力。...
本压缩包"反编译-反混淆-jadx-1.2.0.48-012f7665.rar"提供了一款名为jadx的工具,这是一款专门针对Java和Android应用的反编译器。接下来,我们将详细探讨这两个主题及其关联的工具。 首先,让我们了解什么是反编译...
本教程将围绕"android安卓app反编译apk反编译教程"这一主题,详细讲解如何进行APK反编译,以及涉及到的相关知识点。 首先,我们要理解什么是APK反编译。APK是Android应用的安装包,包含了应用的所有资源、代码和元...
本文将深入探讨Android反编译的相关知识,包括为什么要反编译,常用的工具,以及如何使用这些工具。 一、为什么进行Android反编译 1. 安全分析:开发者或安全研究人员可以通过反编译来检查应用是否存在潜在的安全...
在Android开发领域,有时我们需要对已有的APK文件进行反编译和二次打包,以便于研究其内部结构、修改代码或资源,甚至实现定制化的需求。"android反编译,二次打包一套工具"是一个集合了相关工具的压缩包,主要包含...
本篇文章将详细探讨三种常用的Android反编译工具:Apktool、dex2jar以及JD-GUI。 首先,Apktool是一款强大的Android资源反编译工具,由IzzySoft开发。它能够解包APK文件,提取出其中的XML布局文件、图片资源、字符...
除了dex2jar之外,还有一些其他的Android反编译工具,如Apktool用于解包和重新打包APK,Smali/Baksmali用于直接处理DEX文件,以及Frida和Xposed框架用于动态代码注入和调试。 7. **安全与防护**: 开发者可以通过...
在Android开发领域,有时我们需要对APK文件进行反编译以了解其内部结构、源代码逻辑或进行二次开发。本文将深入探讨Android反编译的相关知识,包括为什么要进行反编译,常用工具介绍,以及反编译过程的详细步骤。 ...