Substrate¼¸¸öÖØÒªAPI½éÉÜ
MS.hookClassLoad
º¯ÊýÔÐÍ£ºvoid hookClassLoad(String name,
MS.ClassLoadHook hook);
¸Ã·½·¨ÊµÏÖÔÚÖ¸¶¨µÄÀà±»¼ÓÔØµÄʱºò·¢³ö֪ͨ¡£ÒòΪһ¸öÀà¿ÉÒÔÔÚÈκÎʱºò±»¼ÓÔØ£¬ËùÒÔSubstrateÌṩÁËÒ»¸ö·½·¨ÓÃÀ´¼ì²âÓû§¸ÐÐËȤµÄÀàºÎʱ±»¼ÓÔØ¡£

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); |
²ÎÊýÃèÊö
£¨Ò»£©

£¨¶þ£©

½¨Ò鿪·¢ÕßʹÓõڶþÖÖ·½Ê½£¬ÕâÖÖ·½Ê½Ê¹ÓÃÆðÀ´¼òµ¥²¢ÇÒºÜÉÙ³ö´í£¬²»ÐèÒªÒ»¸öµ¥¶ÀµÄ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
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/> </application> <uses-permission android:name="cydia.permission.SUBSTRATE"/> </manifest> |
²½Öè¶þ£º´´½¨Ò»¸öÀ࣬ÀàÃûΪMain¡£ÀàÖаüº¬Ò»¸östatic·½·¨initialize£¬µ±²å¼þ±»¼ÓÔØµÄʱºò£¬¸Ã·½·¨ÖеĴúÂë¾Í»áÔËÐУ¬Íê³ÉһЩ±ØÒªµÄ³õʼ»¯¹¤×÷¡£
import com.saurik.substrate.MS; public class Main { static void initialize() { // ... code to run when extension is loaded } } |
²½ÖèÈý£ºÎªÁËʵÏÖHOOK£¬´ïµ½ÐÞ¸ÄÄ¿±êÀàÖеĴúÂëµÄÄ¿µÄ£¬ÎÒÃÇÐèÒªµÃµ½Ä¿±êÀàµÄÒ»¸öʵÀý£¬ÈçʾÀýÖеÄresources¡£
public class Main { static void initialize() { MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() { public void classLoaded(Class<?> resources) { // ... code to modify the class when loaded } }); } } |
²½ÖèËÄ£ºÍ¨¹ýMS.MethodHookʵÀýʵÏÖÔ´úÂëµÄÐ޸ġ£
ΪÁ˵÷ÓÃÔÀ´´úÂëÖеķ½·¨£¬ÎÒÃÇÐèÒª´´½¨Ò»¸öMS.MethodPointerÀàµÄʵÀý£¬Ëü¿ÉÒÔÔÚÈκÎʱºòÔËÐÐÔÀ´µÄ´úÂë¡£
ÔÚÕâÀïÎÒÃÇͨ¹ý¶ÔÔ´úÂëÖÐresources¶ÔÏóÔʼ´úÂëµÄµ÷ÓúÍÐ޸쬽«ËùÓÐÂÌÉ«Ð޸ijÉÁË×ÏÂÞÀ¼É«¡£
public void classLoaded(Class<?> resources) { Method getColor; try { getColor = resources.getMethod("getColor", Integer.TYPE); } catch (NoSuchMethodException e) { getColor = null; } if (getColor != null) { final MS.MethodPointer old = new MS.MethodPointer(); MS.hookMethod(resources, getColor, new MS.MethodHook() { public Object invoked(Object resources, Object... args) throws Throwable { int color = (Integer) old.invoke(resources, args); return color & ~0x0000ff00 | 0x00ff0000; } }, old); } } |
°²×°ÔËÐУ¬ÖØÆôϵͳºó·¢Ïֺܶà×ÖÌåÑÕÉ«¶¼±äÁË¡£ÈçÏÂͼËùʾ£º

ʾÀýÖÐMS.hookMethodµÄ´úÂë¿ÉÒԸijɣº
MS.hookMethod(resources, getColor, new MS.MethodAlteration<Resources, Integer>() { public Integer invoked(Resources resources, Object... args) throws Throwable { int color = invoke(resources, args); return color & ~0x0000ff00 | 0x00ffee00; } }); |
¶ÌÐÅ¼à¿ØÊµÀý
ÔÚÏÂÃæµÄÀý×ÓÖÐÎÒÃÇʵÏÖÁ˶ÌÐżàÌý¹¦ÄÜ£¬½«¶ÌÐÅ·¢ËÍÈË¡¢½ÓÊÕÈËÒÔ¼°¶ÌÐÅÄÚÈÝ´òÓ¡³öÀ´£º
1 import java.lang.reflect.Method; 2 import android.app.PendingIntent; 3 import android.util.Log; 4 import com.saurik.substrate.MS; 5 6 7 public class Main { 8 9 static void initialize() { 10 11 MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() { 12 13 14 @Override 15 16 public void classLoaded(Class<?> SmsManager) { 17 18 //code to modify the class when loaded 19 20 Method sendTextMessage; 21 22 try { 23 24 sendTextMessage = SmsManager.getMethod("sendTextMessage", 25 new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class}); 27 28 29 } catch (NoSuchMethodException e) { 30 31 sendTextMessage = null; 32 33 } 34 35 MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() { 36 37 public Object invoked(Object _this,Object... _args) throws Throwable{ 38 39 Log.i("SMSHOOK","SEND_SMS"); 40 41 Log.i("SMSHOOK","destination:"+_args[0]); 42 43 Log.i("SMSHOOK","source:"+_args[1]); 44 45 Log.i("SMSHOOK","text:"+_args[2]); 46 47 return invoke(_this, _args); 48 49 } 50 51 }); 52 53 54 } 55 56 }); 57 58 } 59 60 } |
ÔËÐкóµÄ½á¹ûΪ£º
ps: Á¬½Óhttp://mobile.51cto.com/aprogram-454091.htm
×î½üд±ÏÒµÂÛÎÄ£¬ºÃ³¤Ê±¼äû¸üÐÂÁË£¬Ò²ÓÐһЩ֮ǰµÄ²©¿Íû¸üС£
|