第一次反編譯 Android APK


  最近某個常用的 APP 突然就從 Google Play、App Store 下架了,但是後面的伺服器一就是正常服務的狀態(個人猜測是商業考量)。為了使用 Charles 配合 Android 模擬器分析封包,最終目的是跳過 APP 直接向後端伺服器打 API 拿到我想要的資料,於是就有了這次的紀錄。

為什麼需要反編譯 APK?

  在大學時曾經在某個課程中用過 Charles 這套軟體,有點類似 Wireshark 的功能,但是 Charles 是針對 HTTP 協定的抓包工具,且它支援 SSL Proxy,可以透過它來擷取 HTTPS METHODS 的內容。然而在 Android 7 以後,必須在 APP 中寫入需要自訂憑證的 Domain Name 才可以透過 Charles 抓包(安全性考量,請參考官方文件)。

解開 APK

  我使用的是知名的反編譯工具:Apktool,參考安裝說明安裝好即可開始作業。

apktool d name.apk
I: Using Apktool 2.6.1 on name.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\xxxx\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Baksmaling classes2.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

修改 APP 內容

  編輯解開的 APP 後產生的資料夾內的 AndroidManifest.xml ,找到 <application 開頭的片段,在修改成為 <application android:networkSecurityConfig="@xml/network_security_config"

  在 res/xml/ 中新增空白檔案 network_security_config.xml,加入下列內容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <!-- 有幾個 Domain Name 要抓包,就寫幾行 -->
        <domain includeSubdomains="true">example.com</domain>
        <domain includeSubdomains="true">example2.com</domain>
        <trust-anchors>
            <certificates src="user"/> 
        </trust-anchors>
    </domain-config>
</network-security-config>

打包 APK

  回到 APK 資料夾的上一層,再次使用 apktool 打包,完成的檔案會存在 dist/ 資料夾中。

apktool b name

執行結果:

I: Using Apktool 2.6.1
I: Checking whether sources has changed...
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...

  進入 dist/ 資料夾簽署 APK,一開始沒做這個步驟,結果 APK 沒辦法安裝在 Android 虛擬機中XD。

Tips: 如果找不到指令的話,請安裝 jrejdk 並加入 PATH 中喔。

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [Your Key Store] [Address/YourApk.apk] alias_name  -storepass [Your Password]

執行結果:

   adding: META-INF/MANIFEST.MF
   adding: META-INF/ALIAS_NA.SF
   adding: META-INF/ALIAS_NA.RSA
  signing: AndroidManifest.xml
  signing: classes.dex
  signing: classes2.dex
.....
  signing: org/eclipse/paho/client/mqttv3/internal/nls/messages_ru.properties
  signing: org/eclipse/paho/client/mqttv3/internal/nls/messages_zh_CN.properties
  signing: org/eclipse/paho/client/mqttv3/internal/nls/messages_zh_TW.properties
  signing: org/eclipse/paho/client/mqttv3/logging/jsr47min.properties

>>> Signer
    X.509, CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
    Signature algorithm: SHA256withRSA, 2048-bit key
    [trusted certificate]

jar signed.

Warning:
The signer's certificate is self-signed.
The SHA1 algorithm specified for the -digestalg option is considered a security risk and is disabled.
The SHA1withRSA algorithm specified for the -sigalg option is considered a security risk and is disabled. 

這樣 APK 就可以安裝來抓包,依據 HTTP Methods 的內容來寫 Scripts 直接操作 API 囉。

Reference::


See also