http://blog.csdn.net/xbalien29/article/details/22661479
https://github.com/zencodex/cydia-android-hook
http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1/
总的来说,要学习还是建议Xposed毕竟是开源,要快速部署我还是比较推荐Cydiasubstrate,毕竟开发简洁,也支持Native。这一篇文章主要介绍Cydiasubstrate modules 的Java开发。官方网站 http://www.cydiasubstrate.com/ 文档简单明了,也提供了下载地址,也有saurik 就Xposed区别的声明http://www.cydiasubstrate.com/id/34058d37-3198-414f-a696-73e97e0a80db/
编写模块之前我们需要一些部署工作:
1.root手机
由于不舍得拿自己的机子开刀,索性在模拟器上进行了部署我们需要下载一些必备的工具su busybox mkfs.yaffs2.arm下载好了上面必备的工具,我们就开始root 吧
- adb shell
- #mount -o remount,rw /dev/block/mtdblock0 /system
- adb push su /system/bin/
- #chmod 4755 /system/bin/su
- #exit
- adb install super.apk
- adb install busybox.apk
各种安装好后,在adb shell中执行 su grep等扩展命令成功后,证明我们完成了相应的工作,但这时候别急,如果关掉模拟器的话,是不会写到对应system.img里的,当我们下次重新启动模拟器的时候,一切又回到的原点,所以我们还需要如下操作:
- adb shell
- #mkdir /filesname
- #exit
- adb push mkfs.yaffs2.arm /filesname
- adb shell
- #cd /filesname
- #./mkfs.yaffs2.arm /system /filesname/my_system.img
- #exit
- adb pull /filesname/my_system.img
接着将该my_system.img替换 $ANDROID_SDK/sdk/system-images/android-xx 下的system.img即可
2.应用设置
3.模块开发
首先得先下载Cydiasubstrate SDK,打开AndroidSDK Manager -> tools -> add on site
不一会就下好了,之后可以开始进行开发,创建一个新工程吧,完成的功能是对系统发送的短信进行监听,首先将如下关键字加入到AndroidManifestxml中:
- <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>
- <uses-permission android:name="cydia.permission.SUBSTRATE"/>
AndroidManifestxml如下:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.rois.hookdroid"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="15" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>
- <activity
- android:name="com.rois.hookdroid.CydiaTest"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-permission android:name="cydia.permission.SUBSTRATE"/>
- </manifest>
我新建的项目src目录如下:
- package com.rois.hookdroid;
- import com.rois.core.SmsHookClassLoader;
- import com.saurik.substrate.MS;
- public class Main {
- static void initialize(){
- MS.hookClassLoad("android.telephony.SmsManager", SmsHookClassLoader.getInstance());
- }
- }
当然这里我把对应的ClassLoader继续了一次封装,因为要是对多个类进行hook,代码也实现在同一个文件我会有强迫症,看官网的教程更加简洁,SmsHookClassLoader如
下:
- package com.rois.core;
- import java.lang.reflect.Method;
- import android.app.PendingIntent;
- import android.util.Log;
- import com.rois.utils.Config;
- import com.saurik.substrate.MS;
- public class SmsHookClassLoader implements MS.ClassLoadHook{
- private static SmsHookClassLoader smsHookClassLoader;
- public SmsHookClassLoader() {
- super();
- }
- public static SmsHookClassLoader getInstance(){
- if (smsHookClassLoader == null) {
- smsHookClassLoader = new SmsHookClassLoader();
- }
- return smsHookClassLoader;
- }
- @SuppressWarnings({ "unchecked", "rawtypes" })
- 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(Config.TAG,"SEND_SMS");
- Log.i(Config.TAG,"destination:"+_args[0]);
- Log.i(Config.TAG,"source:"+_args[1]);
- Log.i(Config.TAG,"text:"+_args[2]);
- return invoke(_this, _args);
- }
- });
- }
- }
主要是我们需要实现:
1.MS.ClassLoadHook中的classLoaded(Class<?> xxxx)函数,其表示在android.telephony.SmsManager第一次被加载的时候,我们要执行的classLoaded的功能,这里我通过反射找到sendTextMessage函数。
2.利用void hookMethod(Class _class, Member member, MS.MethodAlteration alteration);对方法进行hook,第一个参数为classLoaded传下来的类参数,第二个参数为之前反射得到需要hook的方法,第三个参数为MS.MethodAlteration它完成了最后跳转的封装。
3.我们需要实现MS.MethodAlteration.invoked(Object _this, Object... args),在这个方法中完成我们的自定义功能,this表示类,args为该函数的参数,由于我们是监听短信发送,所以,仅仅打印log……
通过这个Application标签,我们知道这段代码被加载在了com.android.mms 我们的短信进程中进行
Cydiasubstrate很简洁,这样下来在hook几个方法动态分析的demo就搞定了,当然官网说支持native,我看了下demo感觉只是说可以通过native实现功能,好像不能hook native函数,也希望了解的人给我一个答案。折腾了一天,虽然实现了功能,没有学到任何东西,除非分析它的工作原理,那么还是洗洗睡吧