014 Android之Cydia与Xposed框架入门
文章目录
- Android Hook框架介绍
- Cydia Substrate
- 插件编写步骤
- 实例:编写Cydia修改系统字体颜色
- Xposed
- 插件编写步骤
- 实例:Hook获取手机序列号
- 准备工作
- 获取hook所需要的数据
- 编写hook代码
- 效果测试
Android Hook框架介绍
Android中比较经典的Hook框架有两个
- Cydia Substrate,闭源,从苹果开始到Android
- xposed,开源,从Android开始到苹果
Cydia Substrate
插件编写步骤
Cydia Substrate插件编写的一般步骤:
- 导入substrate-api.jar
- 设置权限和入口
- 新建一个类实现回调函数
- 使用MS.hookClassLoad用于HOOK加载类
- 使用MS.hookMethod用于HOOK方法
实例:编写Cydia修改系统字体颜色
首先新建一个空的项目
将substrate-api.jar复制到libs目录下,jar下载地址如下:
http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip
接着右键打开模块设置
将jar包导入到模块依赖库
接着在清单文件中添加一个自定义的权限
<uses-permission android:name="cydia.permission.SUBSTRATE"></uses-permission>
添加一个meta-data标签,并指定入口类
<meta-data name="com.saurik.substrate.main" android:value=".Main"></meta-data>
然后新建一个入口类,命名为Main
package com.example.cydiademo;import android.content.res.Resources;
import android.util.Log;import com.saurik.substrate.MS;import java.lang.reflect.Method;public class Main {static void initialize() {//1.hook指定的类-->android.content.res.ResourcesMS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {@Overridepublic void classLoaded(Class<?> aClass) {//2.1 获取老的方法对象Method method=null;try {method=aClass.getMethod("getColor",int.class);} catch (NoSuchMethodException e) {e.printStackTrace();}if (method==null){Log.d("GuiShou","method==null");return;}//2.hook指定的方法-->getColor//老的方法的指针final MS.MethodPointer methodPointer=new MS.MethodPointer();MS.hookMethod(aClass, method, new MS.MethodHook() {@Overridepublic Object invoked(Object o, Object... objects) throws Throwable {//hook代码//调用老的方法,获取colorint color= (int) methodPointer.invoke(o,objects);//修改color并返回return color&~0x0000ff00|0x00ff0000;}},methodPointer);}});}
}
接着实现initialize方法,修改系统字体颜色。到此插件编写完成,这个hook框架需要运行在真机环境下,所以暂时看不到效果。
Xposed
插件编写步骤
Xposed是一个开源的Hook框架,可定制性强;其提供了SDK可以写插件,轻松完成hook。基本步骤如下:
- 创建一个无Activity的工程
- 设置清单文件信息
- 导入Xposed jar包,并设置为privoder(complie only)
- 创建一个主类并实现Xposed中的接口
- 重新handleLoadPackage方法
- 建立xposed_init文件外部声明主类
- 在handleLoadPackage中完善Hook代码
实例:Hook获取手机序列号
需要HOOK的目标程序如下:
app运行之后,会显示当前的设备ID
准备工作
新建一个工程,将XposedBridge-82.jar复制到新建的lib目录下
打开模块设置,将jar包导入到模块,并设置Configuration为compileOnly
<meta-data android:name="xposedmodule" android:value="true"></meta-data>
<meta-data android:name="xposeddescription" android:value="XX神器"></meta-data>
<meta-data android:name="xposedminversion" android:value="54"></meta-data>
在清单文件中添加上面的字段
接着新建一个类,命名为Main
public class Main implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {}
}
并实现IXposedHookLoadPackage接口,然后在handleLoadPackage函数内编写Hook代码
接着指定入口类,新建assets/xposed_init文件,然后将入口类写到该文件内。准备工作就已经完成,接着开始编写hook代码。
获取hook所需要的数据
需要对app进行hook需要知道下面几个数据
- 包名
- 类名
- 方法原型
首先来查看一下需要HOOK的目标app代码
显示设备ID的代码在onCreate方法中
public void onCreate(Bundle savedInstanceState) {IncrementalChange incrementalChange = $change;if (incrementalChange != null) {incrementalChange.access$dispatch("onCreate.(Landroid/os/Bundle;)V", this, savedInstanceState);return;}super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);((TextView) findViewById(R.id.textinfo)).setText("设备ID: " + ((TelephonyManager) getSystemService("phone")).getDeviceId());}
需要Hook的类名是TelephonyManager
,方法名是getDeviceId
接着Android Studio的自动导入功能可以看到完整的类名是
android.telephony.TelephonyManager
然后进入类内搜索方法名,即可获取到完整的方法原型
public String getDeviceId()
然后查看清单文件
在清单文件中可以查看到包名为com.bluelesson.testphoneinfo
编写hook代码
接着编写hook代码如下:
public class Main implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {//包名 com.bluelesson.testphoneinfo//类名 android.telephony.TelephonyManager//方法名 public String getDeviceId()String packageName=Param.packageName;if (!packageName.equals("com.bluelesson.testphoneinfo"))return;XposedHelpers.findAndHookMethod(TelephonyManager.class,//类类型"getDeviceId",//方法名new XC_MethodReplacement() { //回调@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {return "我就是序列号";}});}
}
替换getDeviceId函数,直接返回序列号
效果测试
在模拟器中安卓xposed框架
第一次进入需要安装更新以激活框架
然后直接安卓app到模拟器,提示Xposed模块未激活
勾选当前模块
返回到Xposed插件主页,点击软重启
打开目标app,可以看到当前的设备ID已经被修改了
014 Android之Cydia与Xposed框架入门相关推荐
- android hook红包接口,Xposed框架实现Android中的Hook
Hook.jpg 前几天受高人指点意外发现了开启Android世界的新大陆,就是这个叫Hook(''钩子'')的东西.听起来很神奇,周末抽时间研究了一番,发现确实是一个值得去研究的技术. 什么是 Ho ...
- android 7.x 安装 Xposed 框架 full.xml.gz下载失败解决方法
前言 设备:Pixel xl 系统:7.1.1 错误信息 下载 http://dl.xposed/info/repo/full.xml.gz 下载失败 connection reset 这个报错后面一 ...
- xposed android 5,还不能愉快玩耍 Android 5.1怎么安装Xposed框架
Android 5.1发布到现在少说也有将近一月有余.Moto还有亲儿子系列也已经早就吃上了这个新的萝莉炮.当然爱搞机的同学自然已经发现,Xposed框架5.0版本已经不能支持最新的Android 5 ...
- android 游玩南昌 模块,模块玩起来:Android 7.X可用的Xposed框架卡刷包放出
感谢IT之家网友ZeroSimple的线索投递 7月20日消息 自适用于Android 7.X的Xposed框架现身Github以来,ROM开发者以及喜欢折腾的安卓玩家纷纷尝试编译和使用,毕竟Andr ...
- 2022年Android官方模拟器安装Xposed教程+测试工具PatDroid安装教程
碎碎念:截至笔者写此教程的2022.10.10,xposed官网貌似已经G了(?),网上有的教程已经过时,有的是针对奇怪的商用的Android模拟器的教程(以科研工作者的角度来说),在此环境下出一篇A ...
- 万物皆可 Hook,探究 Xposed 框架 Hook 原理
作者 |俞家欢 低头需要勇气,抬头需要实力 引言 平时用着 Android 手机,喜欢折腾的同学或多或少都接触过 Xposed 框架,解锁.Root.刷包,一气呵成.本文将从原理和实践两部分带大家了解 ...
- Xposed框架的安装
作者:snowdream Email:yanghui1986527#gmail.com Github: https://github.com/snowdream QQ 群: 529327615 原文地 ...
- android5.1 xposed卡刷包,Android5.0/5.1 Xposed框架正式版安装事前准备
Xposed for Lollipop正式版在经历半年之久终于闪亮登场了.各位机友们苦等的Android 5.0/5.1系统于是乎也能在大多数模块兼容的情况下使用Xposed for Lollipop ...
- android 模拟器 xposd,xposed开发入门向之入门前准备工作 模拟器安装xposed框架
本帖最后由 永恒陌 于 2019-12-20 15:15 编辑 2019-12-20: 这个模拟器的系统是自带root的.可以依葫芦画瓢在别的模拟器上装. ---------------------- ...
最新文章
- 1094 The Largest Generation
- SQLSERVER中修复状态为Suspect的数据库
- 数据分析:主成分分析(PCA)1
- order by 影响效率么_内存碎片对性能的潜在影响
- Java使用正则表达式抓取日期和访问量
- Oracle序列生成器
- 最大熵图像复原方法原理(附完整代码)
- 收下这10个终身学习资源号,Max你的工作效率
- linux三剑客之awk
- classcastexception异常_Java程序员必备:异常的十个关键知识点
- 性能优化之雅虎35条军规
- 紫薇在线排盘php源码,灵匣网紫微斗数在线排盘系统
- 光纤跳线接口_不同速率光模块与光纤跳线的连接使用方案
- 计算机开机显示器无显示器,电脑开机显示器显示无信号怎么办
- 视觉SLAM14讲笔记02:ch5针孔,双目相机模型
- java自习_java自习重点及自测
- python批量分析表格_老板让我从几百个Excel中查找数据,我用Python一分钟搞定!...
- 会话技巧---英文单词
- 戴尔联手九大云计算伙伴成立云联盟:通吃混合云
- Vue中使用纯CSS实现全屏网格加渐变色背景布局
热门文章
- nginx加密,访问接口认证
- GridView自动排序(原创)
- 速攻蓝牙NRF52832系列教程之方法篇(三)
- 官方文档翻译-ESP32-SPI Flash
- 算符“.*”和“-*”,用于“成员指针”
- 强化学习(三)—— 策略学习(Policy-Based)及策略梯度(Policy Gradient)
- Windows下的cmd小技巧
- R语言:rep函数解析
- Linux进程间通讯
- 区块链BaaS云服务(21)腾讯CCGP ”跨链协议 AMDP“