本文转载自:xposed 的基本使用

一、原理

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

二、Xposed 安装

环境:网易 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 框架会出错),进去之后点击小云彩即可安装完成。

三、Xposed 代码编写

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

<meta-dataandroid:name="xposedmodule"android:value="true" />   <!--告诉xposed框架这是一个xposed模块-->
<meta-dataandroid:name="xposeddescription"android:value="这是一个Xposed例程" /> <!--模块描述-->
<meta-dataandroid:name="xposedminversion" <!--模块支持的最低版本-->android:value="30" />

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

repositories {jcenter()
}
dependencies {...compileOnly 'de.robv.android.xposed:api:82'compileOnly 'de.robv.android.xposed:api:82:sources'...
}

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

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

package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
public class MainActivity2 extends AppCompatActivity {private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {Toast.makeText(MainActivity2.this, toastMessage(), Toast.LENGTH_SHORT).show();}});}public String toastMessage() {return "我未被劫持";}
}

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

package com.example.myapplication;
import java.lang.reflect.Array;
import java.security.PublicKey;
import java.util.Arrays;
import java.util.Map;
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;
public class HookTest implements IXposedHookLoadPackage {private static final String HOOK_APP_NAME = "APP名字";public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {//性能优化,避免操作无关appif (!lpparam.packageName.equals(HOOK_APP_NAME))return;if (lpparam.packageName.equals("HOOK_APP_NAME")) {XposedBridge.log(" 劫持成功!!!");XposedBridge.log("XposedMainInit handleLoadPackage 执行");XposedBridge.log("Loaded app: " + lpparam.packageName);            XposedHelpers.findAndHookMethod("APP名字.MainActivity",//hook的类lpparam.classLoader,"toastMessage", // 被Hook的函数//Map.class, 被Hook函数的第一个参数  (此处没有,只是举个例子)//String.class, 被Hook函数的第二个参数Stringnew XC_MethodHook() {protected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);// 参数获取XposedBridge.log("入口函数执行");//参数1XposedBridge.log("beforeHookedMethod map:" + param.args[0]);//参数2XposedBridge.log("beforeHookedMethod hash_key:" + param.args[1]);//函数返回值XposedBridge.log("beforeHookedMethod result:" + param.getResult());}protected void afterHookedMethod(MethodHookParam param) throws Throwable {XposedBridge.log("afterHookedMethod result:" + param.getResult());param.setResult("你已被劫持");}});        }}
}

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

com.example.myapplication.HookTest

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

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

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

四、面对加了壳的 APP

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

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

public class EncryptHook implements IXposedHookLoadPackage {public void handleLoadPackage(LoadPackageParam loadPackageParam) throws Throwable {if (!loadPackageParam.packageName.equals("app包名")) { return; }XposedBridge.log("Start hook " + loadPackageParam.packageName);XposedHelpers.findAndHookMethod("com.stub.StubApp", loadPackageParam.classLoader,//com.stub.StubApp 加壳的类"attachBaseContext", Context.class, new XC_MethodHook() {// attachBaseContext 加壳的方法 @Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);Context context = (Context) param.args[0];ClassLoader classLoader = context.getClassLoader();XposedBridge.log("Enter stubApp");XposedHelpers.findAndHookMethod("com.huijiemanager.utils.t", classLoader,"a", byte[].class, PublicKey.class, new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {XposedBridge.log("rsa before params: " + new String((byte[]) param.args[0]) + "," + param.args[1]);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {XposedBridge.log("rsa after params: " + new String((byte[]) param.args[0]) + "," + param.args[1]);}});}});}
}

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

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

xposed 的基本使用相关推荐

  1. Xposed: 勾住(Hook) Android应用程序对象的方法,实现AOP

    Xposed Xposed能够勾住(Hook) Android应用程序对象的方法,实现AOP,一个简单的例子: public class WebViewHook implements IXposedH ...

  2. vivo7.0系统机器(亲测有效)激活Xposed框架的教程

    对于喜欢搞机的机友来说,常常会使用到Xposed框架和种种功能牛逼的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活Xposed框架是异常轻松的,但随着系统版本的升级,5.0以后 ...

