如何运行 .smali 程序

原文: https://kiya-z.github.io/2015/11/16/how-to-run-file-ended-with-smali/




如何运行 .smali 程序

准备 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
44
45
.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 的第一个参数便可。

原文: https://kiya-z.github.io/2015/11/16/how-to-run-file-ended-with-smali/