2016-11-05 77 views
1

我想實施安全檢查 - 應用程序(或dex文件)的簽名驗證,以驗證未修改的應用程序是否使用我的共享本地庫(* .so)與NDK構建。我想直接在C++中執行所有簽名檢查,而不使用Java。目前我發現可以在這裏訪問apk文件:/data/app/--1/base.apk。從apk文件我猜可能得到原始的dex文件的內容可能甚至沒有提取作爲apk文件對齊。從android本地庫中獲取原始的dex文件

  1. 有誰知道如何閱讀dex文件,而無需從apk中提取?

我說原來的dex文件,因爲如果我理解正確(並糾正我,如果我錯了)當apk安裝時,dex文件被轉換爲ELF共享對象 - 特定於設備體系結構的二進制可執行文件。這就是爲什麼我無法檢查/驗證/ proc/self/maps中列出的* .dex文件的簽名的原因(例如:/data/dalvik-cache/x86/[email protected]@[email protected] .apk @ classes.dex),因爲在編譯時不可能知道簽名,因爲dex文件將被更改。

我知道檢查原始dex文件的方法不是非常安全,因爲我認爲它可以通過替換優化的dex文件輕鬆繞過rooted設備 - 只需在自定義dex文件上運行dex2oat並將其放入(/ data/dalvik -cache/...)。

  1. 有沒有其他更好的方法來檢查應用程序是否是使用普通C++的本地庫的原創? (不通過JNI調用Java)

回答

1
  1. 有沒有人知道如何閱讀dex文件,而無需從apk中提取?

副手,我想不出有辦法做到這一點。

  1. 有沒有其他更好的方法來檢查應用程序是否是使用普通C++的本地庫的原創? (不通過JNI調用Java)

我能想到的一些(和他們的帽子全都是瘋):

  1. 執行APK的散列和比較對散列上的外部網絡服務器。無法對哈希進行硬編碼,因爲這會改變哈希。這應該是最簡單的。對於獎勵積分,請將其保存在本地,以便將來的運行不需要網絡連接。
  2. 將jarsigner嵌入到您的應用中。把它放在你的資產文件夾中,並使用exec或任何C++使用的本機調用它。 Hosting an executable within Android application表示可以這樣做。 Oracle documentation of jarsigner表示自簽名罐子爲出版商輸出UNKNOWN。有人不太可能將應用上傳到Google Play,但理論上他們可以用真實證書對其進行簽名,因此不確定這是否真的安全。再次,你應該能夠檢查它是否與你的證書籤署。

對於像我這樣的愚蠢的人來說,使用基於Intel的設備可能會失敗。

  1. 火與硫磺。用zlib解壓縮,並用OpenSSL檢查證書。在嘗試這個之前,我會認真考慮職業變化,但是,我不是C/C++的粉絲。
+0

對於應用程序認證,我實際上最終使用了類似於你最後一點的東西。我在META-INF/CERT.RSA中找到的Native庫公共證書中進行了硬編碼,並使用zlib來提取APK,並將嵌入的值與實際APK中找到的值進行比較。實際上嵌入的值字符串是加密的。這裏不需要OpenSSL。攻擊者必須攻擊(例如調試)二進制本地庫繞過這個檢查,這是我想要的。 APK中的META-INF/CERT.RSA不能僞造 - Android可以確保這一點。 – jozols

相關問題