Android_smali_代码注入

//日志注入

const-string v8, "----->parameter1:"

invoke-static {v8, p1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

   

//栈跟踪信息记录了程序从启动到printStackTrace()被执行期间所有被调用过的方法。

# virtual methods

.method public stack()V

    .locals 2

    .prologue

.line 20

    new-instance v0, Ljava/lang/Exception;

    const-string v1, "----->print trace"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V

    .line 21

    return-void

.end method

//转换string输出

//publicstaticvoid main(String[] args) {

// int number = 0;

// Log.i("----->", String.valueOf(number));

//}

.method public static main([Ljava/lang/String;)V

    .locals 3

    .parameter "args"

    .prologue

    .line 11

    const/4 v0, 0x0

.line 12

.local v0, number:I

    const-string v1, "----->"

    invoke-static {v0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;

    move-result-object v2

    invoke-static {v1, v2}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

    .line 13

    return-void

.end method

//byte数组转换字符串

# virtual methods

.method public byteToString([B)V

    .locals 3

    .parameter "paramArrayOfByte"

.prologue

:try_start_0

    new-instance v1, Ljava/lang/String;

    const-string v2, "UTF-8"

    invoke-direct {v1, p1, v2}, Ljava/lang/String;-><init>([BLjava/lang/String;)V

    .local v1, string:Ljava/lang/String;

    const-string v2, "----->"

invoke-static {v2, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

    :try_end_0

    .catch Ljava/io/UnsupportedEncodingException; {:try_start_0 .. :try_end_0} :catch_0

    .end local v1           #string:Ljava/lang/String;

    :goto_0

    return-void

    :catch_0

    move-exception v0

    .local v0, e:Ljava/io/UnsupportedEncodingException;

    invoke-virtual {v0}, Ljava/io/UnsupportedEncodingException;->printStackTrace()V

goto :goto_0

.end method

//另一种byte数组转换字符串

new-instance v6, Ljava/lang/String;

invoke-direct {v6, v0}, Ljava/lang/String;-><init>([B)V

const-string v5, "----->d.smali_b([BIII)[B_return"

invoke-static {v5, v6}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

//JSON转字符串

   //v0寄存器代表JSONObject

   const-string v1, "-->json"

   invoke-virtual {v0}, Lorg/json/JSONObject;->toString()Ljava/lang/String;

   move-result-object v2

   invoke-static {v1, v2}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

则是因为很多指令不能够使用大于15的寄存器,故应该加上“move-object/from16 v1, px”语句进行转换。

//调用对象的toString方法 输出

   invoke-virtual {p0}, Lcom/huawei/appmarket/datasource/pojo/b;->toString()Ljava/lang/String;

   move-result-object v3

   const-string v2, "@@@@@>1a>pojo"

   invoke-static {v2, v3}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

//Int转换string

const-string v1, "----->"

    invoke-static {v0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;

    move-result-object v2

    invoke-static {v1, v2}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//for( : ) 遍历

.method public static main([Ljava/lang/String;)V

    .locals 4

    .parameter "args"

    .prologue

    .line 18

    new-instance v0, Ljava/util/ArrayList;

    invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V

    .line 19

    .local v0, list:Ljava/util/List;,"Ljava/util/List<Ljava/lang/String;>;"

    const-string v2, "a"

    invoke-interface {v0, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 20

    const-string v2, "b"

    invoke-interface {v0, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 21

    const-string v2, "c"

    invoke-interface {v0, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 22

    const-string v2, "d"

    invoke-interface {v0, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 24

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;   #获取集合迭代器

    move-result-object v2

    :goto_0  #迭代循环开始

    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z #开始迭代

    move-result v3

    if-nez v3, :cond_0 #如果迭代器不为空就跳走

    .line 27

    return-void

    .line 24

    :cond_0

    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;  #循环获取每一项

    move-result-object v1 

    check-cast v1, Ljava/lang/String;

    .line 25

    .local v1, string:Ljava/lang/String;

    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;

    invoke-virtual {v3, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    goto :goto_0   #跳转到循环开始处

.end method

//for (int i = 0; i < 10; i++) {

// System.out.println(i);

//}

.method public static main([Ljava/lang/String;)V

    .locals 2

    .parameter "args"

    .prologue

    .line 15

    const/4 v0, 0x0

    .local v0, i:I #初始化v0为0

    :goto_0  #循环开始

    const/16 v1, 0xa

    if-lt v0, v1, :cond_0 #判断v0小于v1,则跳转到cond_0标号处

    .line 18

    return-void

    .line 16

    :cond_0

    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V

    .line 15

    add-int/lit8 v0, v0, 0x1 #下一个索引

    goto :goto_0   #跳转到循环起始处

.end method

int number = 1;

      switch (number) {

      case 0:

         System.out.println(0);

         break;

      case 1:

         System.out.println(1);

         break;

      case 2:

         System.out.println(2);

         break;

      case 3:

         System.out.println(3);

         break;

      default:

         break;

}

.method public static main([Ljava/lang/String;)V

    .locals 3

    .parameter "args"

    .prologue

    .line 15

    const/4 v0, 0x1

    .line 16

    .local v0, number:I

    packed-switch v0, :pswitch_data_0 #packed-switch分支,pswitch_data_0指定case区域

.line 32

    :goto_0  #所有case的出口

    return-void

    .line 18

    :pswitch_0

    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const/4 v2, 0x0   #case 0

    invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(I)V

    goto :goto_0 #跳转到goto_0标号处

    .line 21

    :pswitch_1

    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const/4 v2, 0x1   #case 1

    invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(I)V

    goto :goto_0 #跳转到goto_0标号处

    .line 24

    :pswitch_2

    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const/4 v2, 0x2   #case 2

    invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(I)V

    goto :goto_0 #跳转到goto_0标号处

    .line 27

    :pswitch_3

    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const/4 v2, 0x3   #case 3

    invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(I)V

    goto :goto_0 #跳转到goto_0标号处

    .line 16

    nop

    :pswitch_data_0

    .packed-switch 0x0   #case区域,从0开始,依次递增

        :pswitch_0

        :pswitch_1

        :pswitch_2

        :pswitch_3

    .end packed-switch

.end method

//写文件

publicvoid writeFileData(String fileName, String message) {

try {

FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);

byte[] bytes = message.getBytes();

fout.write(bytes);

   fout.close();

} catch (Exception e) {

   e.printStackTrace();

}

}

---------------------------------------------------------------------------------------

//调用

    const-string v0, "001.txt"

    const-string v1, "test"

    invoke-virtual {p0, v0, v1}, Lcom/example/writefiles/MainActivity;->writeFileData(Ljava/lang/String;Ljava/lang/String;)V

---------------------------------------------------------------------------------------

.method public writeFileData(Ljava/lang/String;Ljava/lang/String;)V

    .locals 4

    .parameter "fileName"

    .parameter "message"

    .prologue

    .line 27

    const/4 v3, 0x0

    :try_start_0

    invoke-virtual {p0, p1, v3}, Lcom/example/writefiles/MainActivity;->openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;

    move-result-object v2

    .line 28

    .local v2, fout:Ljava/io/FileOutputStream;

    invoke-virtual {p2}, Ljava/lang/String;->getBytes()[B

    move-result-object v0

    .line 29

    .local v0, bytes:[B

    invoke-virtual {v2, v0}, Ljava/io/FileOutputStream;->write([B)V

    .line 30

    invoke-virtual {v2}, Ljava/io/FileOutputStream;->close()V

    :try_end_0

    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

    .line 34

    .end local v0           #bytes:[B

    .end local v2           #fout:Ljava/io/FileOutputStream;

    :goto_0

    return-void

    .line 31

    :catch_0

    move-exception v1

    .line 32

    .local v1, e:Ljava/lang/Exception;

    invoke-virtual {v1}, Ljava/lang/Exception;->printStackTrace()V

    goto :goto_0

.end method

原文地址:https://www.cnblogs.com/xiaomaoyvtou/p/3490373.html