日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程

發布時間:2024/7/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

嗶哩嗶哩:https://www.bilibili.com/video/BV1UE411A7rW?p=1

Android 逆向工程師系統培訓?第九期?( 課程目錄 ):https://ke.yijincc.com/course-21.htm

安卓逆向工程師:https://ke.yijincc.com/profession/1.htm

?

?

打造年輕人的第一套安卓逆向環境!

?

原味鏡像介紹文章:https://mp.weixin.qq.com/s/gBdcaAx8EInRXPUGeJ5ljQ
原味鏡像介紹視頻:https://www.bilibili.com/video/BV1qQ4y1R7wW/
下載地址:
谷歌盤:https://drive.google.com/drive/folders/1AdZ1x5G9CcJGXiLqGL9mhDJWlRz8KZl_?usp=sharing
GoFile:https://gofile.io/d/GeqM2O
百度盤:鏈接:https://pan.baidu.com/s/1anvG0Ol_qICt8u7q5_eQJw 提取碼:3x2a
阿里盤:http://49.235.84.125:8080/r0env
登錄時用戶名:root 密碼:toor

?

?

1.?逆向環境配置

?

1. java?開發環境:java jdk、java jre

? ? ? ? java jdk?最好安裝?jdk8?的最新版本,如果安裝更高的 java 版本,一些逆向工具可能使用不了。

? ? ? ? 安裝?java jdk8?的時候會自動彈出?對應?jre?的安裝。

2. 安卓開發環境:安卓 sdk、ndk

????????安卓 sdk?和?ndk 下載完成后,直接解壓,然后配置環境變量即可。。。
????????也可以通過 android studio 進行 sdk 和 ndk 的安裝

????????通過 Android studio下載的 sdk 中沒有 tools 文件夾的解決辦法:
? ? ? ? ? ? ? ? https://blog.csdn.net/General_Ma/article/details/104707265/

? ? ? ? sdk?主要配置兩個目錄:tools、platform_tools