  3. android xposed 编译,Xposed修改特征编译

    注意make缓存问题, 修改了文件内容,没有及时生效!!!! de.robv.android.xposed 在outdir目录中新建java目录移入XposedBridge.jar 参考链接 1 Xp ...

  4. xposed hook 构造函数_初识Xposed(上)

    " 前言:初学逆向 请多多指教" 总结: 1.学习了Xposed的正常hook,以及一些hook的时候需要注意的地方 Xposed介绍 - Android基于Linux,第一个启动 ...

  5. 7.0系统设备xposed框架激活经验

    XPOSED框架基本介绍 xposed框架是基于Android系统平台的神器,大伙能够通过安装框架对应的功能模块来达到各种神奇的功能以及对系统各种底层的修改. 如何在Android系统上安装激活xpo ...

  6. 8.0系统安装Xposed框架失败Xposed framework version XX is installed

    在使用xposed框架的时候,对于新用户来说,会通常遇到这个问题,即下载完xposed Installer之后,点击框架的时候,会跳出如下警告: The Xposed framework is not ...

  7. 华为9.0以上系统如何没root激活XPOSED框架的流程

    在大多运行室的引流或者业务操作中,理论上需要使用安卓的高端技术XPOSED框架,最近我们运行室买来了一批新的华为9.0以上系统,理论上都是基于7.0以上系统版本,理论上不能够获取Root的su权限,即 ...

  8. nexus5 刷 Android6.0+Xposed

    不得不说现在的刷机工具都做的方便快捷,只需要简单的几天命令就解决了.以前用windows刷的时候还需要装一堆驱动软件啥的. 原文链接: nexus5 刷 Android6.0+Xposed 0x00 ...

  9. Android.Hook框架xposed篇(Http流量监控)

    瘦蛟舞 · 2015/08/03 10:30 官方教程:github.com/rovo89/Xpos- 官网:repo.xposed.info/module/de.r- apk:dl-xda.xpos ...

  10. 三星6.0系统手机最简单激活XPOSED框架的教程

    对于喜欢玩手机的朋友来说,经常会接触到Xposed框架及其种种功能强悍的模块,对于5.0以下的系统版本,只要手机能获得root权限,安装和激活Xposed框架是比较简单的,但随着系统版本的不断更新,5 ...

最新文章

  1. 在夕阳下第一次写文章的菜鸟
  2. js判断页面是首次加载还是刷新
  3. 读懂这一篇,集群节点不下线
  4. 如何优化 Android Studio 启动、编译和运行速度?
  5. Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)
  6. WordPress注册登录注册系统插件
  7. 小白怎么学习云计算?2020云计算学习大纲
  8. mysql主从复制同步实验_db.mysql.主从同步实验
  9. spring MVC interceptor post遇到问题
  10. 资产管理系统测试用例
  11. Linux查看JDK版本和安装位置
  12. 美国语言教学5c标准,美国外语教学(一)——5C目标
  13. java类 举例分析_Java深入分析类与对象
  14. 页面加载时,下方内容在上方图片位置闪现
  15. 《C》C语言实现DCT算法
  16. 参照系(参考系)与参照物的区别
  17. ISP Pipeline AWB
  18. 局域网资产发现过程(利用工具nmap、masscan)
  19. 桌面图标有阴影,教给你怎么去掉
  20. eovs实训报告总结心得_实训心得10篇完美版

热门文章

  1. CVPR 2018摘要:第五部分
  2. 面试官:讲讲什么是 JMM
  3. som聚类 matlab,使用SOM对数据进行聚类
  4. Java基础编程——基础语法及介绍
  5. 浅谈电气工程专业的工程伦理
  6. 基于matlab频率估计算法对比,包括统计M.Westlund算法,BTDT,CZT,ZOOM-FFT 等的
  7. 查找算法【二叉查找树】 - 二叉查找树的查找
  8. HTTP 错误 500.19 - Internal Server Error 解决办法详解
  9. WPS Office 2007 个人版 6.3.0.1339
  10. 关于linux的rwx