APK,DEX,AAR等文件格式

這篇文章是關于android應用逆向系列的第一片文章。

在這個系列里,我將講解以下內容:APK、AAR的文件格式,一些常用的逆向工程和檢測工具,dex2jar、AAPT、androguard和 apktool。

只有黑客使用嗎?

很明顯,答案是否定的。 如果你是一名開發者,在很多情況下,你需要hack應用或者向其中注入代碼。 首先,應用中有一些你感興趣的布局或者動畫效果,使用這些工具你可以拿到對應的XML資源文件。 其次,你可以看看本人的應用是如何實現具體的業務邏輯的:這并不是抄襲他人的代碼,而是通過學習可以可以提高你的編碼水平或者得到一些有用的改進提示。 最后但并非最不重要的一點,它可以檢查你的應用程序是否安全可靠,可以檢查代碼或資源被有效地混淆,或是不需要的文件沒有被包裝到最終apk。你會驚訝,別人可以知道居然有這么多的信息,例如API密鑰信息,認證令牌或閑置資源等。

APK 格式

你開發的應用將被打包成APK文件,你可以從谷歌獲得Play商店或其他渠道找到它。換句話說,對于手機上的任何一個應用程序,有相應的APK文件(包括預裝的應用程序也不例外)。 apk文件實際上也是一個zip文件,所以你拿到它以后,可以將其重命名,然后解壓得到里面的文件。如下所示示 Apk包含的內容 條目說明:

  • AndroidManifest.xmlmanifest的二進制文件
  • classes.dex程序的代碼將被編譯成dex文件
  • resources.arsc file包含預編譯的程序資源,二進制的xml格式
  • res/文件夾中包括未被編譯打包進入resources.arsc的資源
  • assets/可選的文件夾,包含應用的assets文件,由AssetManager進行檢索
  • lib/可選的文件夾,包含已編譯的代碼,例如jni的libraray
  • META-INF/文件夾中包含MANIFEST.MF文件,APK的簽名文件也在這個文件夾中

什么是DEX?

簡單講,DEX/Dalvik執行文件是一種Android平臺上的文件格式,里面包含編譯好的代碼,可以被Dalvik虛擬機或者Android Runtime (ART)讀取識別。 當一個APK文件是由Android編譯系統產生的(就像當你在Android Studio 上運行你的應用)。首先,Java類會被編譯成.class文件,后來,DX將在這些文件轉換DEX格式。 DX是Android交叉編譯器Build Tools的一部分,你可以在以下位置找到它: $ANDROID_SDK/build-tools 關于DEX文件的詳細信息請點擊 這里. 如何得到apk文件 這里有以下幾種方式:

  • 如果你想隨便找一個應用,可以使用一些網站,通過瀏覽器直接下載到你的桌面
  • 如果應用已經裝在你的手機上了,你可以使用備份軟件,例如這個,然后把他拷貝到你的手機內存或者SD卡的公共文件夾
  • 在/system/app文件夾中,你可以找到預裝應用 ,例如calculator, Chrome, camera, … 這取決于你手機上的具體ROM。
  • 在/data/app中,你可以找到用戶安裝的應用。為了從手機中導出apk,你想要使用命令行列出可用的應用(記住使用usb連接手機):adb shell pm list packages -f。其結果輸出如如下所示。

adbshellpmlistpackagef

有了apk文件的路徑,你就可以使用命令行將其導出了:adb pull -p PATH/base.apk OUTPUT.apk,-p選項可以展示傳輸文件的進度,如果導出文件的名稱沒有指定,默認會使用base.apk。

你可能對應用如何備份你的apk感到好奇:事實上,如果用手機上安裝的文件管理系統去訪問/data/app文件夾, 你會發現很多情況下是無法訪問的。但是,確實是可以通過編程方式訪問用戶安裝應用的apk文件。

首先,您需要檢索應用程序的列表:

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

List<ResolveInfo> infos = getPackageManager().queryIntentActivities(mainIntent, 0);

然后,通過resolveinfo,您可以訪問applicationinfo類中的publicsourcedir字段,這是SourceDir中公開部分的完整路徑,包括資源和manifest。

File apkFile = new File(pkgInfo.activityInfo.applicationInfo.publicSourceDir);
if(apkFile.exists()) {
    ...
}

AAR 格式

aar包是一個Android Library 項目的二進制分發:例如,Android Support Library ,你可以使用此格式將其添加到你的應用程序中。另外,如果你的Android項目的發布形式是一個Library,而不是商店的應用程序,采用這種格式再好不過了。 aar文件實際上也是一個zip文件,所以你拿到它以后,可以將其重命名,然后解壓得到里面的文件。 你可以在aar文件中找到以下內容:

條目 必選 說明
AndroidManifest.xml 必須的 manifest的XML源文件
classes.jar 必須的 Java classes打出的jar文件
res/ 必須的 該文件夾用于存放使用到的資源
R.txt 必須的 使用 aapt --output-text-symbols的輸出內容.它是library使用到的資源的清單( 包括strings, colors, dimens, attrs, layouts, ...).
assets/ 可選的 存放assert資源文件的文件夾
libs(.jar) 可選的 該文件夾用于存放library使用到的jar文件
jni(.so) 可選的 該文件夾用于存放library使用到的jni文件
proguard.txt 可選的 Proguard配置文件
lint.jar 可選的 自定義Lint規則.

AppCompat-v7-23.1.0 aar 的文件內容aar和apk相比,唯一的區別是的AndroidManifest.xml和res文件夾下的XML文件,他們都是普通的XML,所以你可以很容易地打開它們。

請注意,例如,經常被我們作為項目依賴的Support Library是AAR的格式,您可以在以下路徑找到他們:$ANDROID_SDK/extras/android/m2repository/com/android,在本系列的其余部分,我將需要關注APK格式,因為裝在手機上的應用就是這種格式的,也是這種格式分發到谷歌Play商店或其他渠道。



25选5玩法中奖