Android Hook 框架 Cydia_substrate 详解
1、Cydia_Substrate 框架简介
官网地址:http://www.cydiasubstrate.com/
Demo地址:https://github.com/zencodex/cydia-android-hook
官方教程:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1
SDK下载地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip
使用方法
下面以官网的一个实例来说明cydia substrate的使用方法。该实例是实现将多个接口组件颜色修改为紫罗兰色。
需要安装:http://www.cydiasubstrate.com/download/com.saurik.substrate.apk
步骤一:创建一个空的Android工程。由于创建的工程将以插件的形式被加载,所以不需要activity。将SDK中的substrate-api.jar复制到project/libs文件夹中。
步骤二:配置Manifest文件
(1)需要指定权限:cydia.permission.SUBSTRATE
(2)添加meta标签,name为cydia.permission.SUBSTRATE,value为下一步中创建的类名.Main
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
- <application>
- <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>
- </application>
- <uses-permission android:name="cydia.permission.SUBSTRATE"/>
- </manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>
</application>
<uses-permission android:name="cydia.permission.SUBSTRATE"/>
</manifest>
步骤三:创建一个类,类名为Main。类中包含一个static方法initialize,当插件被加载的时候,该方法中的代码就会运行,完成一些必要的初始化工作。
- import com.saurik.substrate.MS;
- public class Main {
- static void initialize() {
- // ... code to run when extension is loaded
- }
- }
import com.saurik.substrate.MS; public class Main {
static void initialize() {
// ... code to run when extension is loaded
}
}
步骤四:为了实现HOOK,达到修改目标类中的代码的目的,我们需要得到目标类的一个实例,如示例中的resources。
- public class Main {
- static void initialize() {
- MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {
- public void classLoaded(Class<?> resources) {
- // ... code to modify the class when loaded
- }
- });
- }
- }
public class Main {
static void initialize() {
MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {
public void classLoaded(Class<?> resources) {
// ... code to modify the class when loaded
}
});
}
}
步骤五:通过MS.MethodHook实例实现原代码的修改。
为了调用原来代码中的方法,我们需要创建一个MS.MethodPointer类的实例,它可以在任何时候运行原来的代码。
在这里我们通过对原代码中resources对象原始代码的调用和修改,将所有绿色修改成了紫罗兰色。
- public void classLoaded(Class<?> resources) {
- Method getColor;
- try {
- getColor = resources.getMethod("getColor", Integer.TYPE);
- } catch (NoSuchMethodException e) {
- getColor = null;
- }
- if (getColor != null) {
- final MS.MethodPointer old = new MS.MethodPointer();
- MS.hookMethod(resources, getColor, new MS.MethodHook() {
- public Object invoked(Object resources, Object... args)
- throws Throwable
- {
- int color = (Integer) old.invoke(resources, args);
- return color & ~0x0000ff00 | 0x00ff0000;
- }
- }, old);
- }
- }
public void classLoaded(Class<?> resources) {
Method getColor;
try {
getColor = resources.getMethod("getColor", Integer.TYPE);
} catch (NoSuchMethodException e) {
getColor = null;
} if (getColor != null) {
final MS.MethodPointer old = new MS.MethodPointer(); MS.hookMethod(resources, getColor, new MS.MethodHook() {
public Object invoked(Object resources, Object... args)
throws Throwable
{
int color = (Integer) old.invoke(resources, args);
return color & ~0x0000ff00 | 0x00ff0000;
}
}, old);
}
}
安装运行,重启系统后发现很多字体颜色都变了。
示例中MS.hookMethod的代码可以改成:
- MS.hookMethod(resources, getColor, new MS.MethodAlteration<Resources, Integer>() {
- public Integer invoked(Resources resources, Object... args)
- throws Throwable
- {
- int color = invoke(resources, args);
- return color & ~0x0000ff00 | 0x00ffee00;
- }
- });
MS.hookMethod(resources, getColor, new MS.MethodAlteration<Resources, Integer>() {
public Integer invoked(Resources resources, Object... args)
throws Throwable
{
int color = invoke(resources, args);
return color & ~0x0000ff00 | 0x00ffee00;
}
});
2、短信监控实例
在下面的例子中我们实现了短信监听功能,将短信发送人、接收人以及短信内容打印出来:
- <span style="font-size:12px;">import java.lang.reflect.Method;
- import android.app.PendingIntent;
- import android.util.Log;
- import com.saurik.substrate.MS;
- public class Main {
- static void initialize() {
- MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() {
- @Override
- public void classLoaded(Class<?> SmsManager) {
- //code to modify the class when loaded
- Method sendTextMessage;
- try {
- sendTextMessage = SmsManager.getMethod("sendTextMessage",
- new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});
- } catch (NoSuchMethodException e) {
- sendTextMessage = null;
- }
- MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() {
- public Object invoked(Object _this,Object... _args) throws Throwable{
- Log.i("SMSHOOK","SEND_SMS");
- Log.i("SMSHOOK","destination:"+_args[0]);
- Log.i("SMSHOOK","source:"+_args[1]);
- Log.i("SMSHOOK","text:"+_args[2]);
- return invoke(_this, _args);
- }
- });
- }
- });
- }
- }</span>
<span style="font-size:12px;">import java.lang.reflect.Method;
import android.app.PendingIntent;
import android.util.Log;
import com.saurik.substrate.MS;
public class Main {
static void initialize() {
MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() {
@Override
public void classLoaded(Class<?> SmsManager) {
//code to modify the class when loaded
Method sendTextMessage;
try {
sendTextMessage = SmsManager.getMethod("sendTextMessage",
new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});
} catch (NoSuchMethodException e) {
sendTextMessage = null;
}
MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() {
public Object invoked(Object _this,Object... _args) throws Throwable{
Log.i("SMSHOOK","SEND_SMS");
Log.i("SMSHOOK","destination:"+_args[0]);
Log.i("SMSHOOK","source:"+_args[1]);
Log.i("SMSHOOK","text:"+_args[2]);
return invoke(_this, _args);
}
});
}
});
}
}</span>
运行步骤
- ROOT过的手机一部,没有ROOT的,请自行搜索方法。
- Eclipse 上安装 Android Substrate SDK,参考:http://www.cydiasubstrate.com/id/73e45fe5-4525-4de7-ac14-6016652cc1b8/
- 手机端去下载安装 Cydia Substrate http://www.cydiasubstrate.com/download/com.saurik.substrate.apk
- 按照章节1上面的例程,编译本代码后安装到手机
- 手机上运行Substrate,界面上点击“Link Substrate Files”,再点击 “Restart System(Soft)”(这些都是Hook 步骤)
- 最后再编写一个Test.apk, 调用hook 后的class,检验hook 结果。
Android Hook 框架 Cydia_substrate 详解的更多相关文章
- 【转】Android Hook框架Xposed详解
1 Introduction 1.1 概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...
- Android Hook框架Xposed详解
1 Introduction 1.1 概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...
- Android路由框架-ARouter详解
文章大纲 一.页面路由基本介绍1.什么是页面路由2.为什么要使用页面路由二.页面路由框架ARouter介绍1.常用功能介绍2.常见应用场景三.源码下载四.参考文章 一.页面路由基本介绍 1.什么是 ...
- Android热门网络框架Volley详解[申明:来源于网络]
Android热门网络框架Volley详解[申明:来源于网络] 地址:http://www.cnblogs.com/caobotao/p/5071658.html
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Cordova 打包 Android release app 过程详解
Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...
- 测试框架mochajs详解
测试框架mochajs详解 章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建 ...
- Android开发之InstanceState详解(转)---利用其保存Activity状态
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android JNI作用及其详解
Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 J ...
随机推荐
- 【深入理解JVM】:Java对象的创建、内存布局、访问定位
对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...
- 数据可视化——matplotlib(2)
导入相关模块 import matplotlib.pyplot as plt import numpy as np import pandas as pd 图表设置 添加X.Y轴标签以及图标标题 a ...
- GDB操作基本命令
GDB操作基本命令 1 打开文件及退出操作 shell下输入 gdb filename : 打开单个文件 gdb filename -q: 打开单个文件,屏蔽掉GDB自带的说明信息 gdb下输入qui ...
- 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型
分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型 分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...
- 通用Mapper相关
1.通用Mapper中,用@Table来映数据表与实体,其中 name:指定表的名称,例如@Table(name="ls_post") catalog: 指定数据库名称,默认为当前 ...
- android面试准备一之Activity相关
1.Activity生命周期 1.1 Activity的4种状态 running/paused/stopped/killed running:当前Activity正处于运行状态,指的是当前Ac ...
- 简明 Nginx Location Url 配置笔记
基本配置 为了探究nginx的url配置规则,当然需要安装nginx.我使用了vagrant创建了一个虚拟环境的ubuntu,通过apt-get安装nginx.这样就不会污染mac的软件环境.通过vr ...
- SC用法
转自:(http://blog.163.com/yf_handsome/blog/static/20238174200802495124164/) SC使用这样的语法: 1. SC [Serverna ...
- 今天开始写些随笔,就从Jplayer开始吧
今天才开始用Jplayer,可能有点落伍了,但是看到网上千篇一律的使用说明,开始决定把自己的使用心得分享一下,废话不多说,开始吧. Step1: 官网上有具体的搭建顺序,URL:http://www. ...
- charles抓包unknow
如果能抓到包,可是解析不出请求,那一定是证书问题,注意以下几点: 1.设备安装证书,注意要抓包的每一个设备都要安装证书,每一个设备! 2.pc端也要安装证书 如果以上两点都做到一定可以解析https请 ...