Smali

關(guān)于Dalvik

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

什么是smali

smali 基礎(chǔ)語(yǔ)法.xmind下載
Smali 和 Baksmali 分別是指 Android 虛擬機(jī)(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文件的基本格式

每個(gè)smali 文件頭3行描述基本信息

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

如下面的Demo

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

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

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

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

  var str:String = "hello"

具體示例

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

實(shí)例屬性

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

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

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

“.locals” 表示局部變量的個(gè)數(shù)
“.parameter” 方法的參數(shù),肯存在多條
“.prologue” 代碼的開(kāi)始處,混淆的代碼可能去掉改條
“.line” 知道在源代碼中的行號(hào)
虛方法在起始的注釋為“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 進(jìn)行調(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 模式啟動(dòng)應(yīng)用
//adb shell am start -D -n packagename/ MainActivity。
 adb shell am start -D -n com.example.demo/.MainActivity
  • 8、通過(guò)DDMS中的pid查看應(yīng)用所在進(jìn)程。
    如果不用 DDMS可以通過(guò)adb shell執(zhí)行ps | grep packagename命令查看pid。

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

//如果DDMS開(kāi)啟狀態(tài),請(qǐng)關(guān)閉,否則會(huì)報(bào)錯(cuò)。
//2375是自己配的
adb forward tcp:5005 jdwp:2375

下面就可以設(shè)置斷點(diǎn)開(kāi)始調(diào)試了

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

  • 1 將smali目錄(或在smali建一級(jí)父目錄后將該目錄導(dǎo)入),選擇Import Project(Eclipse ADT, Gradle)后選擇Create project from existing sources,一路Next。
  • 2 成功導(dǎo)入工程后右鍵點(diǎn)擊 src 目錄,設(shè)定 Mark Directory As --> Sources Root。
  • 3 配置遠(yuǎn)程調(diào)試的選項(xiàng),選擇 Run -->Edit Configurations,增加一個(gè)Remote調(diào)試的調(diào)試選項(xiàng),端口選擇:8700。
  • 4 選擇File -->Project Structure 配置JDK。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容