APK 分析器
放入一個 Android 安裝包——.apk 檔案——在它靠近任何一部手機之前,先讀它對自己的聲明:套件名稱與版本、它所針對的 SDK 等級、它申請的每一項權限、它是否允許除錯與備份、它的哪些元件能被其他應用觸及,以及它是用什麼憑證簽署的。檔案從不離開你的裝置:它在本頁面中開啟和解析,不會上傳,因為你正懷疑的那個 APK,恰恰是最不該交給陌生人伺服器的檔案。
也可以把檔案拖放到這個框的任意位置。下面的一切都從安裝包本身、在這台裝置上讀取——清單、編譯後的資源和簽章區塊。
安裝包摘要
權限
保護等級遵循 Android 框架自身的分類。本頁面不認識的權限會被如實報告為不在參考表中——自訂、廠商或較新的權限都會誠實標明,絕不猜測。
應用旗標
元件
簽章憑證
說明
一個 APK 在執行任何一行程式碼之前就宣告了什麼
APK 是一個有主見的 ZIP 壓縮包。在 Android 執行它的任何程式碼之前,系統會先讀它內部的二進位 AndroidManifest.xml,而這一個檔案就是一份出乎意料地完整的意圖聲明。它寫明套件名稱——更新正是按它來比對身分的——以及版本。它宣告應用自稱支援的最舊 Android 版本,以及它按其行為規則建構的目標版本,這正是目標 SDK 重要的原因:目標定得低,就會悄悄讓更舊、更寬鬆的權限行為繼續生效。它列出應用將來能用到的每一項權限,因為沒有宣告的權限之後也無法被授予。它說明這個建構是否可除錯——一個絕不該活著進入正式發布的旗標——以及它的資料是否可以被捲入裝置備份。它還盤點了應用的元件:活動、服務、接收器和提供者,每個都帶一個匯出狀態,決定裝置上的其他應用能否呼叫它。一個已匯出又沒有權限檢查的元件是 Android 上經典的攻擊面,而你在這裡、在清單裡就能看到它,什麼都不用安裝。
故事的另一半是簽章。只有當新舊兩個版本用同一把金鑰簽署時,Android 才允許把更新安裝到現有應用之上,所以簽章憑證的指紋就是這個應用身分的連續性:套件名稱相同但換了金鑰簽署的,是另一個披著熟悉標籤的應用。本頁面讀取兩代簽章——META-INF 裡 Jar 風格的憑證,以及 APK 簽章方案 v2/v3 區塊——並顯示每個簽署者的主體、頒發者、有效期窗格和 SHA-256 指紋,你可以拿它去和你手裡的金鑰或 CSR 在憑證與金鑰比對器裡比對。配套指南安裝之前,APK 裡有什麼把整個檢查展開成一份清單。兩條誠實的限制:本頁面讀的是宣告,不是行為——它不反編譯程式碼、不執行應用,也不判斷它是不是惡意軟體;當清單本身含糊時(帶 intent-filter 的元件省略了 exported 旗標、標籤在編譯後的資源裡解不出來),它會明說,而不是用一個猜測填上空缺。至於應用執行之後在網路上做什麼,PCAP 分析器負責讀抓包。
常見問題
我的 APK 檔案會去哪裡?
哪裡也不去。檔案在本頁面、你的裝置上開啟和解析,不上傳、不傳輸、不儲存——分析檔案時不發出任何網路請求。這一點對這個工具格外重要:人們最想檢查的 APK,恰恰是他們已經不信任的那些——來自論壇的檔案、直接下載的安裝包、看起來不對勁的應用商店條目——而把一個可疑的二進位檔案送到遠端掃描服務,本身就是一種暴露。頁面載入後它也能離線工作。
安裝 APK 之前應該檢查什麼?
四樣東西,上方都能看到。套件名稱:它是發布者真正的命名空間,還是只改了一個字元的仿冒品?權限:一個手電筒應用真的需要你的通訊錄、通話記錄和精確位置嗎——有沒有簽章級或特殊級的請求混在常規請求裡?已匯出的元件:每一個能被其他應用觸及的活動、服務、接收器或提供者,都是你正在接受的攻擊面。還有簽署者:更新必須攜帶與已安裝應用相同的簽章憑證,所以在從任何地方側載一個「新版本」之前,先把 SHA-256 指紋和你信任的那份比對一遍。
它能告訴我一個應用是不是惡意軟體嗎?
不能,任何只靠一份清單就許諾這一點的工具都是在誇大。本頁面讀的是安裝包的宣告——身分、權限、元件、旗標和簽章——這足以抓住粗心者和冒充者:簽章不對的複製體、要求簡訊權限的手電筒、還開著可除錯的正式建構。判斷程式碼實際上做什麼,需要反編譯、動態分析,或者信譽良好的掃描器對二進位本身的結論。這裡結果乾淨,應理解為「宣告裡沒看出問題」,永遠不是一張安全憑證。
為什麼有些權限寫著「不在參考表中」?
因為誠實勝過一個貌似合理的猜測。這裡顯示的保護等級——普通、危險、簽章、特殊——來自一份人工整理的知名 android.* 權限表,記錄框架為每一項指定的等級。廠商會加自己的權限,製造商還會再加,新的 Android 版本也會引入新名字;這些都不在表中,所以頁面會明確說明。等級未知不代表這項權限無害或危險——它表示這份參考沒有涵蓋它,而權限自己的名字和命名空間就是你開始核查的地方。
「匯出狀態:未指定」是什麼意思?
它的意思是清單裡確實沒寫。當一個元件宣告了 intent-filter 卻省略 android:exported 時,實際答案歷來取決於應用的目標 SDK 和 Android 版本——舊規則預設這類元件是匯出的,新規則則拒絕安裝這個應用,直到開發者明確作出決定。一個印出自信的「是」或「否」的讀取器,會憑空捏造一個檔案裡不存在的事實,所以本頁面報告的是這個省略本身。如果你自己的建構裡出現這一列,它是最值得明確修正的一項。