美文网首页
Android逆向破解:Smali的HelloWorld

Android逆向破解:Smali的HelloWorld

作者: itfitness | 来源:发表于2020-12-13 11:25 被阅读0次

    目录

    目录

    编写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表示成功


    相关文章

      网友评论

          本文标题:Android逆向破解:Smali的HelloWorld

          本文链接:https://www.haomeiwen.com/subject/lobugktx.html