編輯:關於Android編程
簡介:Xposed框架是一款可以在不修改APK的情況下影響程序運行的框架服務,通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創建的虛擬機的劫持。
Github地址:https://github.com/rovo89/Xposed
package com.cockroach.hook_object;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv1 = (TextView) findViewById(R.id.tv1);
TextView tv2 = (TextView) findViewById(R.id.tv2);
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
tv1.setText("imei:" + tm.getDeviceId());
tv2.setText("imsi:" + tm.getSubscriberId());
}
}

這就是我們的等會要hook的apk程序,下面編寫xposed插件
在 application 標簽中增加模塊說明信息
將 xposed 庫文件 XposedBridgeApi-XX.jar, 放入 app/lib 文件夾下


需要注意的是: 修改 Scope 為 Provided


package com.cockroach.xposedhookdemo;
import android.telephony.TelephonyManager;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* Created by 18459 on 2016/6/27.
*/
public class Main implements IXposedHookLoadPackage{
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if(!loadPackageParam.packageName.equals("com.cockroach.hook_object"))
return;
XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
// 找到對應的方法,進行替換
// 參數 1:類名
// 參數 2: 方法名
// 參數 3:實現監聽,重寫方法
// replaceHookedMethod 替換方法
// beforeHookedMethod 方法前執行
// afterHookedMethod 方法後執行
XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return "Hook 成功了 哈哈!!!";
}
});
}
}
需要在 main 文件夾下建立 assets 文件夾中新建一個 xposed_init 的文件,並在其中聲明主入口類

到這裡這個hook無參函數的簡單demo插件就完成了,
布局文件中添加
MainActivity中添加
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void my_onClick(View view) {
EditText editText = (EditText) findViewById(R.id.et1);
EditText editText1 = (EditText) findViewById(R.id.et2);
String string = editText.getText().toString();
String string1 = editText1.getText().toString();
if(CheckRegister(string,string1)){
Toast.makeText(MainActivity.this,"登陸成功",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MainActivity.this,"登陸失敗",Toast.LENGTH_SHORT).show();
}
}
private boolean CheckRegister(String string, String string1) {
return string.equals(string1);
}
}
效果,兩個輸入框輸入相同時 提示登陸成功,不同時 提示登陸失敗
到這裡測試app完成
這裡配置和前面無參插件編寫一樣,只需修改MainActivity
package com.cockroach.xposedhookdemo;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* Created by 18459 on 2016/6/27.
*/
public class Main implements IXposedHookLoadPackage{
//被HOOK的程序的包名和類名
String packName = "com.cockroach.myapplication";
String className = "com.cockroach.myapplication.MainActivity";
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if(!loadPackageParam.packageName.equals(packName))
return;
XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
// replaceHookedMethod 替換方法
// beforeHookedMethod 方法前執行
// afterHookedMethod 方法後執行
// 處理是的情況
// 找到對應類的方法,進行hook,hook的方式有兩種
XposedHelpers.findAndHookMethod(className, // 類名
loadPackageParam.classLoader, // 類加載器
"CheckRegister", // 方法名
String.class, // 參數1
String.class, // 參數2
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d("xposedplugin", (String) param.args[0]);
Log.d("xposedplugin", (String) param.args[1]);
//將兩個參數改為相等
param.args[0] = "123";
param.args[1] = "123";
//這樣設置函數的返回值
param.setResult(true);
}
@Override
//這個hook方法之後有啥用還不知道
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d("xposedplugin", (String) param.args[0]);
Log.d("xposedplugin", (String) param.args[1]);
}
});
}
}
到這裡hook有參函數的插件完成了
上面我們寫了共寫了兩個測試app和兩個插件app,我們用第一對app,來做測試
開機後我們運行測試app,看到已經hook成功了
hook之後運行測試app

AndroidStuio快速發布開源項目到Jcenter/Bintray
前言最近做了兩個開源項目,一個是Android網絡框架NoHttp,和Volley、OkHttp一樣做客戶端請求的,更多相關信息請百度哦;另一個是Android Web服
Android自定義控件之組合控件學習筆記分享
我們來講一下自定義組合控件,相信大家也接觸過自定義組合控件吧,話不多說,直接干(哈~哈~):大家看到這個覺得這不是很簡單的嗎,這不就是寫個布局文件就搞定嘛,沒錯,確實直接
android異步加載
本篇博客總結了慕課網關於異步加載圖片的知識要點,和大家一起分享,有感覺聽得不連貫的可以來看看。看完本篇博客,你將學習到下面的知識:1.怎樣將一個url(也可以說是一個In
Android Native層Binder.transact()函數調用 Binder.onTransact() 函數失敗分析
Q:Android Native層Binder.transact()函數調用 Binder.onTransact() 函數失敗?在Android Native層調用Cam