zoukankan      html  css  js  c++  java
  • 安卓逆向学习---深入Smali文件

    参考:https://www.52pojie.cn/thread-396966-1-1.html

    • Smali中的包信息

      .class public Lcom/aaaaa;    //他是com.aaaaa这个package下的一个类。

      .super Lcom/bbbbb;        //继承自com.bbbbb这个类。

      .source "ccccc.java"        //这是一个有ccccc.java编译得到的Smali文件。

    • Smali中的声明

      一般来说是这个样子:

      # annotations 

      .annotation system Ldalvil/annotation/MemberClasses;

      value = {

      Lcom/aaa$qqq;,

      Lcom/aaa$www;

      }

      .end annotation

      这个声明是内部类的声明:aaa这个类他有两个成员内部类--qqq和www,内部类在后面提及。

    • 寄存器知识补充:

      在Smali里所有操作均通过寄存器来进行:

      本地寄存器用v开头,数字结尾来表示,eg:v0,v1,v2等等

      参数寄存器使用p开头,数字结尾的符号来表示,eg:p0,p1,p2等等。

        特备注意:p0不一定是函数中的第一个参数,在非static函数,p0代指“this”,p1表示第一个参数,p2为第二个参数。

              在static函数中,p0为第一个参数(因为java中的static方法中没有this方法)。

    • 寄存器简单实例分析:

      const/4 v0,0x1    //使用v0本地寄存器,并把值0x1(1为true)存到v0中

      iput-boolean v0,p0,Lcom/aaa;->lsResistered:Z    //用 iput-boolean 这个指令把v0中的值存放到com.aaa.isRegistered这个成员变量中。

      以上两条指令相当于:this.isRegistered = true;(非static函数中p0代表的是“this”,在这里就是com.aaa实例)。

    • 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”后缀表示操作得成员变量对象为基本数据类型,有的表示成员变量是对象类型,特别地,boolean类型使用带有“-boolean”的指令集和)。

    • Smali成员变量指令简析(一)  

      sget-object v0,Lcom/aaa->ID:Ljava/lang/String;    //获取ID这个String类型的成员变量并放到vo这个寄存器中。

      sget-object 就是用来获取变量值并保存到紧接着的参数的寄存器中,在上例中,获取ID这个String类型的成员变量并放到vo这个寄存器中。

      注意:前面需要该变量所属的类的类型,后面需要加一个冒号和该成员变量的类型,中间是“->”表示所属关系。

    • Smali成员变量指令简析(二)

      iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;

      从上例看到,iget-object指令比sget-object多了一个参数,就是该变量所在类的实例,在这里就是p0即“this”。

      获取array的话使用aget和aget-object,指令使用和上述一致。

    • Smali成员变量指令简析(三)

      put指令使用和get指令是统一的,如下:

      const/4 v3,0x0

      sput-object v3,Lcom/aaa;->timer:Lcom/aaa/timer;

      相当于:this.timer = null;    //赋值object所以是null,若是Boolean赋值则为false(因为0x0 ;0为false,1为true)。

    • Smali成员变量指令简析(四)

      .local v0,args:Landroid/os/Message;

      const/4 v1,0x12      //0x12位16进制,变为十进制为18

      iput v1,v0,Landroid/os/Message;->what:l

      相当于:args.what = 18;  (args是Message的实例)

  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/BANLOONG/p/10369084.html
Copyright © 2011-2022 走看看