Cydia for Android

在Android设备上使用Cydia框架的前提条件

1、Android设备必须ROOT  
2、Android设备上需要安装substrate.apk  

编写Java层cydia插件的前提条件

1、搭建好Android开发环境
2、下载substrate-api.jar并导入到Android工程

1、在application节点下声明一个元数据,name字段设置成com.saurik.substrate.main,value字段设置为用于hook别人的api的类的全称(包括包名和类名)

1     <application android:label="@string/app_name">
2         <meta-data android:name="com.saurik.substrate.main" android:value=".Main" />
3     </application>

2、声明用于访问substrate.apk的用户权限。

1 <uses-permission android:name="cydia.permission.SUBSTRATE" />

3、创建一个类,创建一个静态无参无返回值的initialize函数

public static void initialize()

4、实现initialize函数,设置需要hook的类并在该类加载完成后对相应的API进行hook

 1       MS.hookClassLoad("com.example.usertest.MainActivity", new ClassLoadHook() {
 2
 3         @Override
 4         public void classLoaded(Class<?> arg0) {
 5             Method toast;
 6             try {
 7                 toast=arg0.getMethod("toast", String.class);
 8             } catch (NoSuchMethodException e) {
 9                 // TODO Auto-generated catch block
10                 e.printStackTrace();
11                 return ;
12             }
13             MS.hookMethod(arg0, toast, new MS.MethodAlteration() {
14
15                 @Override
16                 public Object invoked(Object arg0, Object... arg1)
17                         throws Throwable {
18
19                     invoke(arg0, "hook before");
20                     invoke(arg0, arg1);
21                     invoke(arg0, arg1);
22                     invoke(arg0, "hook end");
23                     return null;
24                 }
25             });
26         }
27     });
com.example.usertest.MainActivity是需要HOOK的类的包名+类名
ClassLoadHook回调接口用于在类加载完成后进行HOOK具体完成HOOK操作的步骤:1、利用Java反射技术获取需要HOOK的类的某个方法。2、调用MS.hookMethod方法对指定的类,方法和hook具体实现的接口进行hook。3、实现具体hook的接口,利用invoke方法调用指定类的指定方法,arg1参数数组是原始API的原始参数列表,比如这个toast方法,原始的参数是"toast start",arg1[0]就是"toast start"。MS.MethodAlteration接口是扩展于MS.MethodPointer类和MethodHook接口,就不用创建MethodPointer对象,使用它调用原始API,现在调用原始API的方法是直接调用invoke方法。官网文档建议使用MethodAlteration接口代替MethodPointer类+MethodHook接口,因为更容易使用,减少使用MethodPointer对象出现的错误。

5、需要HOOK的类源码
1     @Override
2     protected void onCreate(Bundle savedInstanceState) {
3         super.onCreate(savedInstanceState);
4         setContentView(R.layout.activity_main);
5         toast("toast start");
6     }
7     public void toast(String str){
8         Toast.makeText(this, str, Toast.LENGTH_LONG).show();
9     }

最后附上完整源码

cydia插件源码:

                                                  Main.java 1 package com.example.cydiaexample;
 2
 3 import java.lang.reflect.Field;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Type;
 6
 7 import android.util.Log;
 8 import android.widget.Toast;
 9
10 import com.saurik.substrate.MS;
11 import com.saurik.substrate.MS.ClassLoadHook;
12
13 //hook 方法
14
15 public class Main {
16
17    public static void initialize() {
18
19
20        //设置需要hook的类
21       MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {
22           public void classLoaded(Class<?> resources) {
23               // ... code to modify the class when loaded
24
25               //定义方法
26               Method getColor;
27
28               try {
29                   //hook的方法为获取颜色的方法
30                     getColor = resources.getMethod("getColor", Integer.TYPE);
31                 } catch (NoSuchMethodException e) {
32
33                     getColor = null;
34                 }
35
36                 if (getColor != null) {
37                     //新建一个MethodPointer对象,hookMethod方法中要使用
38                     final MS.MethodPointer old = new MS.MethodPointer();
39
40                     //开始hook方法,写入自己想改变的数据
41                     MS.hookMethod(resources, getColor, new MS.MethodHook<Object, Object>() {
42                         public Object invoked(Object resources, Object... args)
43                             throws Throwable
44                         {
45
46                             int color = (Integer) old.invoke(resources, args);
47
48                             //返回颜色
49 //                            return color & ~0x0000ff00 | 0x00ff0000;
50                             return color;
51                         }
52                     }, old);
53
54                 }
55           }
56       });
57
58
59       MS.hookClassLoad("com.example.usertest.MainActivity", new ClassLoadHook() {
60
61         @Override
62         public void classLoaded(Class<?> arg0) {
63             Method toast;
64             try {
65                 toast=arg0.getMethod("toast", String.class);
66             } catch (NoSuchMethodException e) {
67                 // TODO Auto-generated catch block
68                 e.printStackTrace();
69                 return ;
70             }
71             MS.hookMethod(arg0, toast, new MS.MethodAlteration() {
72
73                 @Override
74                 public Object invoked(Object arg0, Object... arg1)
75                         throws Throwable {
76
77                     invoke(arg0, "hook before");
78                     invoke(arg0, arg1);
79                     invoke(arg0, arg1);
80                     invoke(arg0, "hook end");
81
82                     return null;
83                 }
84             });
85         }
86     });
87
88    }
89 }
                                                     Manifest.xml1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest android:versionCode="1" android:versionName="1.0" package="com.example.cydiaexample"
