外掛程式化之外掛程式Service 新的Hook方法

2021-07-27 14:34:41 字數 1250 閱讀 4641

本文同步自wing的地方酒館

給大家分享乙個新的hook外掛程式service的方法,與activity替換類似,可以先在androidmanifest.xml預留乙個service,然後通過intent啟動,並且將真正的service的classname傳遞過去。可是service沒有涉及到instrumentation更沒有instrumentation.newservice()方法,怎麼辦呢? 且聽我細細道來。

觀察service的建立流程,發現我們只需要想辦法拿到intent即可做一些手腳。大家都知道,建立service的時候,會走到h類裡:

他接收乙個createservicedata型別的引數,恰好這個引數裡面有intent引數:

那麼能不能從這裡下手呢,答案是否定的。因為data初始化的時候,並沒有將intent傳入,見下**:

所以我們換一種思路,bind的時候,有沒有intent呢?閱讀原始碼得到以下資訊:

哈哈,確實傳進來了。所以我們可以在bind的時候,拿到真正要啟動的classname,再bind的時候,把他給偷梁換柱! 具體怎麼做呢。h類是個handler,觀察handler內部有個callback,他可以在真正處理訊息之前去做一些手腳,所以我們搞個callback給他幹進去。

新建乙個callback ,在裡面把intent取出:

由於是基於bind的,所以要看一下之後做了什麼,觀察handlebindservice方法,可以發現bind的時候service是已經建立好了的,並且存在乙個名為mservice的arraymap裡。key為token ,ibinder:

所以要做的事情就很明了了,他不是從這裡取嗎,那我們就給他替換掉呀,所以把mservice取出來:

此時我擁有bind的msg裡面包含了intent、token等等資訊,所以只要把對應key的value替換掉即可。在intent裡拿到真正的service class name,用classloader載入,此時service已經建立完畢了,但是還沒有初始化。

觀察系統service初始化過程,發現還需要context.setouter attch等操作:

所以我們來手動模擬這個過程:

attach方法全部引數設定為原本service自帶的引數。這裡只是改變了例項。初始化完畢之後,發現還需要進行binder通訊

所以反射呼叫他,然後因為是在bind的時候做的手腳,所以service丟失了oncreate()這個生命週期,所以手動呼叫他:

這樣就完成了service的外掛程式操作~~

歡迎加入我的android酒館:425983695 討論技術~~

typecho外掛程式編寫教程2 新外掛程式

此文原本發表於我的部落格 老高的技術部落格 歡迎和老高交流!第一節我們了解了乙個外掛程式的基本構成,下面我們需要乙個例項練習鞏固。為什麼要改版呢?新版外掛程式需要實現哪些功能?介面呼叫位址 api 在哪兒?php urls array api 你的准入金鑰 讓老高先把上一節hello world外掛...

外掛程式化小結

2 在編譯的時候會將子外掛程式偽裝為so,並且合併manifest。3 子外掛程式可以直接編譯為apk,他只需要負責實現自己的功能即可,盡量避免多個直外掛程式之間互相干擾。4 如果在apk發布後需要動態載入新的頁面也業務。manifest是沒有辦法改變的,如何找到這個activity呢?a 可以使用...

外掛程式化 BroadcastReceiver載入

android 廣播分為靜態廣播和動態廣播 2 動態廣播通過 的方式進行註冊,呼叫context的registerreceiver方法,最終會activitymanagernative.getdefault registerreceiver,所以 動態廣播的註冊資訊存在於ams中。傳送廣播和接受廣播...