APK簽名替換檢測

来源:https://www.cnblogs.com/mysticbinary/archive/2019/12/27/12107666.html
-Advertisement-
Play Games

APK二次打包的危害 APK二次打包是Android應用安全風險中的一部分, 一般是通過反編譯工具嚮應用中插入廣告代碼與相關配置,再在第三方應用市場、論壇發佈。打包黨對移動App帶來的危害有以下幾種: 1. 插入自己廣告或者刪除原來廣告; 2. 惡意代碼, 惡意扣費、木馬等; 3. 修改原來支付邏輯 ...


APK二次打包的危害

APK二次打包是Android應用安全風險中的一部分, 一般是通過反編譯工具嚮應用中插入廣告代碼與相關配置,再在第三方應用市場、論壇發佈。打包黨對移動App帶來的危害有以下幾種:

  1. 插入自己廣告或者刪除原來廣告;
  2. 惡意代碼, 惡意扣費、木馬等;
  3. 修改原來支付邏輯;

上述惡意行為嚴重危害移動產品和用戶利益,同時也影響企業口碑。


APK的簽名機制

Google設計APK的簽名機制就是防止兩個問題:

  • 不讓別人修改APK包,防止反編譯後二次打包;
    怎麼做到不讓別人二次打包呢?Android系統在安裝APK時,會先去確認是否有簽名、簽名是否能對上;
  • Android系統在安裝APK包時,不允許安裝同一個包名但是簽名不一樣的APK;

下麵開始分析APK打簽名的流程:

需要瞭解的背景知識

自行去百度,瞭解概念即可;

  • 數據摘要(數據指紋)、MD5\SHA-1對稱加密演算法
  • 非對稱加密演算法
  • 數字簽名、數字證書
  • 手動簽名APK包

1.查看META-INF文件

將.apk包修改尾碼成.zip,解壓之後打開該文件夾,找到META-INF目錄。

簽名就是圍繞這三個文件開始的。

2.先看第一個文件MANIFEST.MF

這個文件裡面包括了APK文件中所有文件的數據摘要值。相當於對每個單獨(除了這三個)的文件都做了數據指紋。

3.在看第二個文件CERT.SF

和MANIFEST.MF文件差不多,唯一的差別在於,多了一行SHA1-Digest-Manifest: KDerPmANkkB5mxceo/t5oXRGApg=,這行就是MANIFEST.MF的數據摘要。

4.最後看第三個文件CERT.SF

把之前的CERT.SF文件用私鑰計算出一個加密值,這個加密值稱為簽名,所以這個文件包含了簽名和公鑰;

如果是在Windows系統下,推薦使用cmder.exe軟體使用如下命令。

D:\ProgramFiles\cmder>openssl pkcs7 -inform DER -in "C:\app-debug - 副本\META-INF\CERT.RSA" -noout -print_certs -text
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=Android Debug, O=Android, C=US
        Validity
            Not Before: Dec 27 09:26:22 2018 GMT
            Not After : Dec 19 09:26:22 2048 GMT
        Subject: CN=Android Debug, O=Android, C=US
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:89:e0:b4:29:a9:62:b1:44:48:b8:35:f2:8a:06:
                    91:c7:36:44:1a:d2:b3:97:fd:58:b5:84:35:fc:83:
                    09:50:f5:85:83:d9:bc:12:a8:da:da:cf:f0:10:d0:
                    4d:9f:a5:9d:7f:de:b6:4e:1e:94:36:c4:f4:44:45:
                    4e:44:f5:97:9f:f3:62:3f:5f:9d:ce:a6:18:73:22:
                    62:28:79:f7:46:f8:d6:f7:ca:46:e3:3f:dd:a8:ac:
                    b7:aa:cb:77:7c:47:16:89:d1:d5:f8:47:e5:21:28:
                    87:f8:a6:dd:ee:ed:01:da:b5:06:49:04:19:49:46:
                    d8:0a:a6:bb:b4:b5:c9:56:79
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
         79:3c:29:c5:3c:e7:d8:28:e1:5c:2a:1d:ce:31:cb:e6:a5:09:
         d0:10:d8:e5:74:e9:b5:80:4a:63:76:f4:67:ee:8c:f1:eb:04:
         8f:23:f4:f6:c2:f7:a5:99:af:c5:be:8f:70:6d:dc:3e:b3:db:
         ca:b2:64:e1:0c:ca:ce:fe:16:1f:3b:00:83:b5:f8:be:8a:b4:
         7e:a9:94:fe:77:1f:67:ff:4f:54:87:66:f4:97:be:ce:38:54:
         51:b4:ce:a8:23:60:92:e3:bf:5d:21:11:50:c9:c2:40:b4:69:
         89:fe:4f:66:84:17:42:91:af:af:bd:e9:47:24:f8:db:74:70:
         d0:87

證書內容概況:

用來管理私鑰倉庫的命令:

