簡體   English   中英

Android - 已安裝的應用程序 - 完整性檢查

[英]Android - Installed apps - integrity check

  1. 如果有人篡改已安裝的 android 應用程序(apk 文件),在啟動時是否進行了任何檢查以確保應用程序的完整性不受影響? 據我了解,在啟動時沒有執行任何檢查,我正在嘗試執行以下操作:
  2. 我正在嘗試計算已安裝應用程序(apk 文件)的 SHA-1 摘要。 我知道 apk 文件就像 zip 文件。 它由其他文件組成。 但是,我將其視為任何其他文件(只是 stream 字節)並嘗試計算所有 apk 文件的 SHA-1 摘要。 這種方法有什么問題嗎? 以下代碼繼續給出 null 異常:

私人 static 字節 [] getSHA1FromFileContent(字符串文件名){

try
{
    MessageDigest digest = MessageDigest.getInstance("SHA-1");
    //byte[] buffer = new byte[65536]; //created at start.
    final FileInputStream fis = new FileInputStream(filename);
    int n = 0;
    byte[] buffer = null;
    while (n != -1)
    {
        n = fis.read(buffer);
        if (n > 0)
        {
            digest.update(buffer, 0, n);
        }
    }
    byte[] digestResult = digest.digest();
    return digestResult;
}
catch (Exception e)
{
    return null;
}

}

作為替代方案,當我嘗試從 apk 文件中檢索文件並按如下方式保存單個文件時,我再次保持 null 異常

public void unzip() 
{ 
        try  
        { 
          FileInputStream fin = new FileInputStream(_zipFile); 
          ZipInputStream zin = new ZipInputStream(fin); 
          ZipEntry ze = null; 
          while ((ze = zin.getNextEntry()) != null) 
          { 
            Log.v("Decompress", "Unzipping " + ze.getName()); 

            if(ze.isDirectory()) { 
              _dirChecker(ze.getName()); 
            } else { 
                File dstfile = new File(_location + ze.getName()); 
                dstfile.createNewFile();
            FileOutputStream fout = new FileOutputStream(dstfile.getPath()); 
            //OutputStream out = openFileOutput(_location + ze.getName(), Context.MODE_PRIVATE);
            for (int c = zin.read(); c != -1; c = zin.read()) { 
                fout.write(c); 
              } 

              zin.closeEntry(); 
              fout.close(); 
            } 

          } 
          zin.close(); 
        } 
        catch(Exception e) 
        { 
          Log.e("Decompress", "unzip", e); 
        } 
}   
  1. 我還通過 - PreferencesManager.getDefaultSharedPreferences 調用提供應用程序的 package 名稱作為輸入參數來驗證應用程序配置
  2. 為了驗證已安裝應用程序的完整性,上述檢查是否足夠?

如果有人篡改已安裝的 android 應用程序(apk 文件),在啟動時是否進行了任何檢查以確保應用程序的完整性不受影響?

從操作系統的角度來看,除了具有無效的數字簽名之外,沒有“妥協”這樣的概念。 如果有人篡改您的應用程序並對其進行簽名,那么操作系統與您的原始應用程序或亞馬遜“篡改”其商店后的應用程序等無法區分。

這種方法有什么問題嗎? 以下代碼繼續給出 null 異常

首先,您正在處理異常並且不進行日志記錄。 當您記錄異常時,您會發現調試要簡單得多。 然后,您可以使用堆棧跟蹤(例如,來自 DDMS)來查找您正在崩潰的行,並修復您的錯誤,無論它是什么。 如果您需要這方面的幫助,您需要在問題中包含有關NullPointerException發生位置的詳細信息。

其次,任何篡改您的應用程序的人都會簡單地刪除所有這些代碼,如果他們能找到的話。

第三,它可能相當慢,使他們更容易找到它。

我還通過 - PreferencesManager.getDefaultSharedPreferences 調用提供應用程序的 package 名稱作為輸入參數來驗證應用程序配置

我不知道你為什么認為這將是某種形式的驗證。

為了驗證已安裝應用程序的完整性,上述檢查是否足夠?

恕我直言,上述檢查在很大程度上是無用的。 如果您混淆了您的代碼(例如,使用 ProGuard),從多個地方調用它,並使用本博文中概述的其他技術,也許值得,但它可能太慢了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM