Android运行的核心是zygote进程,所有app的进程都是通过zygote fork出来的。通过替换system/bin/下面的app_process等文件,相当于替换了zygote进程,实现了控制手机上的所有APP。基本原理是修改了ART/Davilk虚拟机,将需要hook的函数注册为Native层函数,当执行到该函数时,虚拟机会先执行Native层函数,然后执行Java层函数,这样完成hook。

更详细的可以参考:https://blog.csdn.net/wxyyxc1992/article/details/17320911

环境:网易mumu、Android Studio3.3.1

github地址:https://github.com/rovo89/XposedInstaller

Xposedinstaller的apk:https://repo.xposed.info/module/de.robv.android.xposed.installer

在网易mumu中安装好xposedinstaller apk后,关闭应用兼容性(不关闭的话安装xposed框架会出错),进去之后点击小云彩即可安装完成。

image-20190619104940343

新建项目,选择empty activity,创建成功后,在AndroidManifest.xml中添加如下代码

  1. <meta-data
  2. android:name="xposedmodule"
  3. android:value="true" /> <!--告诉xposed框架这是一个xposed模块-->
  4. <meta-data
  5. android:name="xposeddescription"
  6. android:value="这是一个Xposed例程" /> <!--模块描述-->
  7. <meta-data
  8. android:name="xposedminversion" <!--模块支持的最低版本-->
  9. android:value="30" />

在gradle中配置XposedbridgeApi,build.gradle中配置

  1. repositories {
  2. jcenter()
  3. }
  4. dependencies {
  5. ...
  6. compileOnly 'de.robv.android.xposed:api:82'
  7. compileOnly 'de.robv.android.xposed:api:82:sources'
  8. ...
  9. }

这是在网络通畅的情况下进行的, 网络不通畅的话,可以手动下载XposedBridgeApi-82.jar,拖动到/app/libs中,删除上述gradle中配置的 jcenter,右键”Add As Library”添加这个jar包。

在界面上画个按钮,并在MainAcitiviy中编写如下代码(单纯写hook的话前面新建项目的时候可以add no activity)

  1. package com.example.myapplication;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.widget.Button;
  5. import android.widget.Toast;
  6. import android.view.View;
  7. public class MainActivity2 extends AppCompatActivity {
  8. private Button button;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. button = (Button) findViewById(R.id.button);
  14. button.setOnClickListener(new View.OnClickListener() {
  15. public void onClick(View v) {
  16. Toast.makeText(MainActivity2.this, toastMessage(), Toast.LENGTH_SHORT).show();
  17. }
  18. });
  19. }
  20. public String toastMessage() {
  21. return "我未被劫持";
  22. }
  23. }

编写Hook代码,在MainActivity同级目录下新建HookTest.java,并且继承接口IXposedHookLoadPackage和重写handleLoadPackage方法

  1. package com.example.myapplication;
  2. import java.lang.reflect.Array;
  3. import java.security.PublicKey;
  4. import java.util.Arrays;
  5. import java.util.Map;
  6. import de.robv.android.xposed.IXposedHookLoadPackage;
  7. import de.robv.android.xposed.XC_MethodHook;
  8. import de.robv.android.xposed.XposedBridge;
  9. import de.robv.android.xposed.XposedHelpers;
  10. import de.robv.android.xposed.callbacks.XC_LoadPackage;
  11. public class HookTest implements IXposedHookLoadPackage {
  12. private static final String HOOK_APP_NAME = "APP名字";
  13. public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
  14. //性能优化,避免操作无关app
  15. if (!lpparam.packageName.equals(HOOK_APP_NAME))
  16. return;
  17. if (lpparam.packageName.equals("HOOK_APP_NAME")) {
  18. XposedBridge.log(" 劫持成功!!!");
  19. XposedBridge.log("XposedMainInit handleLoadPackage 执行");
  20. XposedBridge.log("Loaded app: " + lpparam.packageName); XposedHelpers.findAndHookMethod("APP名字.MainActivity",//hook的类
  21. lpparam.classLoader,
  22. "toastMessage", // 被Hook的函数
  23. //Map.class, 被Hook函数的第一个参数 (此处没有,只是举个例子)
  24. //String.class, 被Hook函数的第二个参数String
  25. new XC_MethodHook() {
  26. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  27. super.beforeHookedMethod(param);
  28. // 参数获取
  29. XposedBridge.log("入口函数执行");
  30. //参数1
  31. XposedBridge.log("beforeHookedMethod map:" + param.args[0]);
  32. //参数2
  33. XposedBridge.log("beforeHookedMethod hash_key:" + param.args[1]);
  34. //函数返回值
  35. XposedBridge.log("beforeHookedMethod result:" + param.getResult());
  36. }
  37. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  38. XposedBridge.log("afterHookedMethod result:" + param.getResult());
  39. param.setResult("你已被劫持");
  40. }
  41. });
  42. }
  43. }
  44. }

在src/mian目录下添加一个assets目录,目录下添加一个xposed_init文件,里面的代码是你的Hook类的包名+类名。

com.example.myapplication.HookTest

最后选择禁用 Instant Run: 单击 File -> Settings -> Build, Execution, Deployment -> Instant Run,把勾全部去掉。

image-20190619133257899

这个时候钩子已经执行了,具体想钩什么,就看自己的需求了。

注:实际操作中,需要对APP先进行反编译(反编译了才能知道要钩那个函数),反编译工具有很多,这里就不细说了。

直接用反编译工具打开apk,查看加的是哪种壳,寻找对应的函数,类似attachBaseContext这样的方法。

参考链接:https://www.cnblogs.com/xiaobaiyey/p/6442417.html

  1. public class EncryptHook implements IXposedHookLoadPackage {
  2. public void handleLoadPackage(LoadPackageParam loadPackageParam) throws Throwable {
  3. if (!loadPackageParam.packageName.equals("app包名")) { return; }
  4. XposedBridge.log("Start hook " + loadPackageParam.packageName);
  5. XposedHelpers.findAndHookMethod("com.stub.StubApp", loadPackageParam.classLoader,
  6. //com.stub.StubApp 加壳的类
  7. "attachBaseContext", Context.class, new XC_MethodHook() {
  8. // attachBaseContext 加壳的方法
  9. @Override
  10. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  11. super.afterHookedMethod(param);
  12. Context context = (Context) param.args[0];
  13. ClassLoader classLoader = context.getClassLoader();
  14. XposedBridge.log("Enter stubApp");
  15. XposedHelpers.findAndHookMethod("com.huijiemanager.utils.t", classLoader,
  16. "a", byte[].class, PublicKey.class, new XC_MethodHook() {
  17. @Override
  18. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  19. XposedBridge.log("rsa before params: " + new String(
  20. (byte[]) param.args[0]) + "," + param.args[1]);
  21. }
  22. @Override
  23. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  24. XposedBridge.log("rsa after params: " + new String(
  25. (byte[]) param.args[0]) + "," + param.args[1]);
  26. }
  27. });
  28. }
  29. });
  30. }
  31. }

注:反编译的代码不一定准确,逆向的时候最好对每个关键函数都挂上钩子,查看参数是否正确。

附上xposedAPI文档:https://api.xposed.info/reference/packages.html

版权声明:本文为mangM原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mangM/p/11055384.html