Android Studio Xposed模块编写(一)
1、环境说明
本文主要参考https://my.oschina.net/wisedream/blog/471292?fromerr=rNPFQidG的内容,自己实现了一遍,侵权请告知
已经安装xposed Installer的nexus5一台,Xposed Installer版本2.7 experimental1, Android 版本4.4.4
开发环境Android Studio 2.2.3
2、开发流程
1、拷贝XposedBridgeApi-54.jar到新建工程的libs目录
2、修改app目录下的build.gradle文件,在AndroidManifest.xml中增加Xposed相关内容
3、新建hook类,编写hook代码
4、在app上右键新建assets folder,然后在assets目录下新建文件xposed_init,在里面写上hook类的完整路径
3、Hook模块编写
1、新建Android studio工程,选择无activity,并将XposedBridgeApi-54.jar拷贝到libs目录下,然后双击app目录下的build.gradle文件,将
compile fileTree(include: ['*.jar'], dir: 'libs')
替换为
provided fileTree(include: ['*.jar'], dir: 'libs')
2、修改AndroidManifest.xml文件,在Application标签下增加内容如下
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="模块描述" />
<meta-data
android:name="xposedminversion"
android:value="" />
3、新建hook类,命名为XMdodule,内容如下
public class XModule implements IXposedHookLoadPackage{
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if(loadPackageParam.packageName.equals("com.example.test")){
XposedBridge.log("XLZH " + loadPackageParam.packageName);
XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return "this is imei";
}
});
XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
return "this is imsi";
}
});
}
}
}
代码功能是hook 系统TelephonyManager类的getDeviceId()和getSubscriberId()方法,返回字符串,而且只hook com.example.test应用。
4、新建assets目录,在其中新建文本xposed_init,里面内容为
com.zcgames.xposedtest.XModule
最后的目录结构如下图所示

4、Hook目标应用编写
Android Studio新建com.example.test应用,MainActivity.java内容如下
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.getImei);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
try {
Log.d("XLZH", "get imei " + tm.getDeviceId());
Log.d("XLZH", "get imsi " + tm.getSubscriberId());
}catch (Exception e) {
Log.d("XLZH", e.getMessage());
e.printStackTrace();
}
}
});
}
}
5、实施Hook
1、XposedTest工程编写完成后,点击Build-Build Apk(因为没有Activity,所以无法点击运行自动安装),build成功后,在app/build/output/apk目录下生成app-debug.apk,点击as下发的Terminal,进入该目录使用adb install安装即可
2、com.example.test工程完成后,点击run运行,点击按钮,使用logcat | grep XLZH,查看结果如下

3,打开xposed Installer应用,选择模块,可以看到XposedTest模块,选中,然后重启手机,再次打开目标应用,点击按钮,结果如下所示,hook成功

6、几个小坑
1、xposed加载模块失败,在xposed installer的log中看到提示如下
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
原因:因为没有修改build.gradle文件,默认libs目录下的内容会被包仅apk中,导致和手机上原有的发生了冲突,在build.gradle中把compile修改成provided即可。
2、xposed_init中区分大小写,例如com.zcgames.xposedtest.XModule修改成com.zcgames.XposedTest.XModule,也会导致模块加载失败
3、模块安装后再次使用adb install安装时,提供程序已经安装,需要到设置->应用中找到安装的模块进行卸载(没有activity,无法在桌面卸载)
Android Studio Xposed模块编写(一)的更多相关文章
- Android Studio Xposed模块编写(二)
阅读本文前,假设读者已经看过Android Studio Xposed模块编写(一) 相关环境已经搭建完成.本文演示案例与上文环境一致,不在赘述. 1.概述 Xposed是非常牛叉的一款hook框架 ...
- 5.1、Android Studio用Logcat编写和查看日志
Android Studio在Android Monitor中包含了一个logcat的tab,可以打印系统事件,比如垃圾回收发生时,实时打印应用消息. 为了显示需要的信息,你可以创建过滤器,更改需要显 ...
- Android的硬件抽象层模块编写规范
硬件抽象层模块编写规范 Android系统的硬件抽象层以模块的形式来管理各个硬件訪问接口.每个硬件模块都相应有一个动态链接库文件.这些动态链接库文件的命令须要符合一定的规范.同一时候,在系统内部. ...
- Android Studio 添加模块依赖
原文地址: http://fanjiajia.cn/2018/09/27/Android%20Studio%20%E6%B7%BB%E5%8A%A0%E6%A8%A1%E5%9D%97%E4%BE%9 ...
- Android Studio从Eclipse导项目
要是你只下了Android Studio 就不能用Eclipse导出gradle项目了 可以直接使用Android Studio导入模块,在Android Studio里Project算Eclipse ...
- [转载] Android Studio 上第一个 Xposed 模块
本文转载自: http://www.open-open.com/lib/view/open1451364108964.html 环境: 已root手机一枚 Android Studio一枚 官方文档参 ...
- [转]Android Studio创建Xposed模块项目时BridgeApi的正确添加方式
使用Android Studio创建的空项目作为Xposed Module App,对于Api Jar包的引用方式,一开始是按照傻瓜式Jar Lib的处理方式,复制XposedBridgeApi-54 ...
- 开启Android Apk调试与备份选项的Xposed模块的编写
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80963610 在进行Android应用程序逆向分析的时候,经常需要进行Andro ...
- android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码
Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...
随机推荐
- LeetCode题解之Counting Bits
1.题目描述 2.问题分析 利用bitset. 3 代码 vector<int> countBits(int num) { vector<int> v; ; i <= n ...
- Java 注解用法详解——@SuppressWarnings
转自: https://www.cnblogs.com/fsjohnhuang/p/4040785.html Java魔法堂:注解用法详解——@SuppressWarnings 一.前言 编码时我 ...
- SQL Server存储过程输入参数使用表值
转载自:http://blog.csdn.net/smithliu328/article/details/9996149 在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使 ...
- 使用MyEclipse建立working set
1.用eclipse或者MyEclipse开发久了后,会有很多的项目,就算关闭了还会有很多,这是需要建立一个working set,相当在工作区中建立项目文件夹分类放自己做过的一些项目. 如下图: ...
- 浅析C#中的Attribute
原文地址:http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html 一.什么是Attribute 先看下面的三段代码: 1.自定义Att ...
- Use Jupyter notebook on Fedora 28
生产环境使用 Fedora 28, 并且需要搭建一个 Jupyter 的notebook 方便使用,所搭建的Jupyter 支持单人远程 密码访问 1. 安装 安装 Jupyter , 出错 [roo ...
- 微信小程序里使用阿里巴巴矢量图标
登录 阿里巴巴矢量图标 (https://www.iconfont.cn) 选中图标,加入购物车图标 下载源代码 解析出来如下文件结构 有两种使用方式: 1)不转换成base64的文件 找到 icon ...
- sql注入--基础
什么是sql注入: 利用SQL语句 在外部 对数据库进行 查询,更新等 动作 sql注入的原理: 输入值可控且带入数据库执行(前提) 接受的变量传值未进行过滤(实质) sql注入的目的: 获取数据(网 ...
- vue2.0模拟锚点
在vue项目中,因为采用路由跳转,会导致无法使用常规的a标签配合ID的锚点功能. 解决办法: <a href="javascript:void(0)" @click=&quo ...
- python第三十九课——面向对象(二)之初始化属性
设计Car类,初始化属性speed,提供一个run函数 import time class Car: def __init__(self,speed): self.speed=speed #将Road ...