天天看點

Android軟體安全與逆向分析入門-壹-初識反編譯

前言

本系列文章主體來自我對《Android軟體安全與逆向分析》作者:豐生強(非魚)一書的讀書筆記.

在Android安全方面,我确定我是一個新手-一個從沒有編譯過Apk檔案,并且沒有學習過Java的人,是以騷年,你又擔憂什麼呢.

OK開始.

自學的過程:

  1. 分析化解搭建,分析Android軟體的方法.
  2. Dalvik虛拟機彙編-這是學習基礎.
  3. Android系統中的可執行檔案-基石.
  4. 常用工具&反彙編代碼特征.
  5. ARM彙編基礎.
  6. 原生Android程式特征及分析方法.
  7. 動态調試技術.
  8. 常見Android軟體保護與破解.
  9. 防.
  10. 不同環節安全隐患,安全程式設計.
  11. 實戰分析.

環境搭建:

工欲善其事,必先利其器.

  1. JDK - 開發必須
  2. Android SDK
  3. Android NDK動态庫
  4. CDT,ADT插件

熟悉AVD虛拟調試.

以上環境搭建成功與否測試:

  1. java -version
  2. emulator -version

    adb version

列出連接配接到PC的Android裝置:

adb devices

編寫第一個樣例.

破解

破解方法:

  1. APK檔案->APKTool反編譯->Smali反彙編代碼(從中可以了解程式的運作機制進而修改)->APKTool編譯+簽名->APK檔案
  2. APK->IDA
  3. dex2jar和jd-gui配合,進行Java源碼級分析.

舉例:

apktool d x.apk outdir 反編譯到outdir檔案夾裡

其中生成的:

- Smali目錄下- 所有反彙編代碼

- res - 所有資源

破解思路:

錯誤提示字元串:

可能的情況:

  1. 寫死
  2. 引用自”res\values\Strings.xml”,該檔案中字元串的索引值在public.xml中.搜尋對應的id在smali檔案中.

檔案簽名使用 signapk.jar,使用指令:

其中%0替換成待簽名的東東.

這三個檔案我已打包.在這裡:

Android簽名三檔案.

如何安裝一個apk快速到Android中?

adb install x.apk

Dalvik-必會的位元組碼

Dalvik虛拟機

Dalvik Virtual Machine 是谷歌設計專門在Android平台運作Android程式的虛拟機.

專用可執行檔案格式為:DEX.

每個Android程序對應一個Dalvik虛拟機的執行個體.

Java虛拟機與Dalvik虛拟機的異同:

Java位元組碼 class檔案中 java 基于棧架構

Dalvik位元組碼 DEX(Dalvik Executable) DEX(java通過dx工具轉換而來) 基于寄存器架構

如何由class檔案生成dex檔案?

dx –dex –output=x.dex x.class

反編譯指令

  1. java -jar baksmali.jar -o baksmaliout x.dex

    生成x.Smali

  2. javap -c -classpath x

    生成位元組碼

  3. dexdump.exe -d x.dex

    生成dalvik位元組碼

  4. java -jar ddx.jar -d ddxout x.dex

    生成x.ddx

Java虛拟機

Java虛拟機指令集是零位址形式的指令集-在指令中看不到目的操作數和源操作數.它們都是隐含的.

這些隐含的參數在結構體求值棧在求值棧中進行傳遞.

Java:每個線程,1個PC計數器和一個Java(求值)棧.

其中PC計數器隻對目前方法有效.

Java棧

Java棧由棧幀組成:

- 局部變量棧 ->參數(儲存在n個slot中,從左到右)&局部變量

- 操作數棧 ->中間結果,調用别的方法的參數

Java虛拟機最多支援0xff條指令.(PC寄存器大小導緻的限制.)

Android使用Dalvik虛拟機來代替Java虛拟機.

系統啟動到Dalvik虛拟機

Android系統加載核心->init程序(裝置初始化工作)->Zygote->初始化Dalvik虛拟機.

Android Root原理?

分為臨時root和永久root.

root是通過不同版本的Android系統本地提權漏洞來工作的.

你可以使用 X-ray for Android應用來檢驗你的系統是否存在這些漏洞.

Dalvik位元組碼

  1. 指令格式.
  2. 反彙編工具.

    -BakSmali-還支援使用Smali工具打包反彙編代碼重新生成dex檔案.

    -Dedexer

  3. Dalvik寄存器
  4. 寄存器命名法-v命名法,p命名法
  5. Dalvik位元組碼的類型,方法與字段表示方法

    -BakSmali反彙編後,方法: .method .end method,字段: .field

    Dalvik位元組碼的類型與Java位元組碼是對應的.

    Dalvik**類型**分為:基本類型和引用類型.引用類型分為:1.對象.2.數組[

    類型描述符:

V Z B S C
void boolean byte short char
I J F D L [
int long float double Java類(類型)
  • Dalvik指令集

    參見原書P44.

後語

咱們下篇見!

Android軟體安全與逆向分析入門-壹-初識反編譯