當前位置:編程學習大全網 - 編程語言 - Android Binder Hook的實現

Android Binder Hook的實現

Binder Hook可以掛鉤當前App使用的系統服務服務。

以LocationManager為例,獲取LocationManager有兩個步驟。首先,獲取IBinder對象;第二:通過asInterface()將IBinder對象轉化為LocationMangerService對象。最後,初始化LocationManager,應用層使用LocationManager。

Hook的壹般原理是:當ServiceManager獲取壹個Binder時,如果本地有緩存的Binder,就不再跨進程請求Binder。我們可以將自己的Binder添加到緩存中,這樣ServiceManager在查詢本地緩存時就可以獲得壹個CustomBinder對象,不再跨進程詢問系統。和ilocationmanager。stub.asinterface (custombinder)方法返回我們的自定義服務對象。

有兩個地方需要使用自定義對象。因為我們只有Hook的部分功能,其他功能需要保留,所以我們通過動態代理的方式創建了壹個自定義綁定器和壹個自定義服務。

妳需要了解這些知識點,才能理解下面的內容:

Activity和其他類通過調用getSystemService(serviceName)方法獲取系統服務。

Context的getSystemService()方法調用SystemServiceRegistry的getSystemService()方法。

SystemServiceRegistry中有壹個常量SYSTEM_SERVICE_FETCHERS,這是壹個映射。已保存的ServiceName和相應的ServiceFetcher。ServicFetcher是壹個用於創建具體服務的類。ServiceFetcher的關鍵方法是createService()方法。

在ServiceFetcher的createService()方法中,調用ServiceManager.getService(name)方法。以LocationManager對應的ServiceFetcher為例。其createService()方法的源代碼如下:

假設我們要修改LocationManager的getLastKnownLocation()方法(下面都有)。我們要做的就是讓servicemanager。getservice ("location ")返回我們的自定義活頁夾。先看壹下這個方法的簡化源代碼:

SCache是壹個映射,用於緩存系統請求的綁定。如果我們需要這個方法來返回我們自己的binder,我們只需要預先將壹個自定義的Binder放入sCache中。

在put之前,您需要創建壹個自定義綁定器。由ilocationmanager處理後。存根。作為接口,這個綁定器可以返回壹個定制的LocationManagerService。

我們來看看Binder的asInterface()的實現:

如果將queryLocalInterface()方法返回給用戶定義的服務,以便可以進入If語句而不是else,那麽Hook就是成功的。

假設我們希望系統的LocationManager返回天安門廣場的所有位置信息(116.23,39.54)。然後我們需要讓LocatitionManagerService的getLastLocation()方法返回all (116.23,39.54)。

由於不能直接獲取系統的服務對象,所以可以先通過反射獲取系統的LocationManagerService。然後攔截getLastLocation()方法。

當調用queryLocalInterface()方法時,本機Binder對象返回本機服務對象。我們想回到3.1中的自定義服務。所以這裏我們截取了queryLocalInterface()方法。

妳有了自定義綁定器後,註入ServiceManger的sCache變量就完成了鉤子~

調用onClick時,Toast和Log都會顯示天安門廣場的坐標(116.23,39.54)。證明Hook成功!

甚至可以用Binder Hook的方式掛接ActivityManager。

  • 上一篇:機械制造及自動化就業前景怎麽樣?
  • 下一篇:基於52單片機ISD1760語音芯片的原理圖和程序代碼。
  • copyright 2024編程學習大全網