Android逆向破解:Smali的HelloWorld

2020-12-13  本文已影响0人  itfitness

目录

目录

编写Hello World代码

.class public LHelloWorld; #类名
.super Ljava/lang/Object; #父类名

.method public static main([Ljava/lang/String;)V #声明静态main方法
    .registers 4 #方法使用的寄存器的数量,v0、v1、v2还有一个参数寄存器共四个
    .prologue   #代码起始指令

    #空指令
    nop
    nop

    #数据定义指令
    const/16 v0,0x8 #值为8
    const/4 v1,0x5  #值为5
    const/4 v2,0x3  #值为3

    #数据操作指令
    move v1,v2  #将v2的值赋给v1

    #数组操作指令
    new-array v0,v0,[I #创建一个长度为8的int型数组,并用v0来存储
    array-length v1,v0 #获取数组的长度,赋值给v1

    #实例操作指令
    new-instance v1,Ljava/lang/StringBuilder; #创建一个StringBuilder对象

    #方法调用指令
    invoke-direct {v1},Ljava/lang/StringBuilder;-><init>()V #调用StringBuilder的直接方法进行初始化

    #跳转指令

    if-nez v0, :cond_0  #如果v0不是0(即v0数组不是空)的话,跳转至:cond_0,否则跳转至goto_0
    goto :goto_0

    :cond_0

    #数据转换指令
    int-to-float v2,v2 #将v2转换为float类型

    #数据运算指令
    add-float v2,v2,v2 #加法指令即:v2 = v2 + v2

    #比较指令
    cmpl-float v0,v2,v2 #比较v2与v2的大小,如果前者大于后者则结果为-1,如果相等则结果为0,否则结果为1,并将结果存储到v0,

    #字段操作指令
    sget-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream; #获取System对象中的类型为PrintStream的out字段

    const-string v1,"Hello World" #创建字符串Hello World 存储到v1中去

    #方法调用指令
    invoke-virtual {v0,v1},Ljava/io/PrintStream;->println(Ljava/lang/String;)V #调用PrintStream的虚方法println打印v1

    :goto_0
    #返回指令
    return-void #返回空
.end method

编译Smali文件

这里需要使用smali.jar这个工具:https://bitbucket.org/JesusFreke/smali/downloads/
这里我下载的是2.4.0
使用方法:
java -jar smali-2.4.0.jar a -o [输出的文件] [输入的文件]

java -jar smali-2.4.0.jar a -o HelloWorld.dex HelloWorld.smali

如果没有报错的话便可生成HelloWorld.dex


测试运行

启动Android模拟器(这里我使用的是逍遥模拟器)
如果不知道怎么连接模拟器的话可以看我的这篇文章:Android逆向破解:使用Android Studio调试反编译后的smali代码
使用adb执行如下指令:

#将HelloWorld.dex放到模拟器的sd卡中
adb push HelloWorld.dex /sdcard/

如下图提示pushed则表示成功



然后运行HelloWorld.dex文件

adb shell  dalvikvm -cp /sdcard/HelloWorld.dex HelloWorld

如下图打印Hello World表示成功


上一篇 下一篇

猜你喜欢

热点阅读