Cydia substrate Hook 和模拟器安装

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 吧

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.   
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. adb shell  
  2. #mount -o remount,rw /dev/block/mtdblock0 /system  
  3. adb push su /system/bin/  
  4. #chmod 4755 /system/bin/su  
  5. #exit  
  6. adb install super.apk  
  7. adb install busybox.apk   
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.   

各种安装好后,在adb shell中执行 su grep等扩展命令成功后,证明我们完成了相应的工作,但这时候别急,如果关掉模拟器的话,是不会写到对应system.img里的,当我们下次重新启动模拟器的时候,一切又回到的原点,所以我们还需要如下操作:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. adb shell  
  2. #mkdir /filesname  
  3. #exit  
  4. adb push mkfs.yaffs2.arm /filesname  
  5. adb shell  
  6. #cd /filesname  
  7. #./mkfs.yaffs2.arm /system /filesname/my_system.img  
  8. #exit  
  9. adb pull /filesname/my_system.img   


接着将该my_system.img替换  $ANDROID_SDK/sdk/system-images/android-xx 下的system.img即可


2.应用设置

安装好com.saurik.substrate.apk之后


3.模块开发

首先得先下载Cydiasubstrate SDK,打开AndroidSDK Manager -> tools -> add on site 



不一会就下好了,之后可以开始进行开发,创建一个新工程吧,完成的功能是对系统发送的短信进行监听,首先将如下关键字加入到AndroidManifestxml中:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>  
  2. <uses-permission android:name="cydia.permission.SUBSTRATE"/>  

AndroidManifestxml如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.rois.hookdroid"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="15" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.           
  17.         <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>  
  18.           
  19.         <activity  
  20.             android:name="com.rois.hookdroid.CydiaTest"  
  21.             android:label="@string/app_name" >  
  22.             <intent-filter>  
  23.                 <action android:name="android.intent.action.MAIN" />  
  24.   
  25.                 <category android:name="android.intent.category.LAUNCHER" />  
  26.             </intent-filter>  
  27.         </activity>  
  28.     </application>  
  29.       
  30.     <uses-permission android:name="cydia.permission.SUBSTRATE"/>  
  31.   
  32. </manifest>  

我新建的项目src目录如下:



Main是必须包含的,完成一些必要的初始化工作,有initialize函数负责,MS.hookClassLoad的功能在于:当xxxx类要被加载的时候,使用我们自己构造的ClassLoader,我这里是要hook android.telephony.SmsManager类实现对对短信的监听,Main如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.rois.hookdroid;  
  2.   
  3. import com.rois.core.SmsHookClassLoader;  
  4. import com.saurik.substrate.MS;  
  5.   
  6.   
  7.   
  8. public class Main {  
  9.     static void initialize(){  
  10.         MS.hookClassLoad("android.telephony.SmsManager", SmsHookClassLoader.getInstance());  
  11.     }  
  12. }  

当然这里我把对应的ClassLoader继续了一次封装,因为要是对多个类进行hook,代码也实现在同一个文件我会有强迫症,看官网的教程更加简洁,SmsHookClassLoader如

下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.rois.core;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import android.app.PendingIntent;  
  5. import android.util.Log;  
  6. import com.rois.utils.Config;  
  7. import com.saurik.substrate.MS;  
  8.   
  9. public class SmsHookClassLoader implements MS.ClassLoadHook{  
  10.       
  11.     private static SmsHookClassLoader smsHookClassLoader;  
  12.       
  13.     public SmsHookClassLoader() {  
  14.         super();  
  15.     }  
  16.       
  17.     public static SmsHookClassLoader getInstance(){  
  18.         if (smsHookClassLoader == null) {  
  19.             smsHookClassLoader = new SmsHookClassLoader();  
  20.         }  
  21.         return smsHookClassLoader;  
  22.     }  
  23.       
  24.     @SuppressWarnings({ "unchecked""rawtypes" })  
  25.     public void classLoaded(Class<?> SmsManager) {  
  26.         //code to modify the class when loaded  
  27.         Method sendTextMessage;  
  28.         try {  
  29.             sendTextMessage = SmsManager.getMethod("sendTextMessage",   
  30.                     new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});  
  31.               
  32.         } catch (NoSuchMethodException e) {  
  33.             sendTextMessage = null;  
  34.         }  
  35.         MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() {  
  36.             public Object invoked(Object _this,Object... _args) throws Throwable{  
  37.                 Log.i(Config.TAG,"SEND_SMS");  
  38.                 Log.i(Config.TAG,"destination:"+_args[0]);  
  39.                 Log.i(Config.TAG,"source:"+_args[1]);  
  40.                 Log.i(Config.TAG,"text:"+_args[2]);  
  41.                 return invoke(_this, _args);  
  42.             }  
  43.         });  
  44.           
  45.     }  
  46.   
  47. }  

主要是我们需要实现:

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函数,也希望了解的人给我一个答案。折腾了一天,虽然实现了功能,没有学到任何东西,除非分析它的工作原理,那么还是洗洗睡吧


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值