Android 簽名校驗與繞過思路詳解
在 Android 應用的安全體系中,簽名機制是保障 APK 完整性與可信來源的關鍵手段。越來越多的應用(尤其是金融、電商類)會在運行時進行簽名校驗,以防止被篡改或二次打包。本篇文章將從簽名校驗的原理出發(fā),介紹常見的繞過方式,并分析開發(fā)者與逆向工程師之間的“攻防博弈”。
一、Android 簽名校驗原理
Android 系統(tǒng)要求每個 APK 在安裝前都必須經過簽名。簽名不僅保證了 APK 的完整性,還用于標識開發(fā)者的身份。在運行時,應用也可以自行校驗簽名以檢測是否被篡改。校驗流程通常涉及以下幾個核心環(huán)節(jié):
1. 獲取 PackageInfo
應用通過 PackageManager.getPackageInfo() 方法獲取自身的 PackageInfo 對象,其中包含 signatures(Android 9 及以下)或 signingInfo(Android 9+)字段,用于反映 APK 的簽名信息。這個過程內部依賴 PackageParser 解析 APK 文件中的 META-INF 目錄下的 .RSA/.DSA 文件。
2. CREATOR 反序列化機制
在 Binder 跨進程通信(如系統(tǒng)服務與應用交互)過程中,PackageInfo 對象會通過 Parcelable 接口進行序列化與反序列化。具體是通過 CREATOR.createFromParcel() 方法構造 PackageInfo,其中簽名字段也被反序列化出來。
3. 底層文件操作
讀取 APK 或簽名文件通常涉及文件 I/O 操作,如 open、read 等,這些調用最終都依賴于 libc 層的系統(tǒng)函數(shù)。
4. 應用層自定義校驗
部分應用在 Java 或 JNI 層主動讀取簽名信息并與預設值進行對比,達到校驗簽名的目的。這種方式靈活性高、也更易被混淆或加殼保護。
二、簽名校驗繞過的常見思路
在逆向分析或自動化測試場景中,繞過簽名校驗是必不可少的一步。以下是常見的繞過方法,按邏輯層次劃分:
1. 攔截 PackageInfo 簽名信息
- 目標:篡改
getPackageInfo()返回的簽名字段。 - 實現(xiàn)思路:利用 Xposed、Frida 等框架 hook
PackageManager.getPackageInfo()方法,返回自定義PackageInfo對象,并偽造簽名字段(如 MD5、SHA1)。 - 適用場景:Java 層簽名校驗邏輯。
2. 替換 CREATOR 構造器
- 目標:控制 Binder 通信中
PackageInfo的反序列化過程。 - 實現(xiàn)思路:替換
PackageInfo.CREATOR,在createFromParcel()中構造偽造簽名對象,從而影響系統(tǒng)服務下發(fā)的數(shù)據(jù)。 - 適用場景:跨進程通信校驗(如通過
ActivityManagerService獲取簽名)。
3. 重定向文件 I/O
- 目標:篡改簽名文件內容。
- 實現(xiàn)思路:Hook libc 層的
open()或read()函數(shù),在訪問META-INF/簽名文件時返回偽造內容。Frida、ptrace、或 preload SO 層劫持是常見方式。 - 適用場景:JNI 或底層校驗 APK 文件內容的邏輯。
4. 替換 Application 類
- 目標:繞過應用初始化流程中的簽名校驗邏輯。
- 實現(xiàn)思路:修改
AndroidManifest.xml中聲明的Application類或AppComponentFactory,注入自定義邏輯,避開原始簽名校驗。 - 適用場景:加固或殼中初始化簽名校驗邏輯。
5. 系統(tǒng)調用級別攔截(高級)
- 目標:偽造從內核返回的文件內容。
- 實現(xiàn)思路:通過 inline hook 或內核模塊攔截 SVC 指令,直接修改
sys_open、sys_read返回值,實現(xiàn)更底層的繞過。 - 適用場景:高版本 Android,繞過 SELinux 或反調試限制。
三、檢測與反檢測的攻防對抗
在簽名校驗繞過普及的同時,開發(fā)者也在不斷強化檢測機制。逆向工程師需要應對如下檢測手段并設計反制策略:
1. CREATOR 檢測
- 檢測方式:校驗
PackageInfo.CREATOR是否為系統(tǒng)原生類。 - 繞過策略:hook 檢測邏輯,返回偽造但合法的 CREATOR 實例;或在 JNI 層使用 native 方法偽裝。
2. Application 類校驗
- 檢測方式:校驗
Application實例是否為期望的類名,或是否被替換為無效對象。 - 繞過策略:在反射層或 LoadedApk 中修改
mApplication實例,使其符合預期。
3. 文件完整性檢測
- 檢測方式:讀取 APK 中 META-INF 文件、比對 CRC32 或簽名摘要。
- 繞過策略:在文件系統(tǒng)層攔截讀取操作,提供偽造文件內容,或 Patch 校驗邏輯代碼。
4. 內存校驗與 Dex 完整性驗證
- 檢測方式:比對 ClassLoader 加載的 Dex 內容與磁盤內容是否一致。
- 繞過策略:修改內存中的 Dex 數(shù)據(jù),或 Hook 校驗函數(shù)返回原始值。
5. AppComponentFactory 檢測
- 檢測方式:檢測
AppComponentFactory的初始化流程與實際調用棧。 - 繞過策略:構造偽造工廠類、重寫其創(chuàng)建組件邏輯,確保行為與原始一致。
四、總結
簽名校驗作為 Android 安全體系的第一道防線,其重要性不言而喻。但隨著逆向技術的發(fā)展,簽名校驗也逐漸演變?yōu)橐粓龉シ啦┺?。開發(fā)者需要構建多層次、多維度的校驗體系;而逆向工程師則需靈活運用 Java Hook、Native Hook、甚至系統(tǒng)層手段進行繞過。
無論你是開發(fā)者,還是逆向工程師,理解簽名校驗的原理與繞過方式,都是提升安全能力與分析技巧的必要一步。
到此這篇關于Android 簽名校驗與繞過思路詳解的文章就介紹到這了,更多相關Android 簽名校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android8.1 通過黑名單屏蔽系統(tǒng)短信和來電功能
最近小編接到一個新的需求,需要將8.1 設備的來電功能和短信功能都屏蔽掉,特殊產品就是特殊定制。接下來通過本文給大家介紹Android8.1 通過黑名單屏蔽系統(tǒng)短信和來電功能,需要的朋友參考下吧2019-05-05
Android之ListView分頁加載數(shù)據(jù)功能實現(xiàn)代碼
這篇文章主要為大家詳細介紹了Android之ListView分頁加載數(shù)據(jù)功能實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08
android onTouchEvent處理機制總結(必看)
下面小編就為大家?guī)硪黄猘ndroid onTouchEvent處理機制總結(必看)小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Android編程實現(xiàn)簡單的UDP Client實例
這篇文章主要介紹了Android編程實現(xiàn)簡單的UDP Client,結合實例形式分析了Android實現(xiàn)UDP Clinet客戶端的實現(xiàn)技巧,需要的朋友可以參考下2016-04-04
Android開發(fā)之瀏覽器用法實例詳解(調用uc,opera,qq瀏覽器訪問網頁)
這篇文章主要介紹了Android開發(fā)之瀏覽器用法,結合實例形式詳細分析了Android調用瀏覽器的具體步驟與相關使用技巧,需要的朋友可以參考下2016-01-01
Android編程開發(fā)之TextView控件用法(2種方法)
這篇文章主要介紹了Android編程開發(fā)之TextView控件用法,結合實例分析了Android針對TextView控件固定顯示與動態(tài)獲取顯示的兩種使用技巧,需要的朋友可以參考下2015-12-12
Android開發(fā)筆記之:返回鍵的復寫onBackPressed()介紹
本篇文章是對Android中返回鍵的復寫onBackPressed()進行了詳細的分析介紹,需要的朋友參考下2013-05-05

