目录(?)[-]

  1. 使用方法
  2. 短信监控实例

1、Cydia_Substrate 框架简介

Cydia Substrate是一个代码修改平台。它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的。而Xposed只支持 HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具。
其实 cydia_substrate 与xposed 的hook原理是一样的,二者都可以作为Java Hook的框架,看使用习惯了。下面简单介绍一下 cydia_substrate 的使用方法。
 

使用方法

下面以官网的一个实例来说明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

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android">
  2. <application>
  3. <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>
  4. </application>
  5. <uses-permission android:name="cydia.permission.SUBSTRATE"/>
  6. </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,当插件被加载的时候,该方法中的代码就会运行,完成一些必要的初始化工作。

  1. import com.saurik.substrate.MS;
  2. public class Main {
  3. static void initialize() {
  4. // ... code to run when extension is loaded
  5. }
  6. }
    import com.saurik.substrate.MS; 

    public class Main {
static void initialize() {
// ... code to run when extension is loaded
}
}

步骤四:为了实现HOOK,达到修改目标类中的代码的目的,我们需要得到目标类的一个实例,如示例中的resources。

  1. public class Main {
  2. static void initialize() {
  3. MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {
  4. public void classLoaded(Class<?> resources) {
  5. // ... code to modify the class when loaded
  6. }
  7. });
  8. }
  9. }
    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对象原始代码的调用和修改,将所有绿色修改成了紫罗兰色。

  1. public void classLoaded(Class<?> resources) {
  2. Method getColor;
  3. try {
  4. getColor = resources.getMethod("getColor", Integer.TYPE);
  5. } catch (NoSuchMethodException e) {
  6. getColor = null;
  7. }
  8. if (getColor != null) {
  9. final MS.MethodPointer old = new MS.MethodPointer();
  10. MS.hookMethod(resources, getColor, new MS.MethodHook() {
  11. public Object invoked(Object resources, Object... args)
  12. throws Throwable
  13. {
  14. int color = (Integer) old.invoke(resources, args);
  15. return color & ~0x0000ff00 | 0x00ff0000;
  16. }
  17. }, old);
  18. }
  19. }
    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的代码可以改成:

  1. MS.hookMethod(resources, getColor, new MS.MethodAlteration<Resources, Integer>() {
  2. public Integer invoked(Resources resources, Object... args)
  3. throws Throwable
  4. {
  5. int color = invoke(resources, args);
  6. return color & ~0x0000ff00 | 0x00ffee00;
  7. }
  8. });
    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、短信监控实例

在下面的例子中我们实现了短信监听功能,将短信发送人、接收人以及短信内容打印出来:

  1. <span style="font-size:12px;">import java.lang.reflect.Method;
  2. import android.app.PendingIntent;
  3. import android.util.Log;
  4. import com.saurik.substrate.MS;
  5. public class Main {
  6. static void initialize() {
  7. MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() {
  8. @Override
  9. public void classLoaded(Class<?> SmsManager) {
  10. //code to modify the class when loaded
  11. Method sendTextMessage;
  12. try {
  13. sendTextMessage = SmsManager.getMethod("sendTextMessage",
  14. new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});
  15. } catch (NoSuchMethodException e) {
  16. sendTextMessage = null;
  17. }
  18. MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() {
  19. public Object invoked(Object _this,Object... _args) throws Throwable{
  20. Log.i("SMSHOOK","SEND_SMS");
  21. Log.i("SMSHOOK","destination:"+_args[0]);
  22. Log.i("SMSHOOK","source:"+_args[1]);
  23. Log.i("SMSHOOK","text:"+_args[2]);
  24. return invoke(_this, _args);
  25. }
  26. });
  27. }
  28. });
  29. }
  30. }</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 详解的更多相关文章

  1. 【转】Android Hook框架Xposed详解

    1 Introduction 1.1  概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...

  2. Android Hook框架Xposed详解

    1 Introduction 1.1  概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...

  3. Android路由框架-ARouter详解

    文章大纲 一.页面路由基本介绍1.什么是页面路由2.为什么要使用页面路由二.页面路由框架ARouter介绍1.常用功能介绍2.常见应用场景三.源码下载四.参考文章   一.页面路由基本介绍 1.什么是 ...

  4. Android热门网络框架Volley详解[申明:来源于网络]

    Android热门网络框架Volley详解[申明:来源于网络] 地址:http://www.cnblogs.com/caobotao/p/5071658.html

  5. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  6. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

  7. 测试框架mochajs详解

    测试框架mochajs详解 章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建 ...

  8. Android开发之InstanceState详解(转)---利用其保存Activity状态

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  9. Android JNI作用及其详解

    Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 J ...

随机推荐

  1. web服务器安全笔记

    一.设置项目目录权限(centos ,apache为例) 1.chown -R root /var/www/html/project   (设置项目所属的用户) 2.chgrp  -R root /v ...

  2. Codeforces Round #365 (Div. 2) E - Mishka and Divisors(转化成01-背包)

    http://codeforces.com/contest/703/problem/E 题意: 给出n个数和一个k,计算出至少要多少个数相乘才是k的倍数. 思路:这道题目参考了杭电大神的代码http: ...

  3. QT 样式表实例

    目标:实现button的圆角效果及背景颜色,鼠标滑过颜色变亮,鼠标点击颜色变重. 总体思路首,先根据需要及样式规则新建.qss文件,然后在代码中将文件引用并应用样式. 具体过程如下: 1在项目当前目录 ...

  4. 安装 inotify-tools

    摘要 inotify-tools, 是一款google出的用于监控文件系统的软件. 一.软件下载地址官方站点地址:http://inotify-tools.sourceforge.net/仓库地址:h ...

  5. hand first python 选读(2)

    文件读取与异常 文件读取与判断 os模块是调用来处理文件的. 先从最原始的读取txt文件开始吧! 新建一个aaa.txt文档,键入如下英文名篇: Li Lei:"Hello,Han Meim ...

  6. JSON 参考文档

    1.JSON字符串转换为JSON对象 var obj = JSON.parse(str); 2.JSON对象转化为JSON字符串 var str = JSON.stringify(obj); 对此有一 ...

  7. 大小堆C++实现

    C++大小堆实现(仿函数) 具体代码如下 #pragma once #include<iostream> #include<vector> using namespace st ...

  8. 已经安装了node和npm,输入node -v 未找到命令

    昨天虚拟机上安装了nvm.node.npm,今天打开输入node -v,就显示未找到命令 输入nvm --version 发现还是有nvm版本的,不然都要以为刚配好的虚拟机又要重新安装... 再输入 ...

  9. 解决spring boot在RabbitMQ堆积消息情况下无法启动问题

    最近遇到一个问题,服务站点上线之前,先去新建需要的rabbitmq并绑定关系,此时 如果发送消息方运行, 那边会造成新建的q消息部分堆积得不到及时消费 那么问题来了? 在消息堆积情况下,服务站点无法启 ...

  10. qt5.2.1在linux下去除最大化和最小化按钮

    #include <QtGui/QGuiApplication> #include <QDebug> #include <QScreen> #include &qu ...