专栏首页乱码三千smali语言之locals和registers的区别

smali语言之locals和registers的区别

介绍

对于dalviks字节码寄存器都是32位的,它能够表示任何类型,2个寄存器用于表示64位的类型(Long and Double)。

作用

声明于方法内部(必须)

.method public getName()V
    .registers 6 
	return-void
.end method

.registers和locals基本区别

在一个方法(method)中有两中方式指定有多少个可用的寄存器。指令.registers指令指定了在这个方法中有多少个可用的寄存器,

指令.locals指明了在这个方法中非参(non-parameter)寄存器的数量。然而寄存器的总数也包括保存方法参数的寄存器。

参数是如何传递的?

1.如果是非静态方法

例如,你写了一个非静态方法LMyObject;->callMe(II)V。这个方法有2个int参数,但在这两个整型参数前面还有一个隐藏的参数LMyObject;也就是当前对象的引用,所以这个方法总共有3个参数。 假如在一个方法中包含了五个寄存器(V0-V4),如下:

.method public callMe(II)V
 	const-string v0,"1"
    const-string v1,"1"
 
   return-void
.end method

那么只需用.register指令指定5个,或者使用.locals指令指定2个(2个local寄存器+3个参数寄存器)。如下:

.method public callMe(II)V
    .registers 5
 	const-string v0,"1"
    const-string v1,"1"
    v3==>p0
    V4==>P1
    V5==>P2
   
   return-void
.end method

或者
.method public callMe(II)V
    .locals 2
 	const-string v0,"1"
    const-string v1,"1"
   return-void
.end method

该方法被调用的时候,调用方法的对象(即this引用)会保存在V2中,第一个参数在V3中,第二个参数在v4中。

2.如果是静态方法

那么参数少了对象引用,除此之外和非静态原理相同,registers为4 locals依然是2

关于寄存器命名规则

v命名法

上面的例子中我们使用的是v命名法,也就是在本地寄存器后面依次添加参数寄存器,

但是这种命名方式存在一种问题:假如我后期想要修改方法体的内容,涉及到增加或者删除寄存器,由于v命名法需要排序的局限性,那么会造成大量代码的改动,有没有一种办法让我们只改动registers或者locals的值就可以了呢, 答案是:有的

v命名法之外,还有一种命名法叫做p命名法

p命名法

p命名法只能给方法参数命名,不能给本地变量命名

假如有一个非静态方法如下:

.method public print(Ljava/lang/String;Ljava/lang/String;I)V

以下是p命名法参数对应表:

p0

this

p1

第一个参数Ljava/lang/String;

p2

第二个参数Ljava/lang/String;

p3

第三个参数I

如前面提到的,long和double类型都是64位,需要2个寄存器。当你引用参数的时候一定要记住,例如:你有一个非静态方法

LMyObject;->MyMethod(IJZ)V

方法的参数为int、long、bool。所以这个方法的所有参数需要5个寄存器。

p0

this

p1

I

p2, p3

J

p4

Z

另外当你调用方法后,你必须在寄存器列表,调用指令中指明,两个寄存器保存了double-wide宽度的参数。

注意:在默认的baksmali中,参数寄存器将使用P命名方式,如果出于某种原因你要禁用P命名方式,而要强制使用V命名方式,应当使用-p/–no-parameter-registers选项。

总结

  • locals和registers都可以表示寄存器数量,locals指定本地局部变量寄存器个数,registers是locals和参数寄存器数量的总数,两者使用任选其一
  • 同时,寄存器命名一共分两种,一种是v命名法,另一种是p命名法

v0

the first local register

v1

the second local register

v2

p0

the first parameter register

v3

p1

the second parameter register

v4

p2

the third parameter register

本文分享自微信公众号 - 乱码三千(infree6),作者:有瓣知识

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • s002android逆向安全初级篇之android smali语法总结

    smali中有两类数据类型:基本类型和引用类型。 引用类型是指数组和对象,其他都是基础类型。

    上善若水.夏
  • Android逆向开发之smali语言的学习

    算法:正数的符号位是0,负数的符号位是1。正数的反码、补码与原码一样。负数的反码是让符号位不变,数据位按位取反;补码是将反码加1。

    乱码三千
  • smali基本语法

    Smali语法 ①基本数据类型 smali类型     java类型 V                  void Z                ...

    八神太一
  • [Android][Security] Android 逆向之 smali

    APK其实就是一个ZIP压缩包,将APK后缀改成ZIP后就可以解压出APK内部文件。

    wOw
  • s003android逆向安全初级篇之apk smali语法之实例分析

    .locals 0指明本有本地变量。于是以上三个形参分别对应的寄存器代号为p0,p1,p2

    上善若水.夏
  • Hades开源白盒审计系统V1.0.0

    为什么要开发这么一个白盒审计系统呢?其实,自己开发白盒审计系统的想法已经在我的脑海中存在很久了。一方面,之前大学毕业之后在白盒方面花了挺多时间的,不过由于各方面...

    C4rpeDime
  • 初涉静态调试 - 修改Smali

    Enmmm,还记得之前看反编译之后的结果,对于 Smali 文件,简直懵的要死。

    HLQ_Struggle
  • 如何安全地打印日志

    如何打印日志?这不是很简单,直接使用android.util.Log这个类不就行了?然而,日志属于非常敏感的信息;逆向工程师在逆向你的程序的时候,本来需要捕捉你...

    weishu
  • Frida免root使用

    Android版本: 9 MIUI版本: 11.0.5稳定版 手机型号: Redmi Note 8 CPU信息:

    无情剑客
  • Android逆向笔记 —— DEX 文件格式解析

    系列第一篇文章就分析过 Class 文件格式,我们都知道 .java 源文件经过编译器编译会生成 JVM 可识别的 .class 文件。在 Android 中,...

    路遥TM
  • c语言之define和typedef的区别

    宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符进行重新命令。被命名的标识符具有类型定义说明...

    西西嘛呦
  • 逆向APK进行smali注入实现“秒破WIFI”

    近期开始关注手机安全了,以往都是在PC上玩,对这个领域也想了解一下,可是拿什么来开刀呢?突然想起Wifi万能钥匙这个神器了,这个软件的wifi分享模式鄙人非常喜...

    FB客服
  • Android 逆向笔记 —— 一个简单 CrackMe 的逆向总结

    无意中在看雪看到一个简单的 CrackMe 应用,正好就着这个例子总结一下逆向过程中基本的常用工具的使用,和一些简单的常用套路。感兴趣的同学可以照着尝试操作一下...

    路遥TM
  • Android 无需权限显示悬浮窗, 兼谈逆向分析 App

    前言 最近 UC 浏览器中文版出了一个快速搜索的功能, 在使用其他 app 的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转...

    非著名程序员
  • Android 逆向--BUFF | Smali 介绍与学习

    静态分析反编译代码往往是逆向分析的第一步,在对代码逻辑大致了解后,我们就可以使用动态分析的方法验证猜想、加速分析和实现破解。

    Python编程与实战
  • 彻底弄懂dalvik字节码【三】0x01:0x02:0x03:0x04:0x05:

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

    用户2930595
  • 修改包名

    那么,在解包生成的目录下找到AndroidManifest.xml,着手修改package以及对应引用。

    HLQ_Struggle
  • 解密所有APP运行过程中的内部逻辑

    0x01前言 这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI...

    FB客服
  • Matlab 和 C 语言的区别

    MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和...

    AI 电堂

扫码关注云+社区

领取腾讯云代金券