目录
目录编写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表示成功
网友评论