-
-
[旧帖] [推荐]Android 反编译 -smali语法 0.00雪花
-
发表于: 2015-8-1 18:06 1432
-
前面有说过android反编译的工具,如何进行反编译。反编译后可以得到jar或者得到smali文件。Android采用的是java语言 进行开发,但是Android系统有自己的虚拟机Dalvik,代码编译最终不是采用的java的class,而是使用的smali。我们反编译得到的代 码,jar的话可能很多地方无法正确的解释出来,如果我们反编译的是smali则可以正确的理解程序的意思。因此,我们有必要熟悉smali语法。
类型的表示
java里面包含两种类型,原始类型和引用类型(包括对象),同时映射到smali也是有这两大类型。
原始类型
1.V void (只能用于返回值类型)
2.Z boolean
3.B byte
4.S short
5.C char
6.I int
7.J long
8.F float
9.D Double
对象类型
1.Lpackage/name/ObjectName; 相当于java中的package.name.ObjectName
L 表示这是一个对象类型
package/name 该对象所在的包
ObjectName 对象名称
; 标识对象名称的结束
数组的表示
[I 表示一个int型的一维数组,相当于int[];
增加一个维度增加一个[,如[[I表示int[][]
数组每一个维度最多255个;
对象数组表示也是类似,如String数组的表示是[Ljava/lang/String
寄存器与变量
java中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型,其中long和double是64为的,需要使用两个寄存器保存。
寄存器采用v和p来命名
v表示本地寄存器,p表示参数寄存器,关系如下
如果一个方法有两个本地变量,有三个参数
1.v0 第一个本地寄存器
2.v1 第二个本地寄存器
3.v2 p0 (this)
4.v3 p1 第一个参数
5.v4 p2 第二个参数
6.v5 p3 第三个参数
当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。
.registers 使用这个指令指定方法中寄存器的总数
.locals 使用这个指定表明方法中非参寄存器的总数,放在方法的第一行。
方法和字段的表示
方法签名
1.methodName(III)Lpackage/name/ObjectName;
如果做过ndk开发的对于这样的签名应该很熟悉的,就是这样来标识一个方法的。
上面methodName标识方法名,III表示三个整形参数,Lpackage/name/ObjectName;表示返回值的类型。
方法的表示
Lpackage/name/ObjectName;——>methodName(III)Z
即 package.name.ObjectName中的 function boolean methondName(int a, int b, int c) 类似这样子
字段的表示
1.Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
即表示: 包名,字段名和各字段类型
方法的定义
比如我下面的一个方法
1.private static int sum(int a, int b) {
2.return a+b;
3.}
使用编译后是这样
1..method private static sum(II)I
2..locals 4 #表示需要申请4个本地寄存器
3..parameter
4..parameter #这里表示有两个参数
5..prologue
6..line 27
7.move v0, p0
8..local v0, a:I
9.move v1, p1
10..local v1, b:I
11.move v2, v0
12.move v3, v1
13.add-int/2addr v2, v3
14.move v0, v2
15..end local v0 #a:I
16.return v0
17..end method
从上面可以看到函数声明使用.method开始 .end method结束,java中的关键词private,static 等都可以使用,同时使用签名来表示唯一的方法,这里是sum(II)I。
声明成员
.field private name:Lpackage/name/ObjectName;
比如:private TextView mTextView;表示就是
.field private mTextView:Landroid/widget/TextView;
private int mCount;
.field private mCount:I
指令执行
smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。
比如:
move v0, v3 #把v3寄存器的值移动到寄存器v0上.
const v0, 0x1 #把值0x1赋值到寄存器v0上。
invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #执行方法sum(),v4,v5的值分别作为sum的参数。
其他
通过前面我们可以看到,smali就是类似汇编,其中很多命令,我们可以去查它的手册来一一对应。学习时,我们可以自己写一个比较简单的java文件,然后转成smali文件来对照学习。
下面,我贴一个我写的一个比较简单的java文件以及其对应的smali,其中包含if判断和for循环。
java文件:
1.package me.isming.myapplication;
2.import android.support.v7.app.ActionBarActivity;
3.import android.os.Bundle;
4.import android.view.Menu;
5.import android.view.MenuItem;
6.import android.widget.TextView;
7.public class MainActivity extends ActionBarActivity {
8.private TextView mTextView;
9.@Override
10.protected void onCreate(Bundle savedInstanceState) {
11.super.onCreate(savedInstanceState);
12.setContentView(R.layout.activity_main);
13.mTextView = (TextView) findViewById(R.id.text);
14.mTextView.setText("a+b=" + sum(1,2) + "a>b?" + max(1,2) + "5 accumulate:" + accumulate(5));
15.}
16.private static int sum(int a, int b) {
17.return a+b;
18.}
19.private boolean max(int a, int b) {
20.if (a > b) {
21.return true;
22.} else {
23.return false;
24.}
25.}
26.private int accumulate(int a) {
27.if (a <= 0) {
28.return 0;
29.}
30.int sum = 0;
31.for(int i = 0; i <= a; i++) {
32.sum += a;
33.}
34.return sum;
35.}
36.}
对应的smali:
1..class public Lme/isming/myapplication/MainActivity;
2..super Landroid/support/v7/app/ActionBarActivity;
3..source "MainActivity.java"
4.# instance fields
5..field private mTextView:Landroid/widget/TextView;
6.# direct methods
7..method public constructor <init>()V
8..locals 2
9..prologue
10..line 10
11.move-object v0, p0
12..local v0, this:Lme/isming/myapplication/MainActivity;
13.move-object v1, v0
14.invoke-direct {v1}, Landroid/support/v7/app/ActionBarActivity;-><init>()V
15.return-void
16..end method
17..method private accumulate(I)I
18..locals 6
19..parameter
20..prologue
21..line 39
22.move-object v0, p0
23..local v0, this:Lme/isming/myapplication/MainActivity;
24.move v1, p1
25..local v1, a:I
26.move v4, v1
27.if-gtz v4, :cond_0
28..line 40
29.const/4 v4, 0x0
30.move v0, v4
31..line 46
32..end local v0 #this:Lme/isming/myapplication/MainActivity;
33.:goto_0
34.return v0
35..line 42
36..restart local v0 #this:Lme/isming/myapplication/MainActivity;
37.:cond_0
38.const/4 v4, 0x0
39.move v2, v4
40..line 43
41..local v2, sum:I
42.const/4 v4, 0x0
43.move v3, v4
44..local v3, i:I
45.:goto_1
46.move v4, v3
47.move v5, v1
48.if-gt v4, v5, :cond_1
49..line 44
50.move v4, v2
51.move v5, v1
52.add-int/2addr v4, v5
53.move v2, v4
54..line 43
55.add-int/lit8 v3, v3, 0x1
56.goto :goto_1
57..line 46
58.:cond_1
59.move v4, v2
60.move v0, v4
61.goto :goto_0
62..end method
63..method private max(II)Z
64..locals 5
65..parameter
66..parameter
67..prologue
68..line 31
69.move-object v0, p0
70..local v0, this:Lme/isming/myapplication/MainActivity;
71.move v1, p1
72..local v1, a:I
73.move v2, p2
74..local v2, b:I
75.move v3, v1
76.move v4, v2
77.if-le v3, v4, :cond_0
78..line 32
79.const/4 v3, 0x1
80.move v0, v3
81..line 34
82..end local v0 #this:Lme/isming/myapplication/MainActivity;
83.:goto_0
84.return v0
85..restart local v0 #this:Lme/isming/myapplication/MainActivity;
86.:cond_0
87.const/4 v3, 0x0
88.move v0, v3
89.goto :goto_0
90..end method
91..method private static sum(II)I
92..locals 4
93..parameter
94..parameter
95..prologue
96..line 27
97.move v0, p0
98..local v0, a:I
99.move v1, p1
100..local v1, b:I
101.move v2, v0
102.move v3, v1
103.add-int/2addr v2, v3
104.move v0, v2
105..end local v0 #a:I
106.return v0
107..end method
108.# virtual methods
109..method protected onCreate(Landroid/os/Bundle;)V
110..locals 8
111..parameter
112..prologue
113..line 16
114.move-object v0, p0
115..local v0, this:Lme/isming/myapplication/MainActivity;
116.move-object v1, p1
117..local v1, savedInstanceState:Landroid/os/Bundle;
118.move-object v2, v0
119.move-object v3, v1
120.invoke-super {v2, v3}, Landroid/support/v7/app/ActionBarActivity;->onCreate(Landroid/os/Bundle;)V
121..line 17
122.move-object v2, v0
123.const v3, 0x7f030017
124.invoke-virtual {v2, v3}, Lme/isming/myapplication/MainActivity;->setContentView(I)V
125..line 19
126.move-object v2, v0
127.move-object v3, v0
128.const v4, 0x7f08003f
129.invoke-virtual {v3, v4}, Lme/isming/myapplication/MainActivity;->findViewById(I)Landroid/view/View;
130.move-result-object v3
131.check-cast v3, Landroid/widget/TextView;
132.iput-object v3, v2, Lme/isming/myapplication/MainActivity;->mTextView:Landroid/widget/TextView;
133..line 21
134.move-object v2, v0
135.iget-object v2, v2, Lme/isming/myapplication/MainActivity;->mTextView:Landroid/widget/TextView;
136.new-instance v3, Ljava/lang/StringBuilder;
137.move-object v7, v3
138.move-object v3, v7
139.move-object v4, v7
140.invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V
141.const-string v4, "a+b="
142.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
143.move-result-object v3
144.const/4 v4, 0x1
145.const/4 v5, 0x2
146.invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I
147.move-result v4
148.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
149.move-result-object v3
150.const-string v4, "a>b?"
151.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
152.move-result-object v3
153.move-object v4, v0
154.const/4 v5, 0x1
155.const/4 v6, 0x2
156.invoke-direct {v4, v5, v6}, Lme/isming/myapplication/MainActivity;->max(II)Z
157.move-result v4
158.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
159.move-result-object v3
160.const-string v4, "5 accumulate:"
161.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
162.move-result-object v3
163.move-object v4, v0
164.const/4 v5, 0x5
165.invoke-direct {v4, v5}, Lme/isming/myapplication/MainActivity;->accumulate(I)I
166.move-result v4
167.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
168.move-result-object v3
169.invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
170.move-result-object v3
171.invoke-virtual {v2, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
172..line 23
173.return-void
174..end method
类型的表示
java里面包含两种类型,原始类型和引用类型(包括对象),同时映射到smali也是有这两大类型。
原始类型
1.V void (只能用于返回值类型)
2.Z boolean
3.B byte
4.S short
5.C char
6.I int
7.J long
8.F float
9.D Double
对象类型
1.Lpackage/name/ObjectName; 相当于java中的package.name.ObjectName
L 表示这是一个对象类型
package/name 该对象所在的包
ObjectName 对象名称
; 标识对象名称的结束
数组的表示
[I 表示一个int型的一维数组,相当于int[];
增加一个维度增加一个[,如[[I表示int[][]
数组每一个维度最多255个;
对象数组表示也是类似,如String数组的表示是[Ljava/lang/String
寄存器与变量
java中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型,其中long和double是64为的,需要使用两个寄存器保存。
寄存器采用v和p来命名
v表示本地寄存器,p表示参数寄存器,关系如下
如果一个方法有两个本地变量,有三个参数
1.v0 第一个本地寄存器
2.v1 第二个本地寄存器
3.v2 p0 (this)
4.v3 p1 第一个参数
5.v4 p2 第二个参数
6.v5 p3 第三个参数
当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。
.registers 使用这个指令指定方法中寄存器的总数
.locals 使用这个指定表明方法中非参寄存器的总数,放在方法的第一行。
方法和字段的表示
方法签名
1.methodName(III)Lpackage/name/ObjectName;
如果做过ndk开发的对于这样的签名应该很熟悉的,就是这样来标识一个方法的。
上面methodName标识方法名,III表示三个整形参数,Lpackage/name/ObjectName;表示返回值的类型。
方法的表示
Lpackage/name/ObjectName;——>methodName(III)Z
即 package.name.ObjectName中的 function boolean methondName(int a, int b, int c) 类似这样子
字段的表示
1.Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
即表示: 包名,字段名和各字段类型
方法的定义
比如我下面的一个方法
1.private static int sum(int a, int b) {
2.return a+b;
3.}
使用编译后是这样
1..method private static sum(II)I
2..locals 4 #表示需要申请4个本地寄存器
3..parameter
4..parameter #这里表示有两个参数
5..prologue
6..line 27
7.move v0, p0
8..local v0, a:I
9.move v1, p1
10..local v1, b:I
11.move v2, v0
12.move v3, v1
13.add-int/2addr v2, v3
14.move v0, v2
15..end local v0 #a:I
16.return v0
17..end method
从上面可以看到函数声明使用.method开始 .end method结束,java中的关键词private,static 等都可以使用,同时使用签名来表示唯一的方法,这里是sum(II)I。
声明成员
.field private name:Lpackage/name/ObjectName;
比如:private TextView mTextView;表示就是
.field private mTextView:Landroid/widget/TextView;
private int mCount;
.field private mCount:I
指令执行
smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。
比如:
move v0, v3 #把v3寄存器的值移动到寄存器v0上.
const v0, 0x1 #把值0x1赋值到寄存器v0上。
invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #执行方法sum(),v4,v5的值分别作为sum的参数。
其他
通过前面我们可以看到,smali就是类似汇编,其中很多命令,我们可以去查它的手册来一一对应。学习时,我们可以自己写一个比较简单的java文件,然后转成smali文件来对照学习。
下面,我贴一个我写的一个比较简单的java文件以及其对应的smali,其中包含if判断和for循环。
java文件:
1.package me.isming.myapplication;
2.import android.support.v7.app.ActionBarActivity;
3.import android.os.Bundle;
4.import android.view.Menu;
5.import android.view.MenuItem;
6.import android.widget.TextView;
7.public class MainActivity extends ActionBarActivity {
8.private TextView mTextView;
9.@Override
10.protected void onCreate(Bundle savedInstanceState) {
11.super.onCreate(savedInstanceState);
12.setContentView(R.layout.activity_main);
13.mTextView = (TextView) findViewById(R.id.text);
14.mTextView.setText("a+b=" + sum(1,2) + "a>b?" + max(1,2) + "5 accumulate:" + accumulate(5));
15.}
16.private static int sum(int a, int b) {
17.return a+b;
18.}
19.private boolean max(int a, int b) {
20.if (a > b) {
21.return true;
22.} else {
23.return false;
24.}
25.}
26.private int accumulate(int a) {
27.if (a <= 0) {
28.return 0;
29.}
30.int sum = 0;
31.for(int i = 0; i <= a; i++) {
32.sum += a;
33.}
34.return sum;
35.}
36.}
对应的smali:
1..class public Lme/isming/myapplication/MainActivity;
2..super Landroid/support/v7/app/ActionBarActivity;
3..source "MainActivity.java"
4.# instance fields
5..field private mTextView:Landroid/widget/TextView;
6.# direct methods
7..method public constructor <init>()V
8..locals 2
9..prologue
10..line 10
11.move-object v0, p0
12..local v0, this:Lme/isming/myapplication/MainActivity;
13.move-object v1, v0
14.invoke-direct {v1}, Landroid/support/v7/app/ActionBarActivity;-><init>()V
15.return-void
16..end method
17..method private accumulate(I)I
18..locals 6
19..parameter
20..prologue
21..line 39
22.move-object v0, p0
23..local v0, this:Lme/isming/myapplication/MainActivity;
24.move v1, p1
25..local v1, a:I
26.move v4, v1
27.if-gtz v4, :cond_0
28..line 40
29.const/4 v4, 0x0
30.move v0, v4
31..line 46
32..end local v0 #this:Lme/isming/myapplication/MainActivity;
33.:goto_0
34.return v0
35..line 42
36..restart local v0 #this:Lme/isming/myapplication/MainActivity;
37.:cond_0
38.const/4 v4, 0x0
39.move v2, v4
40..line 43
41..local v2, sum:I
42.const/4 v4, 0x0
43.move v3, v4
44..local v3, i:I
45.:goto_1
46.move v4, v3
47.move v5, v1
48.if-gt v4, v5, :cond_1
49..line 44
50.move v4, v2
51.move v5, v1
52.add-int/2addr v4, v5
53.move v2, v4
54..line 43
55.add-int/lit8 v3, v3, 0x1
56.goto :goto_1
57..line 46
58.:cond_1
59.move v4, v2
60.move v0, v4
61.goto :goto_0
62..end method
63..method private max(II)Z
64..locals 5
65..parameter
66..parameter
67..prologue
68..line 31
69.move-object v0, p0
70..local v0, this:Lme/isming/myapplication/MainActivity;
71.move v1, p1
72..local v1, a:I
73.move v2, p2
74..local v2, b:I
75.move v3, v1
76.move v4, v2
77.if-le v3, v4, :cond_0
78..line 32
79.const/4 v3, 0x1
80.move v0, v3
81..line 34
82..end local v0 #this:Lme/isming/myapplication/MainActivity;
83.:goto_0
84.return v0
85..restart local v0 #this:Lme/isming/myapplication/MainActivity;
86.:cond_0
87.const/4 v3, 0x0
88.move v0, v3
89.goto :goto_0
90..end method
91..method private static sum(II)I
92..locals 4
93..parameter
94..parameter
95..prologue
96..line 27
97.move v0, p0
98..local v0, a:I
99.move v1, p1
100..local v1, b:I
101.move v2, v0
102.move v3, v1
103.add-int/2addr v2, v3
104.move v0, v2
105..end local v0 #a:I
106.return v0
107..end method
108.# virtual methods
109..method protected onCreate(Landroid/os/Bundle;)V
110..locals 8
111..parameter
112..prologue
113..line 16
114.move-object v0, p0
115..local v0, this:Lme/isming/myapplication/MainActivity;
116.move-object v1, p1
117..local v1, savedInstanceState:Landroid/os/Bundle;
118.move-object v2, v0
119.move-object v3, v1
120.invoke-super {v2, v3}, Landroid/support/v7/app/ActionBarActivity;->onCreate(Landroid/os/Bundle;)V
121..line 17
122.move-object v2, v0
123.const v3, 0x7f030017
124.invoke-virtual {v2, v3}, Lme/isming/myapplication/MainActivity;->setContentView(I)V
125..line 19
126.move-object v2, v0
127.move-object v3, v0
128.const v4, 0x7f08003f
129.invoke-virtual {v3, v4}, Lme/isming/myapplication/MainActivity;->findViewById(I)Landroid/view/View;
130.move-result-object v3
131.check-cast v3, Landroid/widget/TextView;
132.iput-object v3, v2, Lme/isming/myapplication/MainActivity;->mTextView:Landroid/widget/TextView;
133..line 21
134.move-object v2, v0
135.iget-object v2, v2, Lme/isming/myapplication/MainActivity;->mTextView:Landroid/widget/TextView;
136.new-instance v3, Ljava/lang/StringBuilder;
137.move-object v7, v3
138.move-object v3, v7
139.move-object v4, v7
140.invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V
141.const-string v4, "a+b="
142.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
143.move-result-object v3
144.const/4 v4, 0x1
145.const/4 v5, 0x2
146.invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I
147.move-result v4
148.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
149.move-result-object v3
150.const-string v4, "a>b?"
151.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
152.move-result-object v3
153.move-object v4, v0
154.const/4 v5, 0x1
155.const/4 v6, 0x2
156.invoke-direct {v4, v5, v6}, Lme/isming/myapplication/MainActivity;->max(II)Z
157.move-result v4
158.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
159.move-result-object v3
160.const-string v4, "5 accumulate:"
161.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
162.move-result-object v3
163.move-object v4, v0
164.const/4 v5, 0x5
165.invoke-direct {v4, v5}, Lme/isming/myapplication/MainActivity;->accumulate(I)I
166.move-result v4
167.invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
168.move-result-object v3
169.invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
170.move-result-object v3
171.invoke-virtual {v2, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
172..line 23
173.return-void
174..end method
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
看原图
赞赏
雪币:
留言: