自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android 反編譯 -smali語法

移動開發(fā) Android
前面我們有說過android反編譯的工具,如何進行反編譯。反編譯后可以得到jar或者得到smali文件。Android采用的是java語言 進行開發(fā),但是Android系統(tǒng)有自己的虛擬機Dalvik,代碼編譯最終不是采用的java的class,而是使用的smali。我們反編譯得到的代 碼,jar的話可能很多地方無法正確的解釋出來,如果我們反編譯的是smali則可以正確的理解程序的意思。因此,我們有必要熟悉smali語法。

前言

前面我們有說過android反編譯的工具,如何進行反編譯。反編譯后可以得到jar或者得到smali文件。Android采用的是java語言 進行開發(fā),但是Android系統(tǒng)有自己的虛擬機Dalvik,代碼編譯最終不是采用的java的class,而是使用的smali。我們反編譯得到的代 碼,jar的話可能很多地方無法正確的解釋出來,如果我們反編譯的是smali則可以正確的理解程序的意思。因此,我們有必要熟悉smali語法。

類型的表示

java里面包含兩種類型,原始類型和引用類型(包括對象),同時映射到smali也是有這兩大類型。

原始類型

  1. void (只能用于返回值類型) 
  2. boolean 
  3. byte 
  4. short 
  5. char 
  6. int 
  7. long 
  8. float 
  9. D Double 

對象類型

  1. Lpackage/name/ObjectName; 相當于java中的package.name.ObjectName  

L 表示這是一個對象類型

package/name 該對象所在的包

ObjectName 對象名稱

; 標識對象名稱的結(jié)束

數(shù)組的表示

[I 表示一個int型的一維數(shù)組,相當于int[];

增加一個維度增加一個[,如[[I表示int[][]

數(shù)組每一個維度最多255個;

對象數(shù)組表示也是類似,如String數(shù)組的表示是[Ljava/lang/String

寄存器與變量

java中變量都是存放在內(nèi)存中的,android為了提高性能,變量都是存放在寄存器中的,寄存器為32位,可以支持任何類型,其中l(wèi)ong和double是64為的,需要使用兩個寄存器保存。

寄存器采用v和p來命名

v表示本地寄存器,p表示參數(shù)寄存器,關系如下

如果一個方法有兩個本地變量,有三個參數(shù)

  1. v0 第一個本地寄存器 
  2. v1 第二個本地寄存器 
  3. v2 p0 (this
  4. v3 p1 第一個參數(shù) 
  5. v4 p2 第二個參數(shù) 
  6. v5 p3 第三個參數(shù) 

當然,如果是靜態(tài)方法的話就只有5個寄存器了,不需要存this了。

.registers 使用這個指令指定方法中寄存器的總數(shù)

.locals 使用這個指定表明方法中非參寄存器的總數(shù),放在方法的第一行。

方法和字段的表示

方法簽名

  1. methodName(III)Lpackage/name/ObjectName; 

如果做過ndk開發(fā)的對于這樣的簽名應該很熟悉的,就是這樣來標識一個方法的。

上面methodName標識方法名,III表示三個整形參數(shù),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; 

使用編譯后是這樣

  1. .method private static sum(II)I 
  2. .locals 4 #表示需要申請4個本地寄存器 
  3. .parameter 
  4. .parameter #這里表示有兩個參數(shù) 
  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 

從上面可以看到函數(shù)聲明使用.method開始 .end method結(jié)束,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

指令執(zhí)行

smali字節(jié)碼是類似于匯編的,如果你有匯編基礎,理解起來是非常容易的。

比如:

move v0, v3 #把v3寄存器的值移動到寄存器v0上.

const v0, 0x1 #把值0x1賦值到寄存器v0上。

invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #執(zhí)行方法sum(),v4,v5的值分別作為sum的參數(shù)。

其他

通過前面我們可以看到,smali就是類似匯編,其中很多命令,我們可以去查它的手冊來一一對應。學習時,我們可以自己寫一個比較簡單的java文件,然后轉(zhuǎn)成smali文件來對照學習。

下面,我貼一個我寫的一個比較簡單的java文件以及其對應的smali,其中包含if判斷和for循環(huán)。

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. private static int sum(int a, int b) { 
  16. return a+b; 
  17. private boolean max(int a, int b) { 
  18. if (a > b) { 
  19. return true
  20. else { 
  21. return false
  22. private int accumulate(int a) { 
  23. if (a <= 0) { 
  24. return 0
  25. int sum = 0
  26. for(int i = 0; i <= a; i++) { 
  27. sum += a; 
  28. return sum; 

對應的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 

參考資料

最后附上一些參考資料:

http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

https://code.google.com/p/smali/w/list

http://www.miui.com/thread-409543-1-1.html

原文地址:http://blog.isming.me/2015/01/14/android-decompile-smali/

責任編輯:閆佳明 來源: isming
相關推薦

2015-01-15 11:01:43

2011-05-31 14:52:13

Android 反編譯 方法

2011-05-31 14:38:04

Android 反編譯

2011-05-31 14:18:17

2015-07-13 15:52:18

反編譯Android APK

2017-11-27 15:43:49

Androidjadx反編譯

2021-03-07 16:31:35

Java編譯反編譯

2017-02-20 13:54:14

Java代碼編譯

2017-07-13 13:13:49

AndroidAPK反編譯

2015-08-07 11:11:15

反編譯源代碼Mac

2011-04-20 10:32:44

java反編譯

2009-06-11 14:11:33

代碼混淆Java反編譯

2012-11-06 10:02:04

JavaJadEclipse

2009-06-11 13:49:30

2014-09-25 10:28:02

反編譯工具Java

2020-03-17 16:15:01

Python編譯代碼

2024-09-13 08:57:25

SpringJar項目

2024-09-14 07:00:28

SpringBoot代碼反編譯

2015-08-20 10:13:34

2021-12-10 10:05:27

Java反編譯jar
點贊
收藏

51CTO技術棧公眾號