1. 程式人生 > >安卓逆向學習---初始APK、Dalvik字節碼以及Smali

安卓逆向學習---初始APK、Dalvik字節碼以及Smali

靜態 格式 鏈接 變量 char har 占用空間 方法參數 調用

參考鏈接:https://www.52pojie.cn/thread-395689-1-1.html

res目錄下資源文件在編譯時會自動生成索引文件(R.java ),

asset目錄下的資源文件無需生成索引。

一般來說:使用C++遊戲引擎的資源文件放在asset下

      java開發中除音頻和視頻資源(放在raw或asset下),均放在res下。

  • Dalvik字節碼是什麽?

  Dalvik是Google專門為Android設計的一個虛擬機。

  Dalvik VM是基於寄存器的,而JVM是基於棧的,Dalvik有專屬的文件執行格式dex(Dalvik executable),jvm使用的是java字節碼。

  Dalvik VM你jvm速度更快,占用空間更少。

  • 什麽是Smali?

  Smali,baksmali分貝時指安卓系統裏的java虛擬機(Dalvik)所使用的一種。dex格式文件的匯編器,反匯編器。

  語法為一行寬松的Jasmin/dedeser語法,且實現了.dex格式的所用功能(註解,調試信息,線路信息等)。

  對apk文件進行反匯編後,便會生成此類文件。其中在Dalvik字節碼中,寄存器都是32位的,能夠支持任何類型,64位類型(Long/Double)用2個寄存器表示。

  • Dalvik字節碼有兩種類型:原始類型,引用類型。

  

  原始類型:  

      B --- byte

      C --- char

      D --- double

      F --- float

      I --- int

      J --- long

      S --- short

      V --- void

      Z --- boolean  

      [XXX --- array    //數組表示方式:基本類型前加上“[”,eg:int型數組表示為:[I

      LXXX/yyy --- object  //對象表示以L開頭,格式為LpackageName/objectName;(分號必須有)

      //eg:String在Smali中為:LJava/lang.String; ,其中java/lang對應java.lang包,String就是定義在該包中的一個對象。

      //內部類表示為:LpackName/objectName$subObjectName;。即在內部類前面加“$”符號。

    方法定義:Func-Name(para-Type1para-Type2para-Type3...)Return-Type    //參數之間沒有空格

    eg:hello()v    //void hello()

      hello(III)Z    //boolean hello(int,int,int)

      hello(Z[I[ILjava/lang/String;J)Ljava/lang/String    //String hello(boolean,int[],int[],String,long)

  • Smali基本語法

  .field private isFlag:z 定義變量

  .method       方法

  .parameter     方法參數

  .prologue     方法開始

  .line 123     此方法位於第123行

  invoke-super   調用父函數

  const/high16 vO, 0x7fo3   把0x7fo3賦值給v0

  invoke-direct   調用函數

  return-void   函數返回void

  .end method   函數結束

  new-instance   創建實例

  iput-object   對象賦值

  iget-object   調用對象

  invoke-static   調用靜態函數

  • 條件跳轉分支:

  "if-eq vA, vB, :con_**"   如果vA等於vB則跳轉到:cond_ **

  "if-ne vA, vB, :cond_**"    如果vA不等於vB則跳轉到:cond_ **

  "if-It vA, vB, :cond_**"    如果vA小於vB則跳轉 到:cond_ **

  "if-ge vA, vB, :cond_**"     如果vA大於等於vB則跳轉到:cond_ **

  "if-gt vA, vB, :cond_**"    如果vA大於vB則跳轉到:cond_ **

  "if-le vA, vB, :cond_ *"     如果vA小於等於vB則跳轉到:cond_ **

  "if-eqz vA, :cond_**"    如果vA等於0則跳轉到:cond_ **

  "if-nez vA, :cond_**"    如果vA不等於0則跳轉到:cond_ **

  "if-Itz vA, :cond_**"    如果vA小於0則跳轉到:cond_**

  "if-gez vA, :cond_**"   如果vA大於等 於0則跳轉到:cond_ **

  "if-gtz vA, :cond_**"     如果vA大於0則跳轉到:cond_ **

  "if-lez vA, :cond_**"    如果vA小於 等於0則跳轉到:cond **

  

  

安卓逆向學習---初始APK、Dalvik字節碼以及Smali