D:\ProgramFiles\cmder>keytool -printcert -file "C:\app-debug - 副本\META-INF\CERT.RSA"
所有者: C=US, O=Android, CN=Android Debug
發佈者: C=US, O=Android, CN=Android Debug
序列號: 1
有效期為 Thu Dec 27 17:26:22 CST 2018 至 Sat Dec 19 17:26:22 CST 2048
證書指紋:
         MD5:  41:41:89:25:4C:9B:91:6D:16:91:20:6C:1D:D7:61:2F
         SHA1: 73:FC:5A:9F:5D:7A:CC:93:14:8D:F1:13:37:E6:11:C2:86:A4:3D:34
         SHA256: 32:33:24:4F:1C:4E:6E:78:3F:F2:C4:59:CD:19:9F:43:BC:AC:1A:23:CB:78:72:9A:0E:61:C9:B3:5D:4C:B9:C1
簽名演算法名稱: SHA1withRSA
主體公共密鑰演算法: 1024 位 RSA 密鑰
版本: 1

總結

APK生成後簽名不能更改,因為沒有私鑰。但能替換簽名,因為Android系統在安裝APK的時候只校驗簽名的正確性。

一個apk文件,通過使用AndroidKiller二次編譯,我對比了原APK和編譯後的APK的./META-INF/CERT.RSA文件,發現確實是被替換了。

簽名的過程可以想象成發件人和收件人的處理流程,也是一個雙向的動作,可以大致理解成下圖流程:

可以把上圖的客戶1替換成打包APK的過程,把伺服器替換成Android手機安裝APK的過程,當系統拿著CERT.RSA裡面的公鑰和apk原文解密出的Hash值和CERT.SF文件裡面的Hash值不一致時,就不會去安裝。


檢測是否能替換簽名

二次打包成功的前提是能替換簽名,並且APK沒做簽名校驗。而簽名驗證的方式有三種:

  • APK包沒有做簽名校驗
    直接替換簽名即可,下麵將介紹替換簽名的步驟;

  • APK包做了簽名校驗
    • java代碼校驗
      難點在於找到校驗的JAVA代碼,註釋掉即可;
    • .so文件校驗
      難點在於找到校驗的C代碼,註釋掉即可;
    • 加殼
      難點在於得先脫殼;

替換簽名步驟

工具:
AndroidKiller_v1.3.1 (下載地址:https://www.52pojie.cn/thread-319641-1-1.html

步驟:
使用AndroidKiller_v1.3.1工具,裡面有個編譯功能,就能做到二次打包,原理就是替換簽名值。

我一般修改版本號來證明能二次打包:
反編譯後在AndroidManifest.xml 里直接修改版本號,如果在AndroidManifest.xml文件中無法看到 versionCode和versionName欄位,則在apktool.yml文件中打開找到,對應修改versionName欄位的數字大小即可。


修複方式

  1. SO層校驗簽名
  2. 網路校驗簽名
  3. APK加固

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以ms sql server 14 v17為例。 如下表dbo.Q中有一個欄位'' 首先在資料庫的系統存儲過程列表中: 找到sys.sp_addextendedproperty,使用這個為欄位添加一個說明。 EXECUTE [sys].[sp_addextendedproperty] @name=N ...
  • --閃回 回退已刪除的數據 select * from NCMS_SPECIALIST_CHRONIC as of timestamp to_timestamp('2019-12-16 9:04:00', 'yyyy-mm-dd hh24:mi:ss'); --開啟這張表的狀態 alter tabl ...
  • 話不多說先上圖,這是啟動類的配置,這裡配置了@ComponentScan("我的mapper的介面") 接下來是我的項目結構截圖 然後是service 的截圖,我在這裡加了註解@Service 最後我在測試類裡面 的截圖 最後附上我的maven的pom 我開始懷疑是這個配置的有問題了 <?xml v ...
  • Vmvare設置好虛擬機的磁碟大小之後,發現磁碟空間不夠了,這個時候怎麼擴展磁碟的大小呢? 首先,在確保虛擬機關閉的情況下,右鍵設置,選擇硬碟,擴展,這樣就可以增加磁碟的大小。 但是由於未進行分區和磁碟掛載的設置,我們啟動虛擬機以後並不能使用增加的磁碟空間,這個時候怎麼辦呢?有兩種辦法 先用root ...
  • create procedure #pr_CreateFileGroup @dbname nvarchar(max), @filegroupname nvarchar(max) as begin /* 腳本來源:https://www.cnblogs.com/zhang502219048/p/121 ...
  • 電腦學習者經常會用到諸如Sqlserver Mysql Orcal 等“關係型”資料庫。 問題一:那麼,到底什麼是“關係”呢? 首先,我們來看以下三組數據 註:A1,A2表示具體的某個人,比如張三,李四 我們用數學集合的形式對其進行表達,得到三個集合 男人: D1 { A1,A2,A3 } 女人: ...
  • 關聯查詢 1、內連接:實現A∩B select 欄位列表 from A表 inner join B表 on 關聯條件 where 等其他子句; 2、左外連接 #實現查詢結果是A select 欄位列表 from A表 left join B表 on 關聯條件 where 等其他子句; #實現A - ...
  • 本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、數據場景 1、表結構簡介 任何工具類的東西都是為瞭解決某個場景下的問題,比如Redis緩存系統熱點數據,ClickHouse解決海量數據的實時分析,MySQL關係型資料庫存儲結構化數據。數據的存儲則需要設計對應的表結構,清楚的表 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...