1. 程式人生 > >外掛化之外掛Service 新的Hook方法

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

給大家分享一個新的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 討論技術~~

相關推薦

外掛外掛Service Hook方法

給大家分享一個新的Hook外掛Service的方法,與Activity替換類似,可以先在AndroidManifest.xml預留一個service,然後通過intent啟動,並且將真正的Service的classname傳遞過去。可是Service沒有涉及

android service外掛

3. Service的外掛化 現在已經明白了Service元件的工作原理,可對如何實現Service的外掛化依然是一頭霧水。 從上文的原始碼分析來看,Service元件與Activity有著非常多的相似之處:它們都是通過Context類完成啟動, 接著通過 Activit

Android 外掛Hook機制

Android Hook簡介 什麼是Hook Hook 英文翻譯過來就是「鉤子」的意思,就是在程式執行的過程中去擷取其中的資訊。Android 作業系統中系統維護著自己的一套事件分發機制,那麼Hook就是在事件傳送到終點前截獲並監控事件的傳輸。其原理示意圖如

外掛VirtualApk實戰一:專案配置

零、 介紹一下 VirtualApk是滴滴開源的一套外掛化方案,其支援四大元件,支援外掛宿主之間的互動,相容性強,在滴滴出行APP中有應用。下面是官方文件中與其他主流外掛化框架的對比(檢視原文): 特性 DynamicLoadApk DynamicAPK S

Android 外掛原理解析——Service外掛

在 Activity生命週期管理 以及 廣播的管理 中我們詳細探討了Android系統中的Activity、BroadcastReceiver元件的工作原理以及它們的外掛化方案,相信讀者已經對Android Framework和外掛化技術有了一定的瞭解;本文將探討

Android外掛技術旅 1 開篇 - 實現啟動外掛與呼叫外掛中的Activity和Service

前言 Android技術如今已很成熟了,元件化、外掛化、熱修復等等框架層出不窮,如果只停留在單純的會用框架上,技術永遠得不到成長,只有懂得其原理,能夠婉婉道來,能夠自己手動寫出,技術才會得到成長,與其焦慮未來,不如把握現在。本篇將手寫教大家寫出外掛化框架,外掛化技術是Android高階工程師必備的技術之一,

Android外掛原理解析——Hook機制Binder Hook

Android系統通過Binder機制給應用程式提供了一系列的系統服務,諸如ActivityManagerService,ClipboardManager, AudioManager等;這些廣泛存在系統服務給應用程式提供了諸如任務管理,音訊,視訊等異常強大的功能。 外掛

Android外掛架構Hook繞過manifest檢測

學習自https://www.jianshu.com/p/e359fafe5c29問題我們外掛apk是不會進行一個安裝的,那麼他的manifest就不會生效,所以我們直接啟動肯定是行不通的。所以我們只能隔絕掉我們主apk的manifest的檢測。具體思路如下只需要動態代理ho

外掛開發---Hook動態代理方式

今天自己來了解下Hook原理,以及在安卓開發中佔有的意義,我們先來理解下什麼是hook呢? hook就是對安卓原始碼、其他apk原始碼,在相應位置找hook點,然後通過反射等操作,來執行自己程式碼,進而達到需要的功能 以下2個截圖就是之前我公司進行的微信

Android外掛原理解析——Hook機制動態代理

使用代理機制進行API Hook進而達到方法增強是框架的常用手段,比如J2EE框架Spring通過動態代理優雅地實現了AOP程式設計,極大地提升了Web開發效率;同樣,外掛框架也廣泛使用了代理機制來增強系統API從而達到外掛化的目的。本文將帶你瞭解基於動態代理的Hook機制。 閱讀本文之前,可以先clo

Android熱修復與外掛實踐

