准备 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
|
备注
-cp
是 classpath
的意思,dalvikvm
命令第一个参数指定类路径,第二个指定类名。
另外,如果想要 push 到如 data/local
之类的目录下是没有权限的,可以先 push 到 sdcard,进入 adb shell
执行 su
获得 root 权限之后,就可以复制到 data
目录了。
本文程序只有一个 dex 文件,多个的话需要打包为 zip
,将此 zip 文件作为 dalvikvm
的第一个参数便可。