Android逆向基礎

 

0. Android逆向基本介紹

  1. Android APK文件結構
  2. SDK工具-adb,monitor
  3. 逆向工具介紹
  4. Android逆向分析方法
  5. 字符串分析法-實例-破解一個apk的流程
  6. 日誌過濾分析法
  7. 配置環境問題

1. Android APK文件結構

基本的APK是一個壓縮包,壓縮包中有

META-INF目錄: 簽名信息,包括公司信息、文件的HASH值
Res目錄: 資源信息,包括圖片、xml(佈局文件、字符串、風格樣式等)
AndroidMainfest.xml :清單文件,包括APK包名、四大組件的一些申明定義、權限、程序的入口
Classes.dex: 可執行文件,包括java的類信息、方法信息、字段信息、虛擬機指令。dex文件的生成流程是從java源碼->class文件->dex文件
Resources.arsc: 資源序號文件,包括資源裏的全部ID、名稱。資源ID對應文件是R.class

在Android studio 中,打開apk文件,在Lib目錄 動態庫,擴展名是.so ,包括C++代碼,有各類平臺,好比x86,arm

Assets目錄 自定義資源,好比.txt,mp4,等等
java

問題:那麼Android APK的入口函數是什麼?

本身定義的MainActivity中onCreate
並且清單文件中application節點能夠添加android:name屬性,指定繼承自application的類,用於初始化整個app的全局信息。
繼承自application的類有兩個重寫函數會執行,是程序最先執行的函數。
① attachBaseContext
② onCreate


因此一個app最先執行的函數是 application的類中的attachBaseContext函數
通常apk加固以後,都會自定義application類,並重寫其中的attachBaseContext函數或onCreate函數,而且聲明爲native類型的函數。
app運行的流程
linux

Android 系統歷史

分爲三個階段
① android2.3~4.0 卡頓
② android4.1~4.4 成長,飛躍
android虛擬機dalvik->art
③ android5.0~如今 總體不錯
逆向分析的環境
系統:android 4.4 (同時有dalvik和art)
手機: google nexus 4/5(500左右)
google nexus 6p(800左右)android

2. SDK工具-adb,monitor

adb命令

① 列舉設備
adb devices
② 將apk上傳到設備
adb push

③ 安裝apk
adb install -r apk文件名 (能夠覆蓋安裝)
④ 啓動apk
adb shell am start -n <包名/activity名稱>c++

adb -s emulator-5556 shell am start -n com.bluelesson.helloworldndk21/.MainActivity

adb shell am start -D -n <包名/activity名稱> (以調試方式啓動)
⑤ shell命令
ls,cd,su,ps,ps | grep com,kill,chmodshell

monitor操做

① 概況app

  • androidstudio中打開
  • 文件目錄中打開
  • 主要窗口

    ② 設備列表

    ③ 文件夾操做

    ④ 日誌

    過濾日誌

3. Android逆向工具

①命令行工具

1.AndroidManifest.xml清單文件解密工具

  • AXMLPrinter2.jar
    java -jar AXMLPrinter2.jar <清單文件>
    java -jar AXMLPrinter2.jar AndroidManifest.xml > out.xml
  • APK15PBParser.jar(集成了AXMLPrinter2.jar,apktool.jar中xml解析部分代碼)
    java -jar APK15PBParser.jar
    java -jar APK15PBParser.jar HelloWorld1.apk

2.Dex文件反彙編、彙編工具

Dex文件是android java代碼編譯生成的二進制文件,包含了虛擬機指令(dalvik虛擬機)less

  • Baksmali.jar(反彙編工具,將虛擬機指令反彙編成smali代碼)
    java -jar baksmali.jar -o <輸出目錄>
    java -jar baksmali.jar classes.dex -o out_dir
    反彙編生成的目錄中,包括全部dex文件中的類代碼,每個類就是一個smali文件。
    Java中有三種類,外部類、內部類、匿名類
    外部類:MainActivity.java -> MainActivity.smali
    內部類:MainActivity類中MyOnClickListener類 MainActivity$MyOnClickListener.smali
    匿名內部類:MainActivity類中new OnClickListener對象 -> MainActivity$1.smali
  • smali.jar(彙編工具,將smali代碼彙編生成dex文件)
    java -jar smali.jar <目錄> -o 文件名
    java -jar smali.jar out_dir -o out.dex
    修改smali代碼,#號是註釋代碼
    // # if-eqz v2, :cond_24

3.apk簽名工具

簽名工具,使用android系統源碼編譯時用到的一個工具
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
簽名工具:signapk.jar
密鑰對:公鑰testkey.x509.pem,私鑰 testkey.pk8
簽名:java -jar signapk.jar testkey.x509.pem testkey.pk8 代簽名.apk 已簽名.apk
簽名工具的配置
打開發送到的文件夾:shell:sendto
java -jar 全路徑 \signapk.jar 全路徑 \testkey.x509.pem 全路徑\testkey.pk8 %1 %1_signed.apk函數

4.apk反編譯工具-apktool

反編譯apk
java -jar apktool.jar d
java -jar apktool.jar d HelloWorld.apk
①將清單文件解密
②將資源序號文件與資源名稱作了一個對應關係表
生成在了/res/values/public.xml
③將dex文件反編譯成了smali代碼工具

回編譯 apk目錄
java -jar apktool.jar b <反編譯的apk文件目錄>
java -jar apktool.jar b HelloWorld
生成的APK在 <反編譯的apk文件目錄>/dist目錄中佈局

5.Dex2jar工具(轉換文件格式)

dex2jar>d2j-dex2jar.bat
dex2jar>d2j-dex2jar.bat classes.dex
dex2jar classes.dex -> .\classes-dex2jar.jar

6.Java反編譯工具(將java文件反編譯爲源碼)

②可視化工具

1.AndroidKiller工具(集成了反編譯、回編譯、安裝apk、查看源碼)

  • apktool
    所在目錄:AndroidKiller_v1.3.1\bin\apktool\apktool

    AndroidKiller SDK環境

    在Androidkiller中設置新的apktool



  • adb工具
    經常使用命令
    打開shell:adb shell , adb -s 設備名稱 shell
    安裝apk: adb install 1.apk , adb install -r 1.apk
    列舉設備: adb devices

  • dex2jar工具集
    將dex文件轉成jar文件,方便jd-gui反編譯

  • jd-gui工具
    能夠查看smali代碼對應的java源碼

    此外還有一些好工具的輔助工具

    編碼轉換

2.JEB反編譯工具

3.Jadx-GUI

4.GDA 反編譯工具

4. Android逆向分析方法

① 字符串分析法
② 日誌分析法
③ 動態調試smali, 動態調試so文件(c++生成的文件)
④ API下斷(調試so,對linux API下斷),棧回溯分析

5. 字符串分析法-實例-破解一個apk的流程

破解步驟

  1. 拿到apk
  2. 使用反編譯工具進行反編譯
  3. 根據apk運行提示,查找字符串
  4. 查找字符串進行分析,找關鍵代碼修改
  5. 使用重打包工具進行重打包
  6. 使用簽名工具進行簽名

使用AndroidKiller用字符串分析法

可是須要注意的是,中文字符串在Android是以Unicode編碼方式顯示的,格式相似\u4e0d\u597d\u610f\u601d。咱們須要進行轉換,AndroidkKiller提供了這個功能

經過查找到對應代碼,而後在代碼附近能夠發現顯示成功的字符串。在成功字符串上面有關鍵跳轉,咱們只須要將關鍵跳轉nop掉便可。其實在smali使用#號註釋掉便可。

在代碼的上方,應該就是正確密碼比對的地方,查看上下文發現v2寄存器,使用資源ID中獲取的一個字符串。

在這個時候,通常在工程中搜索資源ID,從資源ID找到對應的資源名稱以及類型,而後再根據類型和名稱找到對應資源的定義。

而後再去搜索對應資源名稱,找到字符串定義,由於已經知道類型是sting,直接能夠查看文件res/values/strings.xml。

以後,從新編譯,安裝測試。

6. Smali代碼-HelloWorld

.class public LHelloWorld;

#Ye olde hello world application
#To assemble and run this on a phone or emulator:
#
#java -jar smali.jar -o classes.dex HelloWorld.smali
#zip HelloWorld.zip classes.dex
#adb push HelloWorld.zip /data/local
#adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld
#
#if you get out of memory type errors when running smali.jar, try
#java -Xmx512m -jar smali.jar HelloWorld.smali
#instead

.super Ljava/lang/Object;


.method public static main([Ljava/lang/String;)V
    .registers 2

    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

    return-void
.end method

7. 日誌過濾法-實例

使用Monitor過濾日誌

①添加過濾項

②搜索過濾

使用AndroidKiller過濾日誌


8. 配置環境問題

夜神模擬器adb鏈接


複製androidkiller中的adb以及dll,到SDK目錄、夜神安裝目錄

相關文章
相關標籤/搜索