? ? ? ? ndk?的安裝:官網下載 (?https://developer.android.google.cn/ndk/ )? ndk?進行安裝

?

?

2.?APK?文件結構

?

?

APK 是 Android PacKage 的縮寫,即 Android 安裝包。apk 文件也就是 Android 打包流程的產物。那么 apk?是一個什么類型的文件?它包含了一些什么內容??弄清楚了這些,我們就可以帶著目的性,去分析打包流程,可以更好的關注 apk 文件中的這些內容是在打包流程的哪個過程中產生,以及是如何產生的。

眾所周知,apk 文件本質上其實是一個 zip 格式的壓縮包。想要知道其中包含了什么,改后綴然后用解壓縮工具即可打開任何一個APK文件。?如果有 代碼混淆加密,通過普通解壓縮工具打開里面的文件或目錄會看到各種亂碼

apk?概覽

  • assets (程序資源目錄)
  • META-INF(簽名證書目錄)
  • res(界面布局/圖片資源目錄)
  • AndroidManifest.xml(APK屬性/權限/組件聲明)
  • classes.dex(Android 虛擬機可執行字節碼)
  • resources.arsc(字符串/資源索引文件)

圖示:

這里解壓了某個未經過 加固加殼 或者 其他手段加密的 Android 安裝包文件,以下為結果截圖:

https://www.sohu.com/a/149758866_675634

主要注意紅色標注部分,這一些文件和文件夾是一個 Android 應用基本都具備的。而其他的一些文件和文件夾則是一些第三方庫,或者是其他一些代碼生成的。 接下來,依次大概介紹一下這些文件和文件夾的作用。

  • AndroidManifest.xml:這是 Android 應用的全局配置文件,它包含了這個應用的很多配置信息,例如包名、版本號、所需權限、注冊的服務等。可以根據這個文件在相當程度上了解這個應用的一些信息。該文件目前狀態是被編譯為二進制的 XML 文件,可以通過一些工具(如 apktool)反編譯后進行查看。Analyze apk 是一個很不錯的 apk 分析(~~hack 入門~~)工具。我們可以通過它直接反編譯看到原始的 AndroidManifest.xml 文件。

    ?

  • assets 文件夾:assets 文件夾用于保存需要保持原始文件的資源文件夾,開發過程中拖了什么到里面,打包完之后里面還是什么。一般用于存放音頻,網頁(幫助頁面之類的),字體等文件。主要需要知道的點是,它與 res 文件夾的區分以及如何在應用中訪問該文件夾的資源,如它可以有多級目錄而 res 則只有兩級。

  • dex 文件:classes.dex 文件是 Android 系統運行于 Dalvik Virtual Machine 上的可執行文件,也是Android 應用程序的核心所在。項目工程中的 Java 源碼通過 javac 生成 class 文件,再通過 dx 工具轉換為 classes.dex,注意到我們這里有 classes2.dex 和 classes3.dex。這是方法數超過一個 dex 的上限,分 dex 的結果。分 dex 在 Android 5.0 之前需要開發者自行完成,5.0 后 dx 自帶支持。dex 文件的數據結構不算復雜,如下圖所示。目前一些熱補丁有關的技術,主要便是對 dex 做各種處理。

  • lib 文件夾:該目錄存放著應用需要的 native 庫文件。比如一些底層實現的圖片處理、音視頻處理、數據加密的庫以 so 庫的形式在該文件夾中。而該文件夾下有時會多一個層級,這是根據不同CPU 型號而劃分的,如 ARM,ARM-v7a,x86等。

    ?

  • META-INF 文件夾:該目錄的主要作用是用于保證 APK 的完整性以及安全性。該文件夾下,主要有三個文件。
    ? ? ? ? MANIFEST.MF:這個文件保存了 整個apk文件所有文件的文件名 + SHA-1后的編碼值。
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這也就意味著,MANIFEST.MF 象征著 apk 包的完整性。
    ? ? ? ? XXX.RSA:這個文件保存了公鑰和加密方式的信息。
    ? ? ? ? XXX.SF:這個文件與 MANIFEST.MF 的結構一樣,只是其編碼會被被私鑰加密。
    ? ? ? ? ? ? ? ? ? ? ? ? ? ?這樣一來每次安裝時,通過該文件夾中的文件,就可以完成驗證的過程。
    ? ? ? ? ? ? ? ? ? ? ? ? ? ?如果 apk 包被改變了,而篡改者沒有私鑰生成 CERT.SF,則無法完成校驗。

  • res 文件夾:顧名思義,該文件夾是資源文件夾。它里面存放的所有文件都會被映射到 R 文件中,生成對應的資源 ID,便于代碼中通過 ID 直接訪問。其中的資源文件包括了動畫(anim),圖像(drwable),布局(layout),常量值(values),顏色值(colors),尺寸值(dimens),字符串(strings),自定義樣式(styles)等。

  • resource.arsc 文件:這個文件可以說是所有文件中結構最復雜的。它記錄了資源文件,資源文件位置(各個維度的路徑)和資源 id 的映射關系。并且將所有的 string 都存放在了 string pool 中,節省了在查找資源時,字符串處理的開銷。

    我們可以使用 Androdi Studio 2.2 Preview 中的新功能 Analyze apk (這個新功能用來分析 apk 非常好用,強烈推薦各位讀者可以嘗試一下)來看看它到底包含了些什么,一圖勝過千言:

    可以看到,首先是有個 package 可選,實際上 resource.arsc 是可以包含多個 package 的資源的。 然后可以看到一個 Resource Types 的列表。這里看到的是 drawable 的 type。 右邊顯示了有多少個 drawable 以及多少項 configurations,以及表的具體內容為 ID - Name - 各個維度的值(在這里即是資源的路徑),通過這個,我們可以完成通過 id + 對應的 configuration 獲取對應資源的操作。

    而后面要提到資源混淆的原理,就是修改這里各個維度的值,并修改對應 res 里面的文件夾以及文件名實現的。

    具體其完整的數據結構比較復雜,在這里就不展開說了,有興趣的讀者可以自行查閱信息,甚至寫一個 parser 出來也是非常有意思的。

?

?

總結:

?

?

3. APK?打包流程

android配置構建 官方文檔

Android應用程序(APK)的編譯打包過程:https://www.cnblogs.com/sjm19910902/p/6416022.html

Android APK打包流程:https://www.cnblogs.com/xunbu7/p/7345912.html
APK打包流程:https://blog.csdn.net/loongago/article/details/89646920
apk文件以及打包流程:https://blog.csdn.net/mysimplelove/article/details/93516904
淺述Android Apk打包流程:https://www.jianshu.com/p/d29c37dda256
Android 打包之流程:https://www.jianshu.com/p/d22f52a6a6fb

APK打包安裝過程:https://segmentfault.com/a/1190000004916563

原創]記一次APP脫殼重打包過程:https://bbs.pediy.com/thread-220151.htm

