天天看點

Android應用逆向分析

Android逆向入門

  • Java語言, smali彙編 dex odex ->android ndk開發
  • 加殼與脫殼(vmp技術)
    • 一般需要保護的檔案就是dex,so檔案

APK結構

Android應用逆向分析
  • 逆向分析工具:
    • Android SDK
    • APKTool
    • jarsigner
    • keytool
  • 逆向步驟:
    • 解壓apk和拆卸classes.dex檔案
    • 在APP上進行靜态分析
    • 在APP中注入代碼

指令行的方式進行操作:

  • 首先使用Android studio編譯生成apk檔案
  • 下載下傳apktool檔案,并将檔案名改為apktool
  • 然後将你的apk檔案拷貝出來将字尾名改為.zip檔案,解壓
    Android應用逆向分析
java -jar apktool.jar d xxx.apk
           
Android應用逆向分析
  • 這時候在生成的檔案下會有一個smali檔案,主要差別就是Java檔案全部轉換為smali檔案,smali檔案是個Android虛拟機使用的寄存器語言。
  • 在HelloWorld程式中添加以下代碼即為Toast語句
invoke-virtual {p0}, Lcom/vogella/android/hackdemo/MainActivity;->getApplicationContext()Landroid/content/Context;
    move-result-object v1
    const/4 v3, 0x0
    invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)
    Landroid/widget/Toast;
    move-resulkt-object v1
    invoke-virtual {v1}, Landroid/wiget/Toast;->show()V
           
  • 打包
java -jar apktool.jar b app-debug -o newdebug.apk
           
Android應用逆向分析
  • 在同目錄下就會出現新的apk檔案,但是此APK檔案是沒有簽名的APK 是以安裝之後會出現無法進行解析的錯誤:
  1. 首先執行檢視keystore檔案别名:
keytool -list -v -keystore [keystore檔案路徑] -storepass [keystore檔案密碼]
           

2.然後執行簽名指令:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名檔案名 -storepass 簽名密碼 待簽名的APK檔案名 簽名的别名
           
Android應用逆向分析

3.接着将之前的程式解除安裝進行安裝我們呢剛才通過修改smali代碼的apk即可

IDE(AndroidKiller)操作:

  • 使用的工具在這裡下載下傳
  • 直接使用該應用打開APK即可
  • 從bin檔案下可以看出和上面的原理相同:
    Android應用逆向分析
  • smali文法簡述:
V void
Z boolean
B byte
S short
C char
F float
I int 
J long
D double
[ array

比如:
Ljava/lang/String; //String類型
[I //一維int數組
           
  • 方法全名:
Lpackage/name/ObjectName;->methodName(III)Z
(III)Z方法簽名
           
  • 方法體:
    • BakSmali生成的方法代碼以.method指令開始,以.end method指令結束
    • 根據方法的類型不同,可以會在方法前加 # 表示方法類型
  • 虛方法:
const-class v1, Lcn/woblog/markdowndiary/domain/Note
move-result-object v0
check-cast v0, Lcn/woblog/markdowndiary/domain/Note
return-object v0
           
  • 直接方法:
invoke-direct {p0} ,Ljava/lang/Object;-><init>()V
           
  • 靜态方法:
move-result-object
return-object v1
           
  • 字段:
field private static instance:Lcn/woblog/markdowndiary/respository/LocalNoteRepository;
           

繼續閱讀