2011-08-10 27 views
5
  1. Nếu ai đó cài đặt ứng dụng android (tập tin apk), có kiểm tra nào được thực hiện tại thời điểm khởi chạy để đảm bảo tính toàn vẹn của ứng dụng không bị xâm phạm không? Theo tôi hiểu không có kiểm tra nào được thực hiện tại thời điểm khởi chạy và tôi đang cố thực hiện các thao tác sau:
  2. Tôi đang cố gắng tính toán các thông báo SHA-1 của các ứng dụng đã cài đặt (tệp APK). Tôi biết rằng tệp APK giống như tệp zip. Nó bao gồm các tập tin khác. Tuy nhiên, tôi đang xử lý nó như bất kỳ tệp nào khác (chỉ là một luồng byte) và cố gắng tính toán các thông báo SHA-1 của tất cả các tệp APK. Có bất kỳ vấn đề với cách tiếp cận này? Các mã sau đây tiếp tục đưa ra ngoại lệ null:

byte tĩnh tin [] getSHA1FromFileContent (String filename) {Android - Ứng dụng đã cài đặt - kiểm tra tính toàn vẹn

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; 
} 

}

Là một thay thế khi tôi đã cố gắng để lấy lại file từ các tập tin apk và lưu các tập tin cá nhân như sau, tôi một lần nữa giữ trên ngoại lệ 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. Tôi cũng đang xác minh cấu hình ứng dụng bằng cách - PreferencesManager.getDefaultSharedPreferences gọi cung cấp tên gói của ứng dụng làm tham số đầu vào
  2. Để xác minh tính toàn vẹn của ứng dụng đã cài đặt, việc kiểm tra ở trên có đủ không?

Trả lời

1

Nếu ai đó tampers với một ứng dụng Android được cài đặt (file APK), được có bất kỳ kiểm tra được thực hiện tại thời điểm tung ra để đảm bảo tính toàn vẹn của một ứng dụng không bị tổn hại?

Không có khái niệm nào như "bị xâm phạm" từ quan điểm của hệ điều hành, ngoài việc có chữ ký số không hợp lệ. Nếu ai đó tampers với ứng dụng của bạn và ký tên nó, đó là không thể phân biệt với hệ điều hành từ ứng dụng ban đầu của bạn, hoặc các ứng dụng sau khi Amazon "tampers" với nó cho cửa hàng của họ, v.v.

Có bất kỳ vấn đề với cách tiếp cận này ? Mã sau đây tiếp tục cho không ngoại lệ

Đầu tiên, bạn xử lý ngoại lệ và không ghi nhật ký. Bạn sẽ thấy rằng việc gỡ lỗi đơn giản hơn nhiều khi bạn đăng nhập ngoại lệ của mình. Sau đó, bạn có thể sử dụng dấu vết ngăn xếp (ví dụ: từ DDMS) để tìm dòng mà bạn đang gặp sự cố và sửa lỗi của bạn, bất kể lỗi đó là gì. Nếu bạn muốn trợ giúp về điều đó, bạn sẽ cần phải bao gồm chi tiết câu hỏi của bạn về nơi xảy ra NullPointerException.

Thứ hai, bất kỳ ai sử dụng ứng dụng của bạn sẽ chỉ xóa tất cả mã này nếu họ có thể tìm thấy.

Thứ ba, nó có thể khá chậm, giúp họ dễ dàng tìm thấy nó hơn.

Tôi cũng đang xác minh cấu hình ứng dụng bằng cách - PreferencesManager.getDefaultSharedPreferences gọi cung cấp tên gói của ứng dụng làm thông số đầu vào

Tôi không biết tại sao bạn nghĩ rằng đây sẽ là một dạng xác minh nào đó.

Để xác minh tính toàn vẹn của ứng dụng đã cài đặt, việc kiểm tra ở trên có đủ không?

IMHO, việc kiểm tra ở trên phần lớn là vô ích. Nếu bạn làm xáo trộn mã của mình (ví dụ: với ProGuard), hãy gọi mã từ một số địa điểm và sử dụng các kỹ thuật khác được nêu trong this blog post, có thể nó sẽ đáng giá nhưng có thể quá chậm.

+1

Một thiết bị cài đặt ứng dụng "thực" có thể phát hiện nỗ lực nâng cấp "imposter" bằng cách thay đổi chữ ký và phản hồi bằng cách xóa các tệp dữ liệu riêng tư ban đầu để ngăn chúng rơi vào bàn tay của kẻ mạo danh. –

+0

Bạn có liên kết đến việc triển khai thuật toán của mình không? Tôi đã nhìn thấy nó thảo luận vào dịp nhưng chưa bao giờ thấy một thực hiện. Hãy nhớ rằng nó sẽ không hoạt động cho Amazon AppStore hoặc bất kỳ thị trường nào khác ký lại APK. – CommonsWare

+0

nếu điều đó đã được gửi đến cho tôi, thay đổi xóa trên chữ ký là một tính năng của chính nền tảng Android, hiển thị trong nhật ký. IIRC amazon cung cấp tùy chọn của nhà phát triển ký gói ứng dụng đã hoàn tất, mặc dù đây không phải là lựa chọn duy nhất của họ. –

Các vấn đề liên quan