利用Cydia Substrate进行Android HOOK (1)
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的代码可以改成:
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 });
短信监控实例
在下面的例子中我们实现了短信监听功能,将短信发送人、接收人以及短信内容打印出来:
1 import java.lang.reflect.Method; 2 import android.app.PendingIntent; 3 import android.util.Log; 4 import com.saurik.substrate.MS; 5 6 7 public class Main { 8 9 static void initialize() { 10 11 MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() { 12 13 14 @Override 15 16 public void classLoaded(Class<?> SmsManager) { 17 18 //code to modify the class when loaded 19 20 Method sendTextMessage; 21 22 try { 23 24 sendTextMessage = SmsManager.getMethod("sendTextMessage", 25 26 new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class}); 27 28 29 } catch (NoSuchMethodException e) { 30 31 sendTextMessage = null; 32 33 } 34 35 MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() { 36 37 public Object invoked(Object _this,Object... _args) throws Throwable{ 38 39 Log.i("SMSHOOK","SEND_SMS"); 40 41 Log.i("SMSHOOK","destination:"+_args[0]); 42 43 Log.i("SMSHOOK","source:"+_args[1]); 44 45 Log.i("SMSHOOK","text:"+_args[2]); 46 47 return invoke(_this, _args); 48 49 } 50 51 }); 52 53 54 } 55 56 }); 57 58 } 59 60 }
运行后的结果为:
原文地址: http://www.cnblogs.com/goodhacker/p/4014617.html
利用Cydia Substrate进行Android HOOK (1)相关推荐
- 利用Cydia Substrate进行Android HOOK(2)
在前面关于Substrate的介绍中我们已经讲了用Substrate hook java代码,现在我们讲下怎么用它hook native代码.hook native代码我们需要编写Substrate ...
- 利用Cydia Substrate进行Android HOOK(二)
在前面关于Substrate的介绍中我们已经讲了用Substrate hook java代码,现在我们讲下怎么用它hook native代码.hook native代码我们需要编写Substrate ...
- android cydia使用教程,Android Hook工具Cydia Substrate使用
Hook简介: Hook就是钩子,在安卓中,就是在事件传送到终点前截获并监控事件的传输,像个钩子勾上事件一样,并且能够在勾上事件时,处理一些自己特定的事件. Cydia Substrate的官网定义: ...
- cydia java_使用Cydia Substrate 从Native Hook Android Java世界
手机端配置见之前文章. 一.建立工程 建立一个Android工程.不需要创建默认的Activity.修改AndroidManifest.xml如下: uses-permission必须添加.这告诉Cy ...
- Android Hook 简介
1.Hook基本概述 Hook翻译过来是钩子的意思,我们都知道无论是手机还是电脑运行的时候都依赖系统各种各样的API,当某些API不能满足我们的要求时,我们就得去修改某些api,使之能满足我们的要求. ...
- Android Hook技术防范漫谈
背景 当下,数据就像水.电.空气一样无处不在,说它是"21世纪的生产资料"一点都不夸张,由此带来的是,各行业对于数据的争夺热火朝天.随着互联网和数据的思维深入人心,一些灰色产业悄然 ...
- Android逆向之旅—Hook神器Cydia Substrate使用详解
一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...
- 使用Cydia Substrate Hook Android Java世界
从来没接触过Android的HOOK,在看雪上找到了一篇HOOK 的文章,但是太复杂了,应该是本地环境问题,测试不成功. 后来搜到Cydia Substrate,看了几篇文章,进入官网查看了一下文档, ...
- Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解
一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...
最新文章
- SAP PM 初级系列22 - IW38可以批量处理维修工单
- java-静态变量,单例模式
- linux服务器都有注册表吗,NT服务器的注册表结构介绍
- ubuntu20上安装starUML3
- 女生做产品经理好吗_请做产品经理,别做功能经理
- solaris 命令
- 牛客挑战赛48C-铬合金之声【Prufer序列】
- 声明对象 创建对象_流利的对象创建
- 使用selenium进行密码破解(绕过账号密码JS加密)
- python是个什么东西刷爆朋友圈_几十行代码让你知道朋友圈都是什么样的朋友
- 教你写一个弹幕库,确定不了解一下?
- Elasticsearch——》es近义词(同义词)配置
- 关于在Google Earth中动态加载地标问题
- git tracked branch
- 股票量化分析工具QTYX使用攻略——RPS指标选取强势股(更新2.6.3)
- 我国有较大的AI大模型应用市场,在应用领域具有优势
- Redis配置文件redis-conf详解
- 整流器的输入滤波电容的选择
- 使用SciTE4AHK编辑本脚本【ahk】
- Soso(嗖嗖)移动 java 项目
热门文章
- SQL基础---SQL ORDER BY 子句
- (转载)计算机视觉、图像处理中常见的滤波操作
- Matlab中newff函数使用方法和搭建BP神经网络的方法
- 【Paper】Origin绘制误差棒图(标准差围绕均值)
- [云炬创业基础笔记]第一章创业环境测试3
- 力荐 | 吴恩达《序列模型》精炼笔记(1)-- 循环神经网络(RNN)
- 定义咯一个枚举变量枚举变量怎么打印出来 linux c,以C语言的字符串形式输出枚举变量...
- php保存成乱序,PHP实现断点续传乱序合并文件的方法
- Redis介绍及常用应用场景介绍
- Matconvnet安装:win7+VS2015(pro)+Matlab 2017a+cuda8.0+cudnn 5.1