導航:首頁 > 操作系統 > androidhook插件

androidhook插件

發布時間:2025-01-09 16:40:11

❶ Android Binder Hook的實現

Binder Hook可以Hook掉 當前App 用到的系統Service服務。
以LocationManager為例,在獲取一個LocationManager時分為兩步。第一,獲取IBinder對象;第二:IBinder對象通過asInterface()轉化為LocationMangerService對象。最後初始化LocationManager,application層用到的都是LocationManager。
Hook的大致原理是:ServiceManager在獲取某個Binder時,如果本地有緩存的Binder,就不再跨進程請求Binder了。我們可以在緩存中加入自己的Binder,使得ServiceManager查詢本地緩存時得到一個自定義的CustomBinder對象,不再跨進程向系統請求。並且ILocationManager.Stub.asInterface(CustomBinder)方法返回我們自定義的Service對象。
這裡面有兩個地方需要用到自定義的對象。由於我們只Hook其中一部分的功能,其他功能還需要保留,所以用動態代理的方式創建自定義的Binder和自定義的Service。

在理解後面的內容前你需要了解這些知識點:

Activity等類在獲取系統Service時,都是調用getSystemService(serviceName)方法獲取的。

Context 的 getSystemService() 方法調用了 SystemServiceRegistry 的 getSystemService() 方法。
SystemServiceRegistry 中有一個常量 SYSTEM_SERVICE_FETCHERS,這是一個Map。保存了ServiceName和對應的ServiceFetcher。ServicFetcher是用於創建具體Service的類。ServiceFetcher 的關鍵方法是 createService() 方法。
在 ServiceFetcher 的 createService() 方法中,調用了 ServiceManager.getService(name) 方法。以 LocationManager 對應的 ServiceFetcher 為例,它的createService()方法源碼如下:

假如我們要修改 LocationManager 的 getLastKnownLocation() 方法(下文都是)。我們要做的就是讓ServiceManager.getService("location")返回我們自定義的Binder。先看一下這個方法簡化後的源碼:

sCache是一個Map,緩存了已經向系統請求過的Binder。如果我們需要讓這個方法返回我們我們自己的binder,只需要事先往sCache中put一個自定義的Binder就行了。
在put之前,需要先創建出一個自定義的Binder。這個Binder在被 ILocationManager.Stub.asInterface 處理後,可以返回一個自定義的 LocationManagerService。
先看一下Binder的 asInterface() 的實現:

如果把 queryLocalInterface()方法返回一個自定義的Service,使得走if語句內部,不走else,那就算是Hook成功了。

假設我們想讓系統的LocationManager返回的位置信息全是在天安門(116.23, 39.54)。那我們需要使得 LocatitionManagerService 的 getLastLocation() 方法 返回的全是 (116.23, 39.54)。
由於我們不能直接拿到系統的這個Service對象,可以先用反射的方式拿到系統的LocationManagerService。然後攔截getLastLocation()方法。

原生的Binder對象在調用 queryLocalInterface() 方法時會返回原生的Service對象。我們希望返回3.1中的自定義Service。所以這里攔截 queryLocalInterface() 方法。

有了自定義的Binder後,將它注入到ServiceManger的sCache變數中就完成Hook了~

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

你甚至可以用Binder Hook的方式Hook掉 ActivityManager

閱讀全文

與androidhook插件相關的資料

熱點內容
金剛1024控台編程教程 瀏覽:633
為什麼粉絲要加密 瀏覽:809
調試和編譯是什麼意思 瀏覽:612
cmd命令行通配符 瀏覽:511
什麼app買菜便宜 瀏覽:804
數控電火花線切割機床編程 瀏覽:355
程序員那麼可愛陸漓扮男裝被發現 瀏覽:165
解壓好的刷機包怎麼安裝 瀏覽:632
pdf怎樣轉換為jpg 瀏覽:114
javaphpnetnodejs 瀏覽:179
愛心命令 瀏覽:431
剪影app菱形圖標是什麼 瀏覽:862
75千瓦空氣壓縮機 瀏覽:540
s20u相冊怎麼加密 瀏覽:431
大專畢業4年可以選擇程序員嗎 瀏覽:856
bitlocker加密其他電腦能打開不 瀏覽:709
如何修改steam中dota伺服器 瀏覽:178
並聯單片機 瀏覽:47
linux搜狗五筆 瀏覽:69
qt高級編程pdf 瀏覽:260