<track id="1rt7t"></track>
<pre id="1rt7t"></pre>

    <p id="1rt7t"><ruby id="1rt7t"><b id="1rt7t"></b></ruby></p>

      軟件培訓網

      歡迎訪問軟件培訓網!招生咨詢電話與微信:15225191462(周老師)
      軟件培訓網,專業解決學IT疑難雜癥!

      首頁 > 安卓培訓/ 正文

      安卓技術培訓之應用逆向技術

      2015-06-17 13:44:27 軟件培訓網

           在安卓應用逆向技術的第一部分中,我們已經通過一個簡單的例子讓大家對于安卓應用逆向有了一個簡單的認知。本次開始,將會從頭講解這一技術的細節。而安卓應用的基礎細節,是我們逆向成功的基礎。也是我們本次內容的重點。KbH軟件培訓網

           安卓應用基礎分為下面幾部分來講解:1. 應用和Delvik指令集。2. Dex和odex文件格式。3. Arm原生代碼格式。本次內容也會比較偏重介紹性質,不會涉及太多細節,都是點到為止。希望大家能夠對于安卓應用的整體情況有一個宏觀的理解。
         本次內容稍微需要一點安卓框架的基礎知識。
         0. 背景知識
           在介紹安卓應用格式之前,希望大家能夠了解下面的知識:安卓設備運行在ARM架構的CPU上;安卓的底層系統基于Linux實現;安卓應用運行在Delvik虛擬機(類似于Java)中;應用可以通過JNI接口運行原生arm程序。
         0.1 ARM
         大家對于intel可能非常熟悉,intel的x86架構一直是PC端的霸主,大家的電腦大都用的intel的CPU。但是對于移動設備來講,ARM就相當于PC界的Intel。ARM有三種CPU架構,我們經常用到的(也是安卓中的)是cortex-A系列。最新的架構已經更新到了Cortex-A72,基于ARMv8-A架構實現。下圖是arm官網介紹:(高通,MTK等可以理解為是arm的下游企業,也就是使用arm的架構開發自己的東西)
      0.2 Linux與安卓
       安卓底層一直使用的是Linux的內核,但是由于一些專利的原因,安卓中的硬件相關的一個驅動層代碼并不是開源的。但是內核邏輯和一般命令基本都是可以通用的。大家可以理解為兩者大致一樣就行。
         0.3 Delvik虛擬機
         Delvik虛擬機與Java很類似,都是多做了一層虛擬化,將底層的架構與java字節碼分開,便于兼容各種設備。而且開發應用的語言基本就是Java。但是還是有一些區別:Java基于棧而Delvik基于寄存器(后面會詳細介紹)。
         0.4 JNI
          在Delvik虛擬機的基礎上,安卓應用可以通過JNI調用arm原生代碼(arm elf,類似于windows的exe文件)。所以逆向一個應用,有時候還需要仔細分析其中包含的原生代碼,甚至最難和最核心的內容就是原生代碼的逆向。
      1. 安卓應用和Delvik指令集
      1.1 APK構建
       apk是Android package的縮寫,大家可能也非常熟悉。其中不僅包含了可執行文件(dex,odex)也包含了其他資源:圖片,界面,第三方庫等等。下圖是生成apk的流程圖(安卓官方圖)。由于這個并不是我們關心的重點,所以接下來我們會主要關注Delvik指令集。
      1.2 簡單Delvik例子(使用smali編寫的HelloWorld)
      .class public LHelloWorld;
      .super Ljava/lang/Object;
      .method public static main([Ljava/lang/String;)V
        .registers 4
      .parameter
        .prologue
      #空指令
        nop
        nop
        nop
        nop
      #數據定義指令
      const/16 v0, 0x8
      const/4 v1, 0x5
      const/4 v2, 0x3
      #數據操作指令
      move v1, v2
      #數組操作指令
      new-array v0, v0, [I
      array-length v1, v0
      #實例操作指令
      new-instance v1, Ljava/lang/StringBuilder;
      #方法調用指令
      invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
      #跳轉指令
      if-nez v0, :cond_0
      goto :goto_0
      :cond_0
      #數據轉換指令
      int-to-float v2, v2
      #數據運算指令
      add-float v2, v2, v2
      #比較指令
      cmpl-float v0, v2, v2
      #字段操作指令
      sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
      const-string v1, "Hello World" #構造字符串
      #方法調用指令
      invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
      #返回指令
      :goto_0
        return-void
      .end method
      使用命令:
      java -jar smali.jar -o classes.dex HelloWorld.smali生成dex文件(第二部分會以該文件為例詳細分析dex文件的格式)。然后將這一dex文件直接放到安卓設備中:
      adb push classes.dex /data/local/tmp
      然后再root權限(注意必須是root,否則無權限執行;因為命令在執行時 , dalvikvm 會在 /data/dalvik-cache/  目錄下創建 .dex 文件 ,因此要求 ADB 的執行 Shell 對目錄 /data/dalvik-cache/  有讀、寫和執行的權限 ,否則無法達到預期效果)的shell中執行:
      dalvikvm -cp /data/local/tmp/HelloWorld.dex HelloWorld
      可以得到結果:
      之后還會多次用到這一例子。
      1.3 Delvik指令集
         上一部分使用了最基本的Delvik語法編寫了一個基本的HelloWorld。而上次推送中的附錄中也有基本的smali語法的相關內容。本次將詳細解釋相關指令集細節。
         1.3.1 Delvik基礎
             Delvik是基于寄存器的指令,詳細的請自行google。在32位x86匯編中,函數傳參數是使用棧;arm32,arm64和amd64使用寄存器和棧(分別是4+N,8+N和6+N,意思是前幾個參數用寄存器,后面N個都用棧來傳遞);但是在Delvik中,完全使用寄存器傳遞參數:
             v命名法使用小寫字母‘v’開頭的方式表示函數中用到的局部變量與參數,所有的寄存器命名從v0開始遞增。參數使用最后的幾個寄存器,而前面的寄存器是局部變量。
             p命名法的局部變量表示與v相同,但是之后的參數的寄存器使用p開頭。這種方法可以很清楚分辨局部變量和參數。
         1.3.2 Delvik指令集(以上面的HelloWorld.smali為例)
             空指令:nop,值為00,用作對齊代碼,無操作。
             數據定義指令:const/16 v0, 0x8。將8符號位擴展為32位后賦給v0
             數據操作指令:move v1, v2。將v2賦給v1
             數組操作指令:new-array v0, v1, [I。構建類型為I(32位int)大小為v1的數組,并將值賦給v0。
             方法調用指令:invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V。調用實例的虛方法。v0,v1為參數,返回值為V(也就是void)。Ljava/io/PrintStream;->中L表示class類型,/表示類表示中的點(.),分號表示類名結束,->之后的是函數名。
         當然這僅僅是一個初步介紹,需要詳細了解的請自行查閱資料。
      2. Dex和odex文件格式。
         Dex文件是Delvik虛擬機可執行文件。
         odex文件有兩種存在:一種是apk中提取出來放在apk文件同一目錄中,后綴為odex的文件,這類文件一般是Android ROM的系統程序;另一種是保存在cache/dalvik-cache目錄下,對應著安裝在各個目錄下應用的odex文件。比如system@app@Calculator.apk@classes.dex表示在/system/app目錄下Calculator.apk程序的odex文件,而data@app@com.tencent.mm表示安裝在/data/app下的微信的odex文件。
         由于Android程序的apk文件是zip壓縮包格式,Dalvik虛擬機每次加載都需要從apk中讀取classes.dex文件,這樣會耗費很多時間。使用odex方式優化的dex文件中已經包含了加載dex必須的依賴庫文件列表,Dalvik虛擬機只需檢測并加載所需的依賴庫即可執行相應的dex文件,這大大縮短了讀取dex文件所需的時間。對于ROM來講,把系統app全部轉換成外置的odex文件與apk放在同一目錄,這樣系統啟動速度就會加快。(dexopt-wrapper命令可以完成odex文件優化過程)
         稍微一講篇幅就變長了,這次簡單給下Dex,odex和arm elf文件格式圖,詳細介紹下次再說。

      Tags:.NET技術在中國為什么老被人嫌棄,鄭州java軟件短期培訓學校哪家好,win7不能安裝.net4.0怎么辦,.NET開發技術系列議題,河南軟件測試學校哪家比較靠譜,鄭州北大青鳥學士后java培訓怎么樣

      搜索
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      熱門標簽
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      • QQ交談
      制服丝袜无码中文字幕第1页

      <track id="1rt7t"></track>
      <pre id="1rt7t"></pre>

        <p id="1rt7t"><ruby id="1rt7t"><b id="1rt7t"></b></ruby></p>