下圖的是官網對于Android編譯打包流程的介紹。

官方的介紹非常籠統,簡而言之,其大致流程就是: 編譯–>DEX–>打包–>簽名和對齊

來一張外國大神的圖片(注:這張圖少了簽名的步驟)

流程圖:

重點關心的是

  • (1)這個過程的輸入是什么?
  • (2)這個過程的輸出是什么?
  • (3)這個過程使用了什么工具?至于使用什么參數,可以自己去看對應命令的幫助文件,或者在網上搜索,

aapt -> aidl -> javac -> dx(dex) -> apkbuilder -> jarsigner -> zipalign

步驟中提到的工具如下表:

名稱功能介紹在操作系統中的路徑
aaptAndroid 資源打包工具${ANDROID_SDK_HOME}/platform-tools/appt
aidl

Android接口描述語言轉化為.java文件的工具

( aidl 全名 Android Interface Definition Language,即Android接口定義語言 )

${ANDROID_SDK_HOME}/platform-tools/aidl
javacJava Compiler${JDK_HOME}/javac或/usr/bin/javac
dex轉化.class文件為Davik VM能識別的.dex文件${ANDROID_SDK_HOME}/platform-tools/dx
apkbuilder生成 apk 包 (SDK3.0 之后棄用而使用 sdklib.jar 打包 apk${ANDROID_SDK_HOME}/tools/opkbuilder
jarsigner.jar文件的簽名工具${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign字節碼對齊工具${ANDROID_SDK_HOME}/tools/zipalign

補充:apkbuilder 在 SDK3.0 之前使用 apkbuilder 去打包,在 SDK3.0 之后就棄用了,而使用 sdklib.jar 打包 apk。

下面各個工具在打包中的用法:

?

編譯打包步驟:

  • 1. 打包資源文件,生成R.java文件。打包資源的工具是aapt(The Android Asset Packaing Tool)(E:\Documents\Android\sdk\build-tools\25.0.0\aapt.exe)。在這個過程中,項目中的AndroidManifest.xml文件和布局文件XML都會編譯,然后生成相應的R.java,另外AndroidManifest.xml會被aapt編譯成二進制。存放在APP的res目錄下的資源,該類資源在APP打包前大多會被編譯,變成二進制文件,并會為每個該類文件賦予一個resource id。對于該類資源的訪問,應用層代碼則是通過resource id進行訪問的。Android應用在編譯過程中aapt工具會對資源文件進行編譯,并生成一個resource.arsc文件,resource.arsc文件相當于一個文件索引表,記錄了很多跟資源相關的信息。
  • 2. 處理aidl文件,生成相應的Java文件。這一過程中使用到的工具是aidl(Android Interface Definition Language),即Android接口描述語言(E:\Documents\Android\sdk\build-tools\25.0.0\aidl.exe)。aidl工具解析接口定義文件然后生成相應的Java代碼接口供程序調用。如果在項目沒有使用到aidl文件,則可以跳過這一步。
  • 3. 編譯項目源代碼,生成class文件。項目中所有的Java代碼,包括R.java和.aidl文件,都會變Java編譯器(javac)編譯成.class文件,生成的class文件位于工程中的bin/classes目錄下。
  • 4. 轉換所有的class文件,生成classes.dex文件。dx工具生成可供Android系統Dalvik虛擬機執行的classes.dex文件,該工具位于(E:\Documents\Android\sdk\build-tools\25.0.0\dx.bat)。任何第三方的libraries和.class文件都會被轉換成.dex文件。dx工具的主要工作是將Java字節碼轉成成Dalvik字節碼、壓縮常量池、消除冗余信息等。
  • 5. 打包生成APK文件。所有沒有編譯的資源,如images、assets目錄下資源(該類文件是一些原始文件,APP打包時并不會對其進行編譯,而是直接打包到APP中,對于這一類資源文件的訪問,應用層代碼需要通過文件名對其進行訪問);編譯過的資源和.dex文件都會被apkbuilder工具打包到最終的.apk文件中。打包的工具apkbuilder位于 android-sdk/tools目錄下。apkbuilder為一個腳本文件,實際調用的是(E:\Documents\Android\sdk\tools\lib)文件中的com.android.sdklib.build.ApkbuilderMain類。
  • 6. 對APK文件進行簽名。一旦APK文件生成,它必須被簽名才能被安裝在設備上。在開發過程中,主要用到的就是兩種簽名的keystore。一種是用于調試的debug.keystore,它主要用于調試,在Eclipse或者Android Studio中直接run以后跑在手機上的就是使用的debug.keystore。另一種就是用于發布正式版本的keystore。
  • 7. 對簽名后的APK文件進行對齊處理。如果你發布的 apk 是正式版的話,就必須對APK進行對齊處理,用到的工具是zipalign(E:\Documents\Android\sdk\build-tools\25.0.0\zipalign.exe)。對齊的主要過程是將APK包中所有的資源文件距離文件起始偏移為4字節整數倍,這樣通過內存映射訪問apk文件時的速度會更快。對齊的作用就是減少運行時內存的使用。

上述流程都是Android Studio在編譯時調用各種編譯命令自動完成的

?

第一步:打包資源文件,生成R.java文件

編譯 R.java 類 需要用到 AndroidSDK 提供的 aapt 工具,aapt 參數眾多,以下是主要參數:

-d one or more device assets to include, separated by commas -f force overwrite of existing files -g specify a pixel tolerance to force images to grayscale, default 0 -j specify a jar or zip file containing classes to include -k junk path of file(s) added -m make package directories under location specified by -J -u update existing packages (add new, replace older, remove deleted files) -v verbose output -x create extending (non-application) resource IDs -z require localization of resource attributes marked with localization="suggested" -A additional directory in which to find raw asset files -G A file to output proguard options into. -F specify the apk file to output -I add an existing package to base include set -J specify where to output R.java resource constant definitions -M specify full path to AndroidManifest.xml to include in zip -P specify where to output public resource definitions -S directory in which to find resources. Multiple directories will be scann

aapt 編譯 R.java 文件具體如下:

需要進入應用程序目錄,新建一個gen目錄,沒有gen目錄,命令將會出現找不到文件的錯誤!

命令成功執行后將會在 gen 目錄下生成成包結構的目錄樹,及 R.java 文件。

列子:

aapt 資源編譯

  • 編譯assets目錄和res/raw目錄下的資源
  • 編譯res目錄下的資源文件
  • 給res目錄下的每個資源賦予一個資源ID,生成resource.arsc資源索引文件
  • 解析并編譯AndroidMainifest.xml
  • 資源打包成*.ap_,資源ID常量定義自R.java
  • 資源索引

    aapt 給每一個非 assets 目錄的資源定義一個資源ID,它是一個4字節(byte = 32bit)的數字,格式是PPTTNNNN,PP代表資源所屬的包(package),TT代表資源的類型(Type),NNNN代表這個類型下面的資源名稱(Entry ID)。

    • Package ID相當于是一個命名空間,標定資源的來源。系統資源的命名空間,它的package ID等于0x01;自己的APP資源名稱空間,Package ID一般定義為0x7f。
    • Type ID是指資源的類型ID。資源的類型都有animator、anim、color、drawable、layout、menu、raw、string和xml等等若干種,每一種都會被賦予一個ID。
    • Entry ID是指每一個資源在其所屬的資源類型中所出現的次序。

    代碼編譯和打包

    • AIDL -> 生成對應的java接口
    • Javac -> 生成.class文件
    • dex-> 生成dex文件
    • APkBuilder:aapt打包好的資源、dex打包好的代碼文件、第三方庫資源和jar文件、native -> apk

    ?

    第二步:處理AIDL文件,生成對應的.java文件

    當然,有很多工程沒有用到AIDL,那這個過程就可以省了

    將 .aidl 文件生成 .java 文件需要用到 AndroidSDK 自帶的 aidl 工具,此工具具體參數如下:

    -I<DIR> search path for import statements. -d<FILE> generate dependency file. -p<FILE> file created by --preprocess to import. -o<FOLDER> base output folder for generated files. -b fail when trying to compile a parcelable. 值得注意的是:這個工具的參數與參數值之間不能有空格,Google也有對工資不滿意的工程師!

    例子:

    ?

    第三步:編譯Java文件,生成對應的.class文件

    javac 命令用法如下:

    其中,可能的選項包括: -g 生成所有調試信息 -g:none 不生成任何調試信息 -g:{lines,vars,source} 只生成某些調試信息 -nowarn 不生成任何警告 -verbose 輸出有關編譯器正在執行的操作的消息 -deprecation 輸出使用已過時的 API 的源位置 -classpath <路徑> 指定查找用戶類文件和注釋處理程序的位置 -cp <路徑> 指定查找用戶類文件和注釋處理程序的位置 -sourcepath <路徑> 指定查找輸入源文件的位置 -bootclasspath <路徑> 覆蓋引導類文件的位置 -extdirs <目錄> 覆蓋安裝的擴展目錄的位置 -endorseddirs <目錄> 覆蓋簽名的標準路徑的位置 -proc:{none,only} 控制是否執行注釋處理和/或編譯。 -processor <class1>[,<class2>,<class3>...]要運行的注釋處理程序的名稱;繞過默認的搜索進程 -processorpath <路徑> 指定查找注釋處理程序的位置 -d <目錄> 指定存放生成的類文件的位置 -s <目錄> 指定存放生成的源文件的位置 -implicit:{none,class} 指定是否為隱式引用文件生成類文件 -encoding <編碼> 指定源文件使用的字符編碼 -source <版本> 提供與指定版本的源兼容性 -target <版本> 生成特定 VM 版本的類文件 -version 版本信息 -help 輸出標準選項的提要 -Akey[=value] 傳遞給注釋處理程序的選項 -X 輸出非標準選項的提要 -J<標志> 直接將 <標志> 傳遞給運行時系統

    例子:

    javac -encoding utf-8 -target 1.5 -bootclasspath E:\Androiddev\android-sdk-windows2.2\platforms\android-3\android.jar -d bin src\com\byread\reader\*.java gen\com\byread\reader\R.java?

    ?

    第四步:把.class文件轉化成Davik VM支持的.dex文件

    將工程 bin目錄下的 class 文件編譯成 classes.dex,Android 虛擬機只能執行 dex 文件。

    例子:

    ?

    第五步:打包生成未簽名的 .apk 文件

    • 【輸入】打包后的資源文件、打包后類文件(.dex文件)、libs文件(包括.so文件,當然很多工程都沒有這樣的文件,如果你不使用C/C++開發的話)
    • 【輸出】未簽名的.apk文件
    • 【工具】apkbuilder工具

    apkbuilder? 工具用法如下:

    -v Verbose. -d Debug Mode: Includes debug files in the APK file. -u Creates an unsigned package. -storetype Forces the KeyStore type. If ommited the default is used. -z Followed by the path to a zip archive. Adds the content of the application package. -f Followed by the path to a file. Adds the file to the application package. -rf Followed by the path to a source folder. Adds the java resources found in that folder to the application package, while keeping their path relative to the source folder. -rj Followed by the path to a jar file or a folder containing jar files. Adds the java resources found in the jar file(s) to the application package. -nf Followed by the root folder containing native libraries to include in the application package.

    列子:

    apkbuilder? ${output.apk.file} -u -z? ${packagedresource.file} -f? ${dex.file}? -rf? ${source.dir}? -rj? ${libraries.dir}?

    ?

    第六步:對未簽名 .apk 文件進行簽名

    通過 jarsigner 命令用證書文件對未簽名的 APK 文件進行簽名

    【輸入】未簽名的.apk文件
    【輸出】簽名的.apk文件
    【工具】jarsigner

    用法:jarsigner [選項] jar 文件別名 jarsigner -verify [選項] jar 文件 [-keystore <url>] 密鑰庫位置 [-storepass <口令>] 用于密鑰庫完整性的口令 [-storetype <類型>] 密鑰庫類型 [-keypass <口令>] 專用密鑰的口令(如果不同) [-sigfile <文件>] .SF/.DSA 文件的名稱 [-signedjar <文件>] 已簽名的 JAR 文件的名稱 [-digestalg <算法>] 摘要算法的名稱 [-sigalg <算法>] 簽名算法的名稱 [-verify] 驗證已簽名的 JAR 文件 [-verbose] 簽名/驗證時輸出詳細信息 [-certs] 輸出詳細信息和驗證時顯示證書 [-tsa <url>] 時間戳機構的位置 [-tsacert <別名>] 時間戳機構的公共密鑰證書 [-altsigner <類>] 替代的簽名機制的類名 [-altsignerpath <路徑列表>] 替代的簽名機制的位置 [-internalsf] 在簽名塊內包含 .SF 文件 [-sectionsonly] 不計算整個清單的散列 [-protected] 密鑰庫已保護驗證路徑 [-providerName <名稱>] 提供者名稱 [-providerClass <類> 加密服務提供者的名稱 [-providerArg <參數>]] ... 主類文件和構造函數參數

    只需要按步驟生成 MANIFEST.MF, CERT.RSA,CERT.SF 并放入META-INF 文件夾即可。

    ?

    第七步:對簽名后的.apk文件進行對齊處理

    不進行對齊處理是不能發布到Google Market的

    【輸入】簽名后的.apk文件
    【輸出】對齊后的.apk文件
    【工具】zipalign工具

    知道了這些細節之后,我們就可以實現很多我們想實現東西了,比如:自動化,我們可以使用某種腳本,像Windows下的批處理,linux下的Bash,Java下的Ant,Python、Perl這樣的腳本語言,甚至直接用Java、.net這們的強類型語言也是可以的。

    ?

    以上便是APK打包的整個流程,我們再來總結一下:

    • 除了assets和res/raw資源被原裝不動地打包進APK之外,其它的資源都會被編譯或者處理;
    • 除了assets資源之外,其它的資源都會被賦予一個資源ID;
    • 打包工具負責編譯和打包資源,編譯完成之后,會生成一個resources.arsc文件和一個R.java,前者保存的是一個資源索引表,后者定義了各個資源ID常量。
    • 應用程序配置文件AndroidManifest.xml同樣會被編譯成二進制的XML文件,然后再打包到APK里面去。
    • 應用程序在運行時通過AssetManager來訪問資源,或通過資源ID來訪問,或通過文件名來訪問。

    ?

    ?

    4. APK?安裝流程

    Android中APK安裝流程解析:https://blog.csdn.net/mysimplelove/article/details/93619361

    APK安裝后最終放置在了哪里?安裝APP到底是怎樣的一個過程?如何打開并修改APK程序包?

    如果使用 WinHex 打開apk文件,從文件頭就可以看出APK安裝包其實就是一個zip格式的壓縮包,所以我們只需將apk文件的后綴修改為 .zip 或 .rar ,就可以輕松的在電腦上打開并查看apk軟件內部的文件和數據(當然你也可以使用手機R.E管理器查看)。

    Android 安裝 apk包的五種方式:

    • 1, 通過工具安裝:R.P 或 ES等管理工具,有安裝界面。
    • 2,adb install 安裝,無安裝界面。
    • 3,android market 在線安裝,無安裝界面。
    • 4,直接 copy 到系統目錄/system/app下,無安裝界面。此目錄下的應用一般是系統自帶的系統級程序和常歸應用。
    • 5,pm(android 系統自帶工具) 命令行安裝,無安裝界面。

    apk 文件在安裝到手機過程中,涉及到如下幾個目錄:

    /system/framwork: 保存的是資源型的應用程序,它們用來打包資源文件。 /data/app-private: 保存受DRM保護的私有應用程序。 /vendor/app: 保存設備廠商提供的應用程序。 /system/app ------- 系統自帶的應用安裝目錄,獲得 adb root權限才能刪除 /data/app ------- 用戶程序安裝的目錄,安裝時把 apk文件 復制到 此目錄 /data/data ------- 存放應用程序的數據 /data/dalvik-cache 將 apk 中的 dex文件 安裝到 dalvik-cache 目錄下(dex文件是dalvik虛擬機的可執行文件,其大小約為原始apk文件大小的四分之一)/data/system:該目錄下的packages.xml文件,類似于Windows的注冊表,記錄了系統的permissions,每個apk的name,codePath,,version,userid等信息,這些信息主要通過AndroidManifest.xml文件解析獲取,解析完apk后將更新信息寫入這個文件并保存到flash,下次開機的時候直接從里面讀取相關信息并添加到內存相關列表中。當有APK安裝、升級或者刪除時會更新這個文件。/data/system/packages.xml /data/system/packages.list: packages.list指定了應用的默認存儲位置/data/data/com.xxx.xxx;package.xml中包含了該應用 權限、應用包名、APK的安裝位置、版本、userID等信息,并且兩者都有同一個userld。之所以每個 應用都要一個userId,是因為Android在系統設計上把每個應用當做Linux系統上的一個用戶對待, 這樣就可以利用已有的Linux用戶管理機制來設計Android應用,比如應用目錄,應用權限,應用進程管理等。

    安裝過程:

    當我們新安裝一個應用的時候,通常系統會執行以下流程:

    校驗apk包簽名 → 復制程序包到 /data/app 目錄 → 建立 /data/data/com.xxx 數據目錄 → 提取釋放lib文件 → dexopt優化classes.dex處理后釋放到 /data/dalvik-cache 目錄

    在這個過程中,Android 系統服務還會更新以下系統文件:

    • /data/system/packages.list? ?--? 分配存儲APP的uid/gid,也就是用戶/所屬組
    • /data/system/packages.xml? --? 記錄保存APP權限、簽名證書、安裝路徑、版本信息等

    由此可見,我們安裝好的軟件程序包被原本不動存放在 /data/app 目錄之下,數據目錄則被安放在 /data/data/pkg_name(包名) 目錄之中。而卸載過程則相反,進行刪除相關文件處理。

    ?

    整個 apk 安裝流程:

    • 復制 APK 到 /data/app 目錄 下,解壓(會放到 data/app/包名/ 目錄下面,同時 apk 中的 so 文件 也會拷貝到此目錄下的 lib 文件目錄中。)并掃描安裝包。而系統出廠的 apk 被放到 /system分區下,這就是沒有ROOT手機前,我們無法刪除系統app的原因。(?下面?是用?MT?管理器 (需要獲取root?權限)?打開)
    • 資源管理器解析 APK 里的資源文件。
    • 解析 AndroidManifest.xml(Android應用程序的解析過程就是解析這個xml文件的過程)。解析的內容會被更新到/data/system/packages.xml?和?/data/system/packages.list中,packages.list 中指名了該應用默認存儲的位置,packages.xml 中包含了該應用申請的權限、簽名和代碼所在位置等信息,并且兩者都有一個?相同的 userId。之所以每個應用都有一個userId,是因為Android 在系統設計上把每個應用當作Linux系統上的一個用戶對待,這樣就可以利用已有的Linux上用戶管理機制來設計Android應用,比如應用目錄,應用權限,應用進程管理等。做完以上操作,就相當于應用在系統注冊了,可以被系統識別。接下來就得保存應用的執行文件了,根據?packages.xml中指定的?codePath,創建一個目錄,即/data/data/ 目錄?下創建對應的 應用數據目錄apk會被命名成?base.apk?并拷貝到此,其中 lib 目錄用來存放 native 庫
    • 然后對 dex 文件進行優化,并保存在 dalvik-cache目錄 下。其命名規則是 apk路徑+classes.dex。(此時應用就可以運行了,但如果每次應用運行還得去base.apk中取dex文件,效率就太低了。為了提升效率,Android系統在應用安裝時還會做些優化操作,把所有可運行的dex文件單獨提取放在一塊并做些優化。在Dalvik模式下,會使用dexopt把base.apk中的dex文件優化為odex,存儲在/data/dalvik-cache中,如果是ART模式,則會使用dex2oat優化成oat文件也存儲在該目錄下,并且文件名一樣,但文件大小會大很多,因為ART模式會在安裝時把dex優化為機器碼,所以在ART模式下的應用運行更快,但apk安裝速度相對Dalvik模式下變慢,并且會占用更多的ROM。
    • 將 AndroidManifest 文件解析出的四大組件信息注冊到 PackageManagerService 中。
    • 安裝完成后,發送廣播。
    • 顯示icon圖標:應用程序經過PMS中的邏輯處理后,相當于已經注冊好了,如果想要在Android桌面上看到icon圖標,則需要Launcher將系統中已經安裝的程序展現在桌面上。

    安裝圖解和過程描述:

    安裝過程并沒有把資源文件, assets目錄下文件拷貝出來,他們還在apk包里面呆著,所以,當應用要訪問資源的時候,其實是從apk包里讀取出來的。其過程是,首先加載apk里的resources.arsc(這個文件是存儲資源Id與值的映射文件),根據資源id讀取加載相應的資源。

    刪除安裝過程:就是刪除在上述三個目錄下創建的文件及目錄。

    總體說來就兩件事情:拷貝APK解析APK,解析APK主要是解析 AndroidManifest.xml,以便獲得它的安裝信息。在安裝的過程中還會這個應用分配 Linux用戶ID 和 Linux用戶組ID(以便它可以在系統中獲取合適的運行權限)。

    ?

    涉及的三個進程

    • PackageInstaller進程:PackageInstaller事實上是一個應用,它負責APK安裝以及卸載過程中與用戶的交互流程。
    • SystemServer進程:該進程主要運行的是系統服務,APK的安裝、卸載和查詢都由PackageManagerService負責,它也是Android核心系統服務的一種,在SystemServer里初始化系統服務的時候被啟動。
    • DefaultContainerService進程:DefaultContainerService也是一個單獨的進程,它主要負責檢查和復制設備上的文件,APK的復制就是由DefaultContainerService來完成的。

    ?

    apk 解析流程

    • Android不同類型
      /system/framwork:保存的是資源型的應用程序,它們用來打包資源文件。
      /system/app:保存系統自帶的應用程序。
      /data/app:保存用戶安裝的應用程序。
      /data/app-private:保存受DRM保護的私有應用程序。
      /vendor/app:保存設備廠商提供的應用程序。
    • DEX的dexopt流程
      dexopt操作實際上對DEX文件在執行前進行一些優化,但是不同的虛擬機操作有所不同。
      Davlik:將dex文件優化生成odex文件,這個odex文件的后綴也是dex,保存在/data/dalvik-cache目錄下。
      ART:將dex文件翻譯生成oat文件

    ?

    如何修改 & 反編譯APK軟件包?

    如果只是修改程序包的一些圖片/assets資源,直接在電腦上用解壓縮工具,解壓后就可以修改替換,但是重新打包后需要重新簽名,否則沒有簽名或者簽名校驗不正確的應用是無法安裝成功的。

    而如果想要修改apk包中其他的已經編譯后的文件,則需要反編譯。由于 Android 本質上就是一個 Java 虛擬機,而 classes.dex 文件則是眾多 .class 文件的打包集合,一般我們先要使用 dex2jar 將 classes.dex 解包為 Java jar 文件,然后再通過 JD-GUI 將 jar 文件的 .class 文件反編譯為 .java 源碼。

    整個反編譯dex的過程原理大致簡單來說就是這樣,但是實際操作起來難度不小,因為很多程序都經過了混淆加密處理(比如QQ,微信等等大公司的軟件不可能讓人分分鐘反編譯破解,否則整個安卓APP世界還不亂套了...)

    對于apk程序包其他的一些xml布局文件,直接打開是亂碼怎么辦?dex字節碼都能反編譯成功,xml就更簡單一些了。網上有很多現成的工具,比如 AXMLPrinter2.jar ,可以直接解碼反編譯xml文件,當然執行 .jar文件需要在電腦上事先安裝好 JRE(Java運行環境)喲!

    關于 Android 應用的反編譯這里僅是簡單介紹一下原理和過程,明白了解一下就好。具體的方法百度一搜一大把。

    ?

    ?

    虛擬機

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。