利用Cydia Substrate进行Android HOOK
Cydia Substrate是一个代码修改平台。它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的。而Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具。
官网地址: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
Substrate几个重要API介绍
MS.hookClassLoad
函数原型:void hookClassLoad(String name, MS.ClassLoadHook hook);
该方法实现在指定的类被加载的时候发出通知。因为一个类可以在任何时候被加载,所以Substrate提供了一个方法用来检测用户感兴趣的类何时被加载。
|
参数 |
描述 |
|
name |
包名+类名,使用java的.符号 |
|
hook |
MS.ClassLoadHook的一个实例,当这个类被加载的时候,它的 classLoaded 方法会被执行。 |
MS.hookMethod
该API允许开发者提供一个回调函数替换原来的方法,这个回调函数是一个实现了MS.MethodHook接口的对象,是一个典型的匿名内部类。它包含一个invoked函数。
函数原型:
void hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);
void hookMethod(Class _class, Member member, MS.MethodAlteration alteration);
参数描述
(一)
|
参数 |
描述 |
|
|
加载的目标类,为classLoaded传下来的类参数 |
|
|
通过反射得到的需要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测). |
|
|
|
(二)
|
参数 |
描述 |
|
|
加载的目标类,为classLoaded传下来的类参数 |
|
|
通过反射得到的需要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测). |
|
|
An instance of |
建议开发者使用第二种方式,这种方式使用起来简单并且很少出错,不需要一个单独的MS.MethodPointer类实例。
使用方法
下面以官网的一个实例来说明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为com.saurik.substrate.main,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>
步骤二:创建一个类,类名为Main。类中包含一个static方法initialize,当插件被加载的时候,该方法中的代码就会运行,完成一些必要的初始化工作。
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
}
});
}
}
步骤四:通过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);
}
}
安装运行,重启系统后发现很多字体颜色都变了。如下图所示:



示例中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;
}
});
短信监控实例
在下面的例子中我们实现了短信监听功能,将短信发送人、接收人以及短信内容打印出来:
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); } }); } }); } }
运行后的结果为:

利用Cydia Substrate进行Android HOOK的更多相关文章
- 利用Cydia Substrate进行Android HOOK(二)
在前面关于Substrate的介绍中我们已经讲了用Substrate hook java代码,现在我们讲下怎么用它hook native代码.hook native代码我们需要编写Substrate ...
- 使用Cydia Substrate 从Native Hook Android Native世界
同系列文章: 使用Cydia Substrate 从Native Hook Android Java世界 使用Cydia Substrate Hook Android Java世界 一.建立工程 手机 ...
- 使用Cydia Substrate 从Native Hook Android Java世界
这里介绍了如何使用Cydia Substrate Hook安卓Java世界.这篇文章介绍如何从Native中Hook 安卓Java世界. 手机端配置见之前文章. 一.建立工程 建立一个Android工 ...
- Android上玩玩Hook:Cydia Substrate实战
作者简介:周圣韬,百度高级Android开发工程师,博客地址:http://blog.csdn.net/yzzst 了解Hook 还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生,Ho ...
- Cydia Substrate based DexDumper's weakness
得益于Cydia Substrate框架,HOOK Native函数变得简单,也给脱壳带来方便. 像ijiami免费版,360,classes.dex被加密到so文件并运行时释放到内存,因此针对相关函 ...
- Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解
一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...
- Android HOOK工具Cydia Substrate使用详解
目录(?)[+] Substrate几个重要API介绍 MShookClassLoad MShookMethod 使用方法 短信监控实例 Cydia Substrate是一个代码修改平台.它可以修 ...
- 使用Cydia Substrate Hook Android Java世界
从来没接触过Android的HOOK,在看雪上找到了一篇HOOK 的文章,但是太复杂了,应该是本地环境问题,测试不成功. 后来搜到Cydia Substrate,看了几篇文章,进入官网查看了一下文档, ...
- Android Hook神器:XPosed入门与登陆劫持演示
前段时间写了一篇关于Cydia Substrate广告注入的文章,大家都直呼过瘾.但是,真正了解这一方面的同学应该知道,其实还有一个比Cydia Substrate更出名的工具:XPosed. 不是因 ...
随机推荐
- Java 接口和抽象类区别(写的很好,转了)
原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...
- 手把手在MyEclipse中搭建Hibernate开发环境
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53414303冷血之心的博客) 在MyEclipse中如何搭建Hib ...
- soapUI 再谈SoapUI接口测试--文件组织与接口“布局”管理
再谈SoapUI接口测试--文件组织与接口“布局”管理 by:授客 QQ:1033553122 SoapUI-Pro-x64-5.1.2_576025(含破解文件),软件下载地址: http://pa ...
- [Android] Activity间切换,传递数据
前面照着android系统的裁剪图片的功能自己写了一个相似的工具.功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具,并且获得裁剪后的图片呢? 其实这个也很简单了,就是inte ...
- [Android] 旋转照片/图片
今天比较闲(是任务做完了,不是偷懒),就多更新几篇,补一下之前做的东西. 原文地址请保留http://www.cnblogs.com/rossoneri/p/3995306.html 推荐阅读: An ...
- Appium环境搭建(MAC版)
一.环境搭建 (1)安装node.js brew install node (2)安装Xcode 测试iOS App需要.打开Finder,在Applications文件夹下,看是否有Xcode.ap ...
- windows下搭建Consul分布式系统和集群
随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式的服务,如何在分布式的系统中对这些服务做协调变成了一个很棘手的问题.我们在一个项目上注册了很多服务,在进行运维时,需要时 ...
- 单例模式实现 Volitile , interlocked
//单例模式: //1. 双检锁机制 Volatile.write() //2. 静态变量 //3. Interlocked.CompareExchange(ref single, temp, nul ...
- HTTP的cookie
HTTP cookies,通常又称作"cookies",已经存在了很长时间,但是仍旧没有被予以充分的理解.首要的问题是存在了诸多误区,认为cookies是后门程序或病毒,或压根不知 ...
- StringBuffer&StringBuilder类
0. 说明 1. 总体说明 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类. 和 String 类不同的是,StringBuffer 和 String ...