.class public LHelloWorld;
.super Ljava/lang/Object;
#这个V是干啥的,函数返回类型,V代表void、Z代表boolean、B代表byte、
#S代表short、C代表char、I代表int、J代表long、F代表float、D代表double、F代表float、L代表java类型
#[代表数据类型
.method public static main([Ljava/lang/String;)V
.registers 4 #代表使用4个寄存器、分别是v0、v1、v2寄存器和一个参数寄存器
.prologue
#空指令
nop
nop
nop
nop
#数据定义指令
const/16 v0, 0x8
const/4 v1, 0x5
const/4 v2, 0x3
#将v2寄存器的值赋予v1寄存器
move v1,v2
#数据操作指令 [是数组,[I是int一维数组
new-array v0,v0,[I
array-length v1, v0
#实例操作指令,我把V0数组的长度给V1了,为什么V1继续接受了字符串构造?那这样是不是覆盖前一个值了。
#是不是因为构造一个指定类型的新实例不能是数组类,所以这样用string来代替,从而构造一个新实例类,引用对象给了v1
new-instance v1, Ljava/lang/StringBuilder;
#方法调用指令
invoke-direct {v1},Ljava/lang/StringBuilder;-><init>()V
#跳转指令,如果v0不为0则跳转
if-nez v0, :cond_0
goto :goto_0
:cond_0
#数据转换指令
int-to-float v2, v2
#数据运算指令
add-float v2, v2, v2
#比较指令,如果v1>v2, v0=-1; v1=v2,v0=0;v1<v2, v0=1
cmpl-float v0, v1, v2
#字段操作指令
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
#构造字符串
const-string v1, "Hello World"
#方法调用指令
invoke-virtual {v0, v1},Ljava/io/PrintStram;->println(Ljava/lang/String;)V
:goto_0
return-void
return-void
.end method
smali -o HelloWorld.dex HelloWorld.smali会有错误,因为版本不一样,不支持这样编译了。
smali --help
[email protected] ~/逆向 smali --help
usage: smali [-v] [-h] [<command [<args>]]
Options:
-h,-?,--help - Show usage information
-v,--version - Print the version of baksmali and then exit
Commands:
assemble(ass,as,a) - Assembles smali files into a dex file.
help(h) - Shows usage information
See smali help <command> for more information about a specific command
smali assemble HellWorld.smali -o HelloWorld.dex
才可以。
adb push HelloWorld.dex /sdcard/
adb shell dalvikvm -cp /sdcard/HelloWorld.dex HelloWorld
执行即可。