|
|
51CTO旗下网站
|
|
移步端
  • Android HOOK工具Cydia Substrate采用详解

    Cydia Substrate是一番代码修改平台。他可以修改任何主进程的编码,甭管是用Java还是C/C++(native代码)编纂的。而Xposed只支持 HOOK app_process中的java函数,故此Cydia Substrate是一款强大而滥用的HOOK工具。

    笔者:swordsman 来源:cnblogs| 2014-10-13 10:15

    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);

    数描述

    (一)

    叙述

    _class

    加载的对象类,为classLoaded传播下去的类参数

    member

    穿过反射得到的要求hook的主意(或组织函数). 瞩目:决不能HOOK字段 (公社译的时节会进展监测).

    hook

    MS.MethodHook的一个实例,他包含的invoked办法会把调用,用于代替member中的代码

    (二)    

      

      
      

    叙述

      

    _class

    加载的对象类,为classLoaded传播下去的类参数

    member

    穿过反射得到的要求hook的主意(或组织函数). 瞩目:决不能HOOK字段 (公社译的时节会进展监测).

    alteration

    An instance of MS.MethodAlteration whose boxedinvoked method will be called instead of member. This instance will also be filled in using information from   the original implementation, allowing you to use invoke to call the original method implementation.

    提议开发者使用第二种方法,这种办法使用起来简单并且很少出错,不需要一个单独的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为cydia.permission.SUBSTRATE,value为从一地中创造的类名.Main

          
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
    2.     <application> 
    3.         <meta-data android:name="com.saurik.substrate.main" 
    4.             android:value=".Main"/> 
    5.     </application> 
    6.     <uses-permission android:name="cydia.permission.SUBSTRATE"/> 
    7. </manifest> 

    步骤二:创造一个类,类名为Main。类中包含一个static办法initialize,顶插件被加载的时节,该方法中的代码就会运行,形成一些必要的初始化工作。

          
    1. import com.saurik.substrate.MS; 
    2.   
    3. public class Main { 
    4.     static void initialize() {  
    5.         // ... code to run when extension is loaded 
    6.     } 

    步骤三:为了贯彻HOOK,到达修改目标类中的代码的目的,咱们需要得到目标类的一个实例,如示例中的resources。

          
    1. public class Main { 
    2.     static void initialize() { 
    3.         MS.hookClassLoad("android.content.res.Resources"new MS.ClassLoadHook() { 
    4.             public void classLoaded(Class<?> resources) { 
    5.                 // ... code to modify the class when loaded 
    6.             } 
    7.         }); 
    8.     } 

    步骤四:穿过MS.MethodHook老实现原代码的修改。

    为了调用原来代码中的方法,咱们需要创造一个MS.MethodPointer类的范例,他可以在其他时候运行原来的编码。

    在此间我们通过对原代码中resources目标原始代码的实用和修改,名将全部绿色修改成了金合欢花色。

          
    1. public void classLoaded(Class<?> resources) { 
    2. Method getColor;  
    3. try { 
    4.         getColor = resources.getMethod("getColor", Integer.TYPE); 
    5.     } catch (NoSuchMethodException e) { 
    6.         getColor = null
    7.     } 
    8.   
    9.     if (getColor != null) { 
    10.         final MS.MethodPointer old = new MS.MethodPointer(); 
    11.   
    12.         MS.hookMethod(resources, getColor, new MS.MethodHook() { 
    13.             public Object invoked(Object resources, Object... args) 
    14.                 throws Throwable 
    15.             { 
    16.                 int color = (Integer) old.invoke(resources, args); 
    17.                 return color & ~0x0000ff00 | 0x00ff0000
    18.             } 
    19.         }, old); 
    20.     } 

    安装运行,重启系统今后发现很多字体颜色都变了。如下图所示:

                   

    示例中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. 1 import java.lang.reflect.Method; 
    2.  2 import android.app.PendingIntent; 
    3.  3 import android.util.Log; 
    4.  4 import com.saurik.substrate.MS; 
    5.  5   
    6.  6  
    7.  7 public class Main { 
    8.  8  
    9.  9     static void initialize() {   
    10. 10  
    11. 11     MS.hookClassLoad("android.telephony.SmsManager"new MS.ClassLoadHook() { 
    12. 12             
    13. 13  
    14. 14             @Override 
    15. 15  
    16. 16             public void classLoaded(Class<?> SmsManager) { 
    17. 17  
    18. 18                 //code to modify the class when loaded 
    19. 19  
    20. 20             Method sendTextMessage; 
    21. 21  
    22. 22             try { 
    23. 23  
    24. 24                     sendTextMessage = SmsManager.getMethod("sendTextMessage"
    25. 25  
    26. 26                             new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class}); 
    27. 27                     
    28. 28  
    29. 29                 } catch (NoSuchMethodException e) { 
    30. 30  
    31. 31                     sendTextMessage = null
    32. 32  
    33. 33                 } 
    34. 34  
    35. 35              MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() { 
    36. 36  
    37. 37                  public Object invoked(Object _this,Object... _args) throws Throwable{ 
    38. 38  
    39. 39                      Log.i("SMSHOOK","SEND_SMS"); 
    40. 40  
    41. 41                      Log.i("SMSHOOK","destination:"+_args[0]); 
    42. 42  
    43. 43                      Log.i("SMSHOOK","source:"+_args[1]); 
    44. 44  
    45. 45                      Log.i("SMSHOOK","text:"+_args[2]); 
    46. 46  
    47. 47                         return invoke(_this, _args); 
    48. 48  
    49. 49                     } 
    50. 50  
    51. 51             }); 
    52. 52             
    53. 53  
    54. 54             } 
    55. 55  
    56. 56         }); 
    57. 57  
    58. 58     } 
    59. 59  
    60. 60 } 

    运作后的结果为:

    【义务编辑: 闫佳明 TEL:(010)68476606】

    点赞 0
  • Android HOOK  Cydia Substrate
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    活学活用 Ubuntu Server

    活学活用 Ubuntu Server

    实战直通车
    共35章 | UbuntuServer

    226人口订阅学习

    Java EE速成指南

    Java EE速成指南

    控制Java基本
    共30章 | 51CTO王波

    87人口订阅学习

    Mysql DBA修炼之路

    Mysql DBA修炼之路

    MySQL入夜到高阶
    共24章 | 51CTO叶先生

    483人口订阅学习

    读 书 +更多

    Groovy入夜经典

    该书详细介绍脚本语言Groovy,第一介绍Groovy语言的中心特点,包括讨论Groovy办法、先后闭包、列表、照耀以及对类和持续的支持,下一场介绍如...

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO播客


  •