文章目录

  • Android Hook框架介绍
  • Cydia Substrate
    • 插件编写步骤
    • 实例:编写Cydia修改系统字体颜色
  • Xposed
    • 插件编写步骤
    • 实例:Hook获取手机序列号
    • 准备工作
    • 获取hook所需要的数据
    • 编写hook代码
    • 效果测试

Android Hook框架介绍

Android中比较经典的Hook框架有两个

  1. Cydia Substrate,闭源,从苹果开始到Android
  2. xposed,开源,从Android开始到苹果

Cydia Substrate

插件编写步骤

Cydia Substrate插件编写的一般步骤:

  1. 导入substrate-api.jar
  2. 设置权限和入口
  3. 新建一个类实现回调函数
  4. 使用MS.hookClassLoad用于HOOK加载类
  5. 使用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。基本步骤如下:

  1. 创建一个无Activity的工程
  2. 设置清单文件信息
  3. 导入Xposed jar包,并设置为privoder(complie only)
  4. 创建一个主类并实现Xposed中的接口
  5. 重新handleLoadPackage方法
  6. 建立xposed_init文件外部声明主类
  7. 在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需要知道下面几个数据

  1. 包名
  2. 类名
  3. 方法原型

首先来查看一下需要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框架入门相关推荐

  1. android hook红包接口,Xposed框架实现Android中的Hook

    Hook.jpg 前几天受高人指点意外发现了开启Android世界的新大陆,就是这个叫Hook(''钩子'')的东西.听起来很神奇,周末抽时间研究了一番,发现确实是一个值得去研究的技术. 什么是 Ho ...

  2. android 7.x 安装 Xposed 框架 full.xml.gz下载失败解决方法

    前言 设备:Pixel xl 系统:7.1.1 错误信息 下载 http://dl.xposed/info/repo/full.xml.gz 下载失败 connection reset 这个报错后面一 ...

  3. xposed android 5,还不能愉快玩耍 Android 5.1怎么安装Xposed框架

    Android 5.1发布到现在少说也有将近一月有余.Moto还有亲儿子系列也已经早就吃上了这个新的萝莉炮.当然爱搞机的同学自然已经发现,Xposed框架5.0版本已经不能支持最新的Android 5 ...

  4. android 游玩南昌 模块,模块玩起来:Android 7.X可用的Xposed框架卡刷包放出

    感谢IT之家网友ZeroSimple的线索投递 7月20日消息 自适用于Android 7.X的Xposed框架现身Github以来,ROM开发者以及喜欢折腾的安卓玩家纷纷尝试编译和使用,毕竟Andr ...

  5. 2022年Android官方模拟器安装Xposed教程+测试工具PatDroid安装教程

    碎碎念:截至笔者写此教程的2022.10.10,xposed官网貌似已经G了(?),网上有的教程已经过时,有的是针对奇怪的商用的Android模拟器的教程(以科研工作者的角度来说),在此环境下出一篇A ...

  6. 万物皆可 Hook,探究 Xposed 框架 Hook 原理

    作者 |俞家欢 低头需要勇气,抬头需要实力 引言 平时用着 Android 手机,喜欢折腾的同学或多或少都接触过 Xposed 框架,解锁.Root.刷包,一气呵成.本文将从原理和实践两部分带大家了解 ...

  7. Xposed框架的安装

    作者:snowdream Email:yanghui1986527#gmail.com Github: https://github.com/snowdream QQ 群: 529327615 原文地 ...

  8. android5.1 xposed卡刷包,Android5.0/5.1 Xposed框架正式版安装事前准备

    Xposed for Lollipop正式版在经历半年之久终于闪亮登场了.各位机友们苦等的Android 5.0/5.1系统于是乎也能在大多数模块兼容的情况下使用Xposed for Lollipop ...

  9. android 模拟器 xposd,xposed开发入门向之入门前准备工作 模拟器安装xposed框架

    本帖最后由 永恒陌 于 2019-12-20 15:15 编辑 2019-12-20: 这个模拟器的系统是自带root的.可以依葫芦画瓢在别的模拟器上装. ---------------------- ...

最新文章

  1. 1094 The Largest Generation
  2. SQLSERVER中修复状态为Suspect的数据库
  3. 数据分析:主成分分析(PCA)1
  4. order by 影响效率么_内存碎片对性能的潜在影响
  5. Java使用正则表达式抓取日期和访问量
  6. Oracle序列生成器
  7. 最大熵图像复原方法原理(附完整代码)
  8. 收下这10个终身学习资源号,Max你的工作效率
  9. linux三剑客之awk
  10. classcastexception异常_Java程序员必备:异常的十个关键知识点
  11. 性能优化之雅虎35条军规
  12. 紫薇在线排盘php源码,灵匣网紫微斗数在线排盘系统
  13. 光纤跳线接口_不同速率光模块与光纤跳线的连接使用方案
  14. 计算机开机显示器无显示器,电脑开机显示器显示无信号怎么办
  15. 视觉SLAM14讲笔记02:ch5针孔,双目相机模型
  16. java自习_java自习重点及自测
  17. python批量分析表格_老板让我从几百个Excel中查找数据,我用Python一分钟搞定!...
  18. 会话技巧---英文单词
  19. 戴尔联手九大云计算伙伴成立云联盟:通吃混合云
  20. Vue中使用纯CSS实现全屏网格加渐变色背景布局

热门文章

  1. nginx加密,访问接口认证
  2. GridView自动排序(原创)
  3. 速攻蓝牙NRF52832系列教程之方法篇(三)
  4. 官方文档翻译-ESP32-SPI Flash
  5. 算符“.*”和“-*”,用于“成员指针”
  6. 强化学习(三)—— 策略学习(Policy-Based)及策略梯度(Policy Gradient)
  7. Windows下的cmd小技巧
  8. R语言:rep函数解析
  9. Linux进程间通讯
  10. 区块链BaaS云服务(21)腾讯CCGP ”跨链协议 AMDP“