簡體   English   中英

如果手機上安裝了數據包捕獲或任何嗅探器,則阻止 android 應用程序運行

[英]Prevent the android app from running if packet capture or any sniffer is installed on the phone

我想讓我的 Android 應用程序安全。 在某些應用程序中,如果手機安裝了網絡嗅探器程序(數據包捕獲、ssl 捕獲等),應用程序會發出警報(刪除數據包捕獲)並關閉。 如何添加類似的安全措施? 我應該尋找哪些技術?

該應用程序首先要我卸載數據包嗅探器程序

在安裝網絡嗅探器時禁用它不會使您的應用程序更安全。 作為一個用戶,我會對這種無效的所謂安全措施感到非常惱火。

為了保護您的應用程序,您應該考慮攻擊者會做什么。 假設您擔心網絡流量分析,請注意存在主動攻擊和被動攻擊。

被動攻擊

包括網絡嗅探、網絡監聽等,攻擊者可以使用Android手機本身的VPNService ,無需root即可監聽所有流量。 當然,您可以嘗試根據已安裝的應用程序檢測並阻止它,但攻擊者將繼續前進並設置外部捕獲。 他們可以在筆記本電腦上設置一個接入點並將手機連接到它,然后從筆記本電腦運行網絡捕獲。

要正確保護您免受此類攻擊者的侵害,請確保您的通信已加密(使用 HTTPS/TLS)。 那么不管某人是否能夠在電話或本地網絡上記錄網絡流量,他們將只能看到目標 IP 地址和主機名,而不能看到實際的請求詳細信息(URL、cookie 等)

主動攻擊

包括中間人 (MitM)、SSL/TLS 代理等。控制網絡的攻擊者可以攔截連接並嘗試偽裝成服務器。 如果流量沒有使用 TLS 保護,這是微不足道的。 盡管即使您實施了 TLS,您仍然必須驗證服務器提供的證書。 TLS 代理無法顯示由受信任的 CA 簽名的有效證書,因此通常這沒問題。

然而,用戶可以將他們自己的 CA 添加到設備,這將允許他們再次讀取未加密的應用程序流量。 為了防止這種情況,您可以考慮證書固定。 這樣,您就可以在應用程序中對受信任的證書進行硬編碼,而用戶無法以通常的方式覆蓋它。

最后請注意,堅定的攻擊者還可以修補(修改)您的 apk,將其安裝在模擬器中,或嘗試對其進行反編譯。 他們還可以從中學習如何與服務器通信。 在開發服務器時請牢記這種情況。

延伸閱讀

https://developer.android.com/training/articles/security-ssl

我使用 ConnectivityManager 來檢測 VPN 服務是否啟用。 使用它我停止調用 api 調用。

檢測是否啟用 VPN:

fun isVPNEnabled(): Boolean {
    val connectivityManager = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        val network = connectivityManager.activeNetwork
        val capabilities = connectivityManager.getNetworkCapabilities(network)
        capabilities!= null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
    } else {
        connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)!!.isConnectedOrConnecting
    }
}

如果啟用了 VPN,則使用攔截器停止 api 調用:

class VPNInterceptor(val context: Context) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
    val codeSnippet = CodeSnippet(context)
    return if (codeSnippet.isVPNEnabled()) {
        Timber.d("====>VPN Status : true")
        val errorResponse = ErrorResponse("Please turn-off VPN service for security reason.", true)
        Response.Builder()
            .code(Constants.InternalHttpCode.VPN_CODE) // Whatever code
            .body(ResponseBody.create(null, "")) // Whatever body
            .protocol(Protocol.HTTP_2)
            .message(errorResponse.moshiObjToString(ErrorResponse::class.java))
            .request(chain.request())
            .build()
    } else {
        Timber.d("====>VPN Status : false")
        chain.proceed(chain.request())
    }
}

}

val httpClient: OkHttpClient.Builder = OkHttpClient.Builder()
    httpClient.connectTimeout(2, TimeUnit.MINUTES) //Connection time out set limit
    httpClient.readTimeout(2, TimeUnit.MINUTES)  //Connection read time out set limit
    httpClient.addInterceptor(VPNInterceptor(context))

暫無
暫無

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

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