成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android HOOK工具Cydia Substrate使用詳解

移動開發 Android
Cydia Substrate是一個代碼修改平臺。它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。而Xposed只支持 HOOK app_process中的java函數,因此Cydia Substrate是一款強大而實用的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.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 } 

運行后的結果為:

 

責任編輯:閆佳明 來源: cnblogs
相關推薦

2024-07-16 09:51:39

HTMLHookReact

2023-12-25 08:25:42

AndroidHook應用程序

2019-02-23 13:53:55

起獲蘋果iOS

2018-02-07 15:25:41

2011-07-06 17:48:30

iPhone Xcode 模擬器

2010-05-19 10:22:07

2010-01-28 10:31:32

Android使用SD

2010-02-03 15:59:08

Android組件

2011-04-06 15:51:32

DelphiHOOK

2017-03-06 14:44:49

Androidhook技術

2009-07-08 17:33:46

JDK5.0內置工具

2020-11-11 10:25:51

Linuxss命令

2019-11-01 08:49:07

JVM監控性能

2011-08-15 22:10:08

Oracle性能分析工

2017-02-17 11:50:18

AndroidBitmap緩存池

2011-09-13 17:03:16

Eclipse And

2013-07-10 15:52:17

fragmentAndroid

2017-11-01 07:57:08

Python

2017-06-12 18:48:00

Android性能分析工具

2013-07-17 15:39:39

Github詳解
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久综合伊人一区二区三 | 午夜电影网站 | 中文字幕一区在线观看视频 | 精品一区二区三区在线观看 | 精品欧美乱码久久久久久1区2区 | 亚洲精品在线视频 | 中文字幕一区二区三区日韩精品 | 国产精品国产a级 | 色网在线看 | 国产福利小视频 | 亚洲精品久久久 | 中文字幕av在线一二三区 | 精品国产精品一区二区夜夜嗨 | 玖玖视频国产 | 亚洲成在线观看 | 亚洲国产精品一区二区久久 | 亚洲欧美一区二区三区国产精品 | 亚洲视频欧美视频 | 日韩欧美日韩在线 | 精品av久久久久电影 | 久久久久9999 | 国产一区二区日韩 | 中文字幕在线第一页 | 国产精品爱久久久久久久 | 自拍偷拍中文字幕 | 人人做人人澡人人爽欧美 | 在线视频一区二区 | 国内精品伊人久久久久网站 | 夜夜操av| 中文字幕不卡在线88 | 天天操 天天操 | 欧美性网 | 国外成人免费视频 | 久久伊人精品一区二区三区 | 欧美在线亚洲 | 国产精品一区视频 | 国产成人精品一区二 | 8x国产精品视频一区二区 | 久久伊人精品 | 国内精品久久影院 | 成人无遮挡毛片免费看 |