第1章 class檔案與dex檔案解析本章通過從java最基本的class檔案與android最基本的dex檔案進行對比,並不藉助IDE去生成及執行class與dex檔案,通過講解class與dex的手動生成,執行, 格式對比,讓學生明白二者的相同與不同。1-1 課程專案整體介紹1-2 本章概述1-3 cla

Android外掛原理和實踐 (四) 合併外掛中的資源

我們繼續來學習Android外掛化相關知識,還是要圍繞著三個根本問題來展開。在前面兩章中已經講解過第一個根本問題:在宿主中如何去載入外掛以及呼叫外掛中類和元件程式碼。Demo中使用了Service來演示,因為還沒有解決載入外掛中資源的問題,用Activity不好展示。所以本文將要從資源的載入機制

Service外掛解決方案

--摘自《android外掛化開發指南》 1.ActivityThread最終是通過Instrumentation啟動一個Activity的。而ActivityThread啟動Service並不藉助於Instrumentation,而是直接把Service反射出來就啟動了。Instrumentation只給

Android外掛原理和實踐 (七) 專案實踐

我們在前面一系列文章中已經介紹完了外掛化原理以及三個根本問題的解決方案,本文主要就是作為前面幾篇文章的一個總結,通過專案實踐將前面的知識點串起來使完成一個入門級簡單的外掛化工程以及在實際外掛化開發中遇到的一些總結。 實踐 我們先通過Android Studio建立一個工程,工程中包括了兩

Android外掛架構設計載入資原始檔

開篇介紹 現在專案比較大 資源比較多,但是若希望動態來載入資原始檔,可以有以下幾種方式: 1. 通過下載資原始檔zip包然後解壓來載入 2. 通過外掛開發 本文通過外掛開發來實現載入外掛中的資原始檔. 程式演示 也可以開啟連結 效果演示 開

Android外掛開發AMS與應用程式(客戶端ActivityThread、Instrumentation、Activity)通訊模型分析

今天主要分析下ActivityManagerService(服務端) 與應用程式(客戶端)之間的通訊模型,在介紹這個通訊模型的基礎上,再    簡單介紹實現這個模型所需要資料型別。         本文所介紹內容基於android2.2版本。由於Android版本的不同

Android外掛原理和實踐 (八) 注意事項

注意事項 關於外掛化的三個根本問題和解決方案就已經全部介紹完畢了,前一篇文章也通過一個入門級的工程來完整地演示了。但是其實目前熱門的外掛化框架也遠不止這些內容,我們在實際開發中也遠不止這麼簡單。前面介紹的所有知識點只是一個入門而已,外掛化雖然帶來了很多便利,但是在開發過程中也增添了不少麻煩和

Android外掛原理和實踐 (六) 四大元件解決方案

在前面的幾篇文章中已經介紹完了Android外掛化的第一和第二個根本問題,就是宿主和外掛的程式碼互相呼叫問題和外掛中資源的讀取問題。現剩下的就是Android外掛化裡最麻煩的第三個根本問題,也就是在外掛中使用四大元件的問題。我們知道,目前外掛中的四大元件要想正常使用就必須要在宿主中的Androi

Android外掛原理和實踐 (五) 解決合併資源後資源Id衝突的問題

Android外掛化中,要解決資源的問題,有些外掛化框架會選擇不合並資源,這樣就得維護多套mResources變數,這樣的話難免開發上沒有那麼的靈活和方便。所以一般地都是選擇合併資源,也就是我們上一遍文章《Android外掛化原理和實踐 (四) 之 合併外掛中的資源》介紹的辦法。但是合併後資源i

Android外掛原理和實踐 (三) 載入外掛中的元件程式碼

我們在上一篇文章《Android外掛化原理和實踐 (二) 之 載入外掛中的類程式碼》中埋下了一個懸念,那就是通過構造一個DexClassLoader物件後使用反射只能反射出普通的類,而不能正常使用四大元件,因為會報出異常。今天我們就來解開這個懸念和提出解決方法。 1 揭開懸念 還記得《A