准备 smali 程序

从 《Android 软件安全与逆向》书中抠出一段,起名为 FirstSmali.smali

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
.class public LFirstSmali; # 定义类名
.super Ljava/lang/Object; # 定义父类
.method public static main([Ljava/lang/String;)V # 声明静态方法
.registers 4 # 寄存器
#.parameter # 参数
.prologue # 代码起始
nop
nop
nop
nop
#数据定义
const/16 v0,0x8
const/4 v1,0x5
const/4 v2,0x3
#数据操作
move v1,v2
#数组操作
new-array v0,v0,[I
array-length v1,v0
#实例操作
new-instance v1,Ljava/lang/StringBuilder;
#方法调用
invoke-direct {v1},Ljava/lang/StringBuilder;-><init>()V
#跳转
if-nez v0, :cond_0
goto :goto_0
:cond_0
#数据转换
int-to-float v2,v2
#运算
add-float v2,v2,v2
#比较
cmpl-float v0,v2,v2
#字段操作
sget-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1,"Hello Smali"
#调用
invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
#返回
:goto_0
return-void
return-void # 返回空
.end method


编译 smali 程序

.smali 文件编译为 .dex 文件 :
java -jar smali.jar -o FirstSmali.dex FirstSmali.smali


执行 smali 程序

打开 adb 环境,连上手机,在命令行下
执行 adb devices 查看手机是否连接成功;
执行 adb push FirstSmali.dex /sdcard/ 将 dex 文件推到手机上;
执行如下命令就 OK 了。

1
adb shell dalvikvm -cp /sdcard/FirstSmali.dex FirstSmali

备注

-cpclasspath 的意思,dalvikvm 命令第一个参数指定类路径,第二个指定类名。

另外,如果想要 push 到如 data/local 之类的目录下是没有权限的,可以先 push 到 sdcard,进入 adb shell 执行 su 获得 root 权限之后,就可以复制到 data 目录了。

本文程序只有一个 dex 文件,多个的话需要打包为 zip ,将此 zip 文件作为 dalvikvm 的第一个参数便可。