我想實施安全檢查 - 應用程序(或dex文件)的簽名驗證,以驗證未修改的應用程序是否使用我的共享本地庫(* .so)與NDK構建。我想直接在C++中執行所有簽名檢查,而不使用Java。目前我發現可以在這裏訪問apk文件:/data/app/--1/base.apk。從apk文件我猜可能得到原始的dex文件的內容可能甚至沒有提取作爲apk文件對齊。從android本地庫中獲取原始的dex文件
- 有誰知道如何閱讀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/...)。
- 有沒有其他更好的方法來檢查應用程序是否是使用普通C++的本地庫的原創? (不通過JNI調用Java)
對於應用程序認證,我實際上最終使用了類似於你最後一點的東西。我在META-INF/CERT.RSA中找到的Native庫公共證書中進行了硬編碼,並使用zlib來提取APK,並將嵌入的值與實際APK中找到的值進行比較。實際上嵌入的值字符串是加密的。這裏不需要OpenSSL。攻擊者必須攻擊(例如調試)二進制本地庫繞過這個檢查,這是我想要的。 APK中的META-INF/CERT.RSA不能僞造 - Android可以確保這一點。 – jozols