3   xmlns:android="http://schemas.android.com/apk/res/android">
4     <application android:label="@string/app_name">
5         <meta-data android:name="com.saurik.substrate.main" android:value=".Main" />
6     </application>
7
8     <uses-permission android:name="cydia.permission.SUBSTRATE" />
9 </manifest>

需要HOOK端的源码:

                                                                                      MainActivity.java 1 package com.example.usertest;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.Menu;
 6 import android.view.MenuItem;
 7 import android.widget.TextView;
 8 import android.widget.Toast;
 9
10 public class MainActivity extends Activity {
11
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16         TextView mTextView=(TextView) findViewById(R.id.info);
17         mTextView.setText(android.os.Build.ID);
18         toast("toast start");
19     }
20     public void toast(String str){
21         Toast.makeText(this, str, Toast.LENGTH_LONG).show();
22     }
23     @Override
24     public boolean onCreateOptionsMenu(Menu menu) {
25         // Inflate the menu; this adds items to the action bar if it is present.
26         getMenuInflater().inflate(R.menu.main, menu);
27         return true;
28     }
29
30     @Override
31     public boolean onOptionsItemSelected(MenuItem item) {
32         // Handle action bar item clicks here. The action bar will
33         // automatically handle clicks on the Home/Up button, so long
34         // as you specify a parent activity in AndroidManifest.xml.
35         int id = item.getItemId();
36         if (id == R.id.action_settings) {
37             return true;
38         }
39         return super.onOptionsItemSelected(item);
40     }
41 }
时间: 2024-11-03 01:32:33

Cydia for Android的相关文章

利用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.cydiasu

使用cydia substrate 来进行android native hook

? cydia不仅可以hook java代码,同样可以hook native代码,下面举一个例子来进行android native hook 我是在网上找到的supermathhook这个项目,在他基础上修改的,本来是为了仓促应对阿里的ctf 这个项目位置: 这个项目是用来hook jni 代码的,而我是用来hook dvmDexFileOpenPartial这个函数的,所以必须使用 Mshookfunction这个函数,这个函数在libsubstrate.so中,自己去官网下载就可以了. 接下

Android.Hook框架Cydia篇

Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具. 官网地址:http://www.cydiasubstrate.com/ 官方教程:http://www.cydiasubstrate.com/id/38be592b-bda7-4dd2-b049-cec44ef7a73b SD

Android HOOK工具Cydia Substrate使用详解

目录(?)[+] Substrate几个重要API介绍 MShookClassLoad MShookMethod 使用方法 短信监控实例 Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具. 官网地址:http://www.cydiasubstrate.com/ Demo地址:h

Android上玩玩Hook:Cydia Substrate实战

作者简介:周圣韬,百度高级Android开发工程师,博客地址:http://blog.csdn.net/yzzst 了解Hook 还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生,Hook英文翻译过来就是“钩子”的意思,那我们在什么时候使用这个“钩子”呢? 我们知道,在Android操作系统中系统维护着自己的一套事件分发机制.应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步的向下执行.而“钩子”的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子勾上事件一

使用Cydia Substrate 从Native Hook Android Java世界

这里介绍了如何使用Cydia Substrate Hook安卓Java世界.这篇文章介绍如何从Native中Hook 安卓Java世界. 手机端配置见之前文章. 一.建立工程 建立一个Android工程.不需要创建默认的Activity.修改AndroidManifest.xml如下: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.cyd

(4.2.33)Android上玩玩Hook(1):Cydia Substrate初识

选自: Android上玩玩Hook? 跟着鬼哥学Android java hook (一) 摘要:Hook的出现为开发者希望通过一个程序改变其他程序的某些行为的想法开拓了解决道路,而作为一款基于Hook的代码修改框架,Cydia Substrate可以修改任何主进程的代码,本文作者以广告注入的实战详细介绍了Hook的过程. 了解Hook 还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生,Hook英文翻译过来就是"钩子"的意思,那我们在什么时候使用这个"钩子&

Cydia Substrate框架Android so hook分析

最近需要用到Android so hook,于是分析了一下比较流行的Cydia Substrate框架 CydiaSubstrate框架的核心函数是MSHOOKFunction,官方使用说明如下: 现在Android 默认编译出来的都是thumb指令集的,就分析一下这个模式下的HOOK吧. 在使用MSHOOKFunction HOOK前,先用IDA attach到进程先看下准备HOOK的函数,前面18个字节的二进制指令如下: 52ABF480 30 B5       PUSH          

使用Cydia Substrate实现Android Hook

使用Cydia Substrate来实现Android hook,文章来自于官方提供的教程. 1.安装Cydia Substrate框架apk,手机必须root. 2.代码编写: 在manifest文件中声明如下: <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" andr