基于xposed實現(xiàn)android注冊系統(tǒng)服務(wù)誉结,解決跨進程共享數(shù)據(jù)問題

昨花了點時間,參考github issues 總算實現(xiàn)了基于xposed的系統(tǒng)服務(wù)注入缘滥,本文目的是為了“解決應(yīng)用之間hook后數(shù)據(jù)共享轰胁,任意app ServiceManager.getService就可以直接調(diào)用aidl實現(xiàn)了進程通信”(比如aidl service實現(xiàn)socket,http server等,或者從某app獲取數(shù)據(jù)傳遞給另外個app等場景朝扼,能做什么大家自己想吧赃阀,當(dāng)然也可以實現(xiàn)非xposed版本的,需要通過直接smali方式擎颖。因為需快速實現(xiàn)榛斯,我就基于xposed的方案湊活用著用吧)

Xposed我就不介紹了,Xposed有2個重要接口搂捧,一個是針對應(yīng)用級別hook:IXposedHookLoadPackage驮俗,另一個就是針對系統(tǒng)級別的:IXposedHookZygoteInit

這里將使用IXposedHookZygoteInit實現(xiàn)aidl添加到系統(tǒng)服務(wù)中,當(dāng)然允跑,通過IXposedHookLoadPackage也是可以實現(xiàn)的王凑,但是因為我們注入的服務(wù)是希望像系統(tǒng)服務(wù)一樣,開機啟動吮蛹,關(guān)機停止,另外IXposedHookZygoteInit本身就是定位在針對系統(tǒng)hook拌屏,所以還是建議使用IXposedHookZygoteInit潮针。

直接進入正題:

1.創(chuàng)建 android.os.ICustomService.aidl

package android.os;

// Declare any non-default types here with import statements

interface ICustomService {

String sayHello();

}

2.創(chuàng)建CustomService實現(xiàn)類

1 public class CustomService extends ICustomService.Stub {

2? ? private Context mContext;

3? ? public CustomService(Context context) {

4? ? ? ? mContext = context;

5? ? }

6

7? ? @Override

8? ? public String sayHello() throws RemoteException {

9? ? ? ? return "Just Hello World";

10? ? }

11

12? ? //ActivityManagerService的systemReady在所有服務(wù)初始化完成后觸發(fā),這定義這個是為了實現(xiàn)自定義服務(wù)的初始化代碼實現(xiàn)

13? ? public void systemReady() {

14? ? ? ? // Make your initialization here

15? ? }

16 }

3.創(chuàng)建ApplicationSocket倚喂,實現(xiàn)IXposedHookZygoteInit接口每篷,這實現(xiàn)系統(tǒng)啟動時候觸發(fā)hook

1 public class ApplicationSocket implements IXposedHookZygoteInit{

2? ? public static String TAG = "ApplicationSocket";

3? ? @Override

4? ? public void initZygote(StartupParam startupParam) throws Throwable {

5? ? ? ? XposedBridge.hookAllMethods(ActivityThread.class, "systemMain", new SystemServiceHook());

6? ? }

7 }

4.創(chuàng)建SystemServiceHook 重寫XC_MethodHook,實現(xiàn)注冊服務(wù),這也是最核心的類

import android.content.Context;

import android.os.Build;

import android.os.CustomService;

import android.os.ICustomService;

import android.os.ServiceManager;

import de.robv.android.xposed.XC_MethodHook;

import de.robv.android.xposed.XposedBridge;

import de.robv.android.xposed.XposedHelpers;

/**

* Created by bluce on 17/12/5.

*/

public class SystemServiceHook extends XC_MethodHook {

private static CustomService oInstance;

private static boolean systemHooked;

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

if (systemHooked) {

return;

}

final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

Class activityManagerServiceClazz = null;

try {

activityManagerServiceClazz = XposedHelpers.findClass("com.android.server.am.ActivityManagerService", classLoader);

} catch (RuntimeException e) {

// do nothing

}

if (!systemHooked && activityManagerServiceClazz!=null) {

systemHooked = true;

//系統(tǒng)服務(wù)啟動完畢端圈,通知自定義服務(wù)

XposedBridge.hookAllMethods(

activityManagerServiceClazz,

"systemReady",

new XC_MethodHook() {

@Override

protected final void afterHookedMethod(final MethodHookParam param) {

oInstance.systemReady();

XposedBridge.log(">>>systemReady!!!!");

}

}

);

//注冊自定義服務(wù)到系統(tǒng)服務(wù)中

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

XposedBridge.hookAllConstructors(activityManagerServiceClazz, new XC_MethodHook() {

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

Context context = (Context) XposedHelpers.getObjectField(param.thisObject, "mContext");

registerService(classLoader,context);

}

});

}else{

XposedBridge.hookAllMethods(

activityManagerServiceClazz,

"main",

new XC_MethodHook() {

@Override

protected final void afterHookedMethod(final MethodHookParam param) {

Context context = (Context) param.getResult();

registerService(classLoader,context);

}

}

);

}

}

}

private static void registerService(final ClassLoader classLoader, Context context) {

XposedBridge.log(">>>register service, Build.VERSION.SDK_INT"+Build.VERSION.SDK_INT);

oInstance = new CustomService(context);

Class ServiceManager = XposedHelpers.findClass("android.os.ServiceManager",classLoader);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

//避免java.lang.SecurityException錯誤,從5.0開始焦读,selinux服務(wù)名稱需要加前綴"user."

XposedHelpers.callStaticMethod(

ServiceManager,

"addService",

"user.custom.service",

oInstance,

true

);

} else {

XposedHelpers.callStaticMethod(

ServiceManager,

"addService",

"custom.service",

oInstance

);

}

}

//use service demo

public static ICustomService mService;

public static String someMethod(Context context) {

try {

if (mService == null) {

mService=ICustomService.Stub.asInterface(ServiceManager.getService("user.wx_custom.service"));

//mService =(ICustomService)context.getSystemService("wx_custom.service");

}

return mService.sayHello();

} catch (Exception e) {

System.out.println(e.getMessage());

e.printStackTrace();

}

return? ">>> someMethod failed!!! ";

}

}

5.在當(dāng)前應(yīng)用activity中調(diào)用系統(tǒng)服務(wù),service實現(xiàn)可以創(chuàng)建成單獨的module,這樣就實現(xiàn)不同項目直接使用,最重要的是在當(dāng)前項目xposed hook代碼中可以直接使用了舱权,這也是本文的最初衷矗晃。

button = (Button) findViewById(R.id.testButton);

button.setOnClickListener(new View.OnClickListener(){

@Override

public? void? onClick(View v){

if(true){

//testPattern();return;

//HookTest.registerReceiver(context);

String str = SystemServiceHook.someMethod(MainActivity.context);

if(str!=null){

System.out.println(">>>>:::"+str);

}

return;

}

}

} ;

基于以上,CustomService整體的代碼就實現(xiàn)了宴倍,重啟系統(tǒng)就變成了系統(tǒng)服務(wù)张症,可以直接使用。但是以下2點需要特別注意:

1.com.android.server.am.ActivityManagerService是framework不公開的方法和類鸵贬,所以項目需要導(dǎo)入AndroidHiddenAPI.jar這個包

2.android5.0之前SystemContext通過call ActivityManagerService的main方法就可以直接獲取俗他,但是5.0開始是通過createSystemContext方法生產(chǎn),所以只能判斷下版本阔逼,然后一個通過構(gòu)造取獲取兆衅,一個通過main返回結(jié)果獲取

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羡亩,更是在濱河造成了極大的恐慌摩疑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夕春,死亡現(xiàn)場離奇詭異未荒,居然都是意外死亡,警方通過查閱死者的電腦和手機及志,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門片排,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人速侈,你說我怎么就攤上這事率寡。” “怎么了倚搬?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵冶共,是天一觀的道長。 經(jīng)常有香客問我每界,道長捅僵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上甚纲,老公的妹妹穿的比我還像新娘馋嗜。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般纳账。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捺疼,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天疏虫,我揣著相機與錄音,去河邊找鬼啤呼。 笑死议薪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媳友。 我是一名探鬼主播斯议,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼醇锚!你這毒婦竟也來了哼御?” 一聲冷哼從身側(cè)響起坯临,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恋昼,沒想到半個月后看靠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡液肌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年挟炬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦哆。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡谤祖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出老速,到底是詐尸還是另有隱情粥喜,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布橘券,位于F島的核電站额湘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旁舰。R本人自食惡果不足惜锋华,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箭窜。 院中可真熱鬧毯焕,春花似錦、人聲如沸绽快。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坊罢。三九已至,卻和暖如春擅耽,著一層夾襖步出監(jiān)牢的瞬間活孩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工乖仇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憾儒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓乃沙,卻偏偏與公主長得像起趾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子警儒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355