Smali

關(guān)于Dalvik

Dalvik 是 Google 公司自己設計用于 Android 平臺的虛擬機。它可以支持已轉(zhuǎn)換為 dex(即Dalvik Executable)格式的Java應用程序的運行,dex格式是專為Dalvik設計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。Dalvik 經(jīng)過優(yōu)化,允許在有限的內(nèi)存中同時運行多個虛擬機的實例,并且每一個 Dalvik 應用作為一個獨立的 Linux 進程執(zhí)行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關(guān)閉。

什么是smali

smali 基礎(chǔ)語法.xmind下載
Smali 和 Baksmali 分別是指 Android 虛擬機(Dalvik)所使用的一種.dex格式文件的匯編器,反匯編器。

下載地址:https://bitbucket.org/JesusFreke/smali/downloads/?tab=downloads

反編譯dex
 java -jar baksmali-2.2.1.jar d classes.dex
回編譯smail
 java -jar smali-2.2.1.jar a out

smali文件的基本格式

每個smali 文件頭3行描述基本信息

.class <訪問權(quán)限> [修飾關(guān)鍵字] <類名>
.super <父類名>
.source <源文件名>

如下面的Demo

.class public Lcom/example/demo/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"

第一行“.class” 指定當前的類名 ,類名表示類似于 jni 技術(shù)的類
第二行“.super” 指定父類
第三行“.source” 指定當前類的源文件名,混淆后可能沒有值

如果類實現(xiàn)過接口
# interfaces
.implements Landroid/view/View$OnClickListener;
屬性
  • 靜態(tài)屬性
  # static fields
  .field <訪問權(quán)限> static [修飾關(guān)鍵字] <字段名>:<字段類型>

"#"開頭為注釋,“.field” 后面的訪問權(quán)限為public、private、protected之一,修飾關(guān)鍵字為 final... ,字段名與字段類型使用冒號“:”分隔,類似swift的變量聲明語法

  var str:String = "hello"

具體示例

  # static fields
  .field private static final TAG:Ljava/lang/String; = "Activity"

實例屬性

  # instance fields
  .field <訪問權(quán)限> static [修飾關(guān)鍵字] <字段名>:<字段類型>

與靜態(tài)屬性相比少了static 關(guān)鍵字

方法
# direct methods
.method <訪問權(quán)限> [修飾關(guān)鍵字] <方法原型>
    <.locals>
    [.parameter]
    [.prologue]
    [.line]
    <代碼體>
.end method

“.locals” 表示局部變量的個數(shù)
“.parameter” 方法的參數(shù),肯存在多條
“.prologue” 代碼的開始處,混淆的代碼可能去掉改條
“.line” 知道在源代碼中的行號
虛方法在起始的注釋為“virtual methods”

  • 靜態(tài)方法
  .method public static getString()Ljava/lang/String;
      .locals 1

      .prologue
      .line 58
      const-string v0, ""

      return-object v0
  .end method
  • 內(nèi)部類

文件名 ”[外部類名]$[內(nèi)部類名].smali“
匿名內(nèi)部類 ”[外部類名]$[數(shù)字].smali“

AS中使用smali 進行調(diào)試步驟如下

apktool d demo.apk
  • 4、 重打包 重簽名
apktool d demo.apk
jarsigner -verbose -keystore demo.keystore -storepass 123456 -keypass 123456 -signedjar  demo.-signed.apk  demo.apk lesliekeystore
  • 5 也可以用 signapk.jar 簽名
java -jar signapk.jar .testkey.x509.pem testkey.pk8 my.apk my_signed.apk
  • 6、添加 Remote 調(diào)試
  • 7、debug 模式啟動應用
//adb shell am start -D -n packagename/ MainActivity。
 adb shell am start -D -n com.example.demo/.MainActivity
  • 8、通過DDMS中的pid查看應用所在進程。
    如果不用 DDMS可以通過adb shell執(zhí)行ps | grep packagename命令查看pid。

  • 9、 端口轉(zhuǎn)發(fā)拿到進程 IDadb forward tcp:8700 jdwp:pid

//如果DDMS開啟狀態(tài),請關(guān)閉,否則會報錯。
//2375是自己配的
adb forward tcp:5005 jdwp:2375

下面就可以設置斷點開始調(diào)試了

Android Studio調(diào)試環(huán)境的配置

  • 1 將smali目錄(或在smali建一級父目錄后將該目錄導入),選擇Import Project(Eclipse ADT, Gradle)后選擇Create project from existing sources,一路Next。
  • 2 成功導入工程后右鍵點擊 src 目錄,設定 Mark Directory As --> Sources Root。
  • 3 配置遠程調(diào)試的選項,選擇 Run -->Edit Configurations,增加一個Remote調(diào)試的調(diào)試選項,端口選擇:8700。
  • 4 選擇File -->Project Structure 配置JDK。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容