zoukankan      html  css  js  c++  java
  • (2.0)Smali系列学习之Smali语法

    一.smali的包中信息

    .class  public Lcom/aaaaa;
    .super  Lcom/bbbbb;
    .source "ccccc.java"

    1.它是com.aaaaa这个package下的类
    2.继承自com.bbbbb
    3.由ccccc.java编译得到的smali文件

    二.smali中的声明

    # annotations
     .annotation system Ldalvik/annotation/MemberClasses;
      value = {Lcom/aaa$qqq;,
            Lcom/aaa$www;
          }
    .end annotation

    这个声明是内部类的声明:aaa这个类它有两个成员内部类——qqq和www。

    三.寄存器

    本地寄存器用v开头数字结尾的符号来表示,如v0、v1、v2、...
    参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2、...

    注意:p0不一定是函数中的第一个参数,在非static函数中,p0代指“this”,p1表示函数的第一个参数,p2代表函数中的第二个参数…而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法。

    简单分析:
    const/4  v0, 0x1
    iput-boolean  v0, p0, Lcom/aaa;->IsRegistered:Z

    上面两句smali代码,首先使用本地v0寄存器,并将0x1存到v0中,然后第二句用iput-boolean这个指令把v0中的值存放到com.aaa.IsRegistered这个成员变量中。

    相当于:this.IsRegistered=v0;

    四.smali中的成员变量

    成员变量格式是:
    .field public/private [static] [final] varName:<类型>。

    对于不同的成员变量也有不同的指令。

    一般来说,
    获取的指令有:iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等。
    操作的指令有:iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等。

    没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地,boolean类型则使用带“-boolean”的指令操作。

    五.Smali成员变量指令简析

    1.sget-object v0, Lcom/aaa;->ID:Ljava/lang/String;
    sget-object就是用来获取变量值并保存到紧接着的参数的寄存器中
    本例中,它获取ID这个String类型的成员变量并放到v0这个寄存器中。
    注意:前面需要该变量所属的类的类型,后面需要加一个冒号和该成员变量的类型,中间是“->”表示所属关系。

    2.iget-object v0, p0, Lcom/aaa;->view:Lcom/aaa/view;
    可以看到iget-object指令比sget-object多了一个参数,就是该变量所在类的实例,在这里就是p0即“this”。

    3.sput指令的使用
    const/4 v3, 0x0
    sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;
    相当于:this.timer=null

    4.iput指令的使用
    .local v0, args:Landroid/os/Message;
    const/4 v1, 0x12
    iput v1, v0, Landroid/os/Message;->what:I
    相当于:args.what = 18;

    https://www.cnblogs.com/linwx/p/7965893.html

  • 相关阅读:
    centos 安装 TortoiseSVN svn 客户端
    linux 定时任务 日志记录
    centos6.5 安装PHP7.0支持nginx
    linux root 用户 定时任务添加
    composer 一些使用说明
    laravel cookie写入
    laravel composer 安装指定版本以及基本的配置
    mysql 删除重复记录语句
    linux php redis 扩展安装
    linux php 安装 memcache 扩展
  • 原文地址:https://www.cnblogs.com/eustoma/p/8990449.html
Copyright © 2011-2022 走看看