Android Xposed模塊開發(fā)入門

? ? ? ?Xposed框架是一款可以在不修改APK的情況下影響程序運(yùn)行(修改系統(tǒng))的框架服務(wù)产捞,基于它可以制作出許多功能強(qiáng)大的模塊愈涩,且在功能不沖突的情況下同時(shí)運(yùn)作捧灰。

Github地址:https://github.com/rovo89/Xposed喳钟。

官方教程:https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

目前有關(guān)Xposed框架的說明已經(jīng)很多律想,這里通過一個(gè)登錄劫持實(shí)例來介紹Xposed模塊開發(fā)。

登錄例子如下:

public class MainActivity extends AppCompatActivity {

private final String USER="admin";

private final String PASSWORD="123456";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void onClick_Login(View view) {

EditText editText = (EditText) findViewById(R.id.user);

EditText editText1 = (EditText) findViewById(R.id.password);

String m_user = editText.getText().toString();

String m_password = editText1.getText().toString();

if(CheckLogin(m_user,m_password)){

Toast.makeText(MainActivity.this,"登陸成功",Toast.LENGTH_SHORT).show();

}

else {

Toast.makeText(MainActivity.this,"登陸失敗",Toast.LENGTH_SHORT).show();

}

}

private boolean CheckLogin(String user, String password) {

return user.equals(USER) && password.equals(PASSWORD);

}

}

編譯運(yùn)行流济,只有當(dāng)用戶锐锣、密碼匹配才提示登錄成功腌闯,否則顯示登錄失敗。

接下來編寫Xposed模塊雕憔,通過Xposed模塊可以攔截CheckLogin()這個(gè)函數(shù)绑嘹,使得不管輸入什么用戶、密碼都能提示登錄成功橘茉。

(1)創(chuàng)建無acitvity工程工腋,設(shè)置成為xposed模塊

在application標(biāo)簽增加三個(gè)三個(gè)元數(shù)據(jù)(meta-data)

(2)引用xposed框架的jar包

將xposed庫(kù)文件XposedBridgeApi-XX.jar, 放入app/lib文件夾下畅卓,編輯更改庫(kù)的依賴關(guān)系為Provided擅腰,這個(gè)很重要。build.gradle中為

(3)創(chuàng)建模塊類Hook翁潘,實(shí)現(xiàn)Xposed中的接口IXposedHookLoadPackage

public class Hook implements IXposedHookLoadPackage {

String packName = "com.ch369.loginwindow";

String className = "com.ch369.loginwindow.MainActivity";

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

//處理指定包名的應(yīng)用

if(!loadPackageParam.packageName.equals(packName))

return;

XposedBridge.log("Loaded app: " + loadPackageParam.packageName);

XposedHelpers.findAndHookMethod(className,

loadPackageParam.classLoader,

"CheckLogin",

String.class,

String.class,

new XC_MethodHook() {

@Override

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

super.beforeHookedMethod(param);

XposedBridge.log("param 1:" + (String) param.args[0]);

XposedBridge.log("param 2:" + (String) param.args[1]);

// param.setResult(true);

}

@Override

protected void afterHookedMethod(MethodHookParam param) throws Throwable {

super.afterHookedMethod(param);

XposedBridge.log("login result:" + param.getResult().toString());

}

});

}

}

其中handleLoadPackage()獲取包加載時(shí)的回調(diào)并拿到其對(duì)應(yīng)的ClassLoader趁冈。findAndHookMethod()找到指定類對(duì)應(yīng)的方法進(jìn)行hook。原型如下:

public?static XC_MethodHook.Unhook findAndHookMethod(

String className, //函數(shù)所在類名

ClassLoader classLoader, //指定Classloader

String methodName, //方法名

Object... parameterTypesAndCallback) { //參數(shù)類型列表和Hook回調(diào)return findAndHookMethod(findClass(className, classLoader), methodName, parameterTypesAndCallback); }

其中參數(shù)類型列表是不定參拜马,按順序傳入?yún)?shù)的類型渗勘,最后一個(gè)參數(shù)一定是回調(diào)函數(shù),用于在Hook點(diǎn)被執(zhí)行時(shí)的回調(diào)俩莽。

其中旺坠,回調(diào)分為如下兩種:

XC_MethodHook:在目標(biāo)方法執(zhí)行前/后運(yùn)行相應(yīng)的替換函數(shù);

XC_MethodReplacement?:完全替換目標(biāo)方法扮超。

這里用了XC_MethodHook取刃,有beforeHookedMethod和afterHookedMethod兩種方法在Hook點(diǎn)被執(zhí)行回調(diào)。

(4)申明主入口類出刷,

在assets目錄下新建“xposed_init”文件璧疗,在文件中說明需要加載到XposedInstaller的入口類,完整的類名:包名+類名

編譯并安裝到裝有Xposed框架的手機(jī)上馁龟,Xposed Installer會(huì)自動(dòng)檢測(cè)到崩侠,進(jìn)入Xposed Installer,選中HookDemo,并重啟手機(jī)坷檩。

重啟手機(jī)后運(yùn)行登錄程序却音,輸入user和password登錄,在Xposed Installer日志中可以看到日志如下日志信息淌喻,表明登錄函數(shù)CheckLogin已經(jīng)被攔截成功僧家。

在beforeHookedMethod()中增加param.setResult(true),重新編譯安裝重啟運(yùn)行裸删,這時(shí)無論輸入什么用戶和密碼,都能提示登錄成功阵赠,篡改登錄函數(shù)CheckLogin()成功涯塔。

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

super.beforeHookedMethod(param);

XposedBridge.log("param 1:" + (String) param.args[0]);

XposedBridge.log("param 2:" + (String) param.args[1]);

param.setResult(true);

}

同樣肌稻,用XC_MethodReplacement完全替換對(duì)應(yīng)方法也可以達(dá)到類似效果。

XposedHelpers.findAndHookMethod(className,loadPackageParam.classLoader, "CheckLogin", String.class,

String.class, new XC_MethodReplacement() {

@Override

protected Object replaceHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) throws Throwable {

XposedBridge.log("login ok");

return true;

}

});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匕荸,一起剝皮案震驚了整個(gè)濱河市爹谭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榛搔,老刑警劉巖诺凡,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異践惑,居然都是意外死亡腹泌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門尔觉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凉袱,“玉大人,你說我怎么就攤上這事侦铜∽ㄋΓ” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵钉稍,是天一觀的道長(zhǎng)涤躲。 經(jīng)常有香客問我,道長(zhǎng)贡未,這世上最難降的妖魔是什么篓叶? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮羞秤,結(jié)果婚禮上缸托,老公的妹妹穿的比我還像新娘。我一直安慰自己瘾蛋,他們只是感情好俐镐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哺哼,像睡著了一般佩抹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上取董,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天棍苹,我揣著相機(jī)與錄音,去河邊找鬼茵汰。 笑死枢里,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栏豺,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼彬碱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了奥洼?” 一聲冷哼從身側(cè)響起巷疼,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灵奖,沒想到半個(gè)月后嚼沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓷患,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年骡尽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尉尾。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爆阶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沙咏,到底是詐尸還是另有隱情辨图,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布肢藐,位于F島的核電站故河,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吆豹。R本人自食惡果不足惜鱼的,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痘煤。 院中可真熱鬧凑阶,春花似錦、人聲如沸衷快。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蘸拔。三九已至师郑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間调窍,已是汗流浹背宝冕。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邓萨,地道東北人地梨。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓菊卷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親湿刽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子的烁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容