Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
AndroidÖÐÈÈÐÞ¸´¿ò¼ÜRobustÔ­Àí½âÎö+²¢½«¿ò¼Ü´úÂë´Ó¡±±ÕÔ´¡±±ä³É¡±¿ªÔ´¡±(ÉÏÆª)
 
À´Ô´£ºÍøÂç ·¢²¼ÓÚ£º 2017-1-4
  2648  次浏览      31
 

Ò»¡¢Ç°ÑÔ

AndroidÖÐÈÈÐÞ¸´¿ò¼Ü±È½Ï¶à£¬Ã¿¼Ò¹«Ë¾¶¼ÓжÔÓ¦µÄ·½°¸ºÍ¿ò¼Ü£¬±ÈÈç°¢ÀïµÄAndFix¿ò¼Ü£¬¹ØÓÚÕâ¸ö¿ò¼ÜÔÚ֮ǰµÄÎÄÕÂÒѾ­Ïêϸ½²½âÁË£¬²»Á˽âµÄͬѧ¿ÉÒÔµã»÷ÕâÀAndFixÈÈÐÞ¸´¿ò¼ÜÔ­Àí·ÖÎö ¡£±¾ÎļÌÐøÀ´¿´ÁíÍâÒ»¸öÈÈÐÞ¸´¿ò¼Ü£¬Ò²¾ÍÊÇÃÀÍÅÍŶӿª·¢µÄRobust¿ò¼Ü¡£¹ØÓÚÕâ¸ö¿ò¼ÜÍøÉÏÒѾ­ÓÐÏêϸ½âÊÍÁË£¬¾ßÌåÓ÷¨Ò²ÓС£²»¹ýËûûÓпªÔ´£¬ËùÒÔ±¾ÎľÍÏȼòµ¥½éÉÜËûµÄÔ­Àí£¬ÓÃÒ»¸ö°¸ÀýÀ´ÑÝʾÕâ¸ö¿ò¼ÜµÄ×÷Ó㬵«ÊÇÖØµãÊÇÕ¦ÃÇ×Ô¼º±àÂ뽫Æä¿ò¼Ü»úÖÆÊµÏÖ£¬ÈÃÆä¡±±ÕÔ´¡±±ä³É¡±¿ªÔ´¡±¡£

¶þ¡¢Ô­Àí½âÎö

¹ØÓÚÈÈÐÞ¸´¼¼Êõµã£¬ÆäʵËäȻÿ¼Ò¶¼ÓжÔÓ¦µÄ¿ò¼Ü£¬µ«ÊǺËÐĵ㶼Àë²»¿ª¶¯Ì¬¼ÓÔØ»úÖÆ¡£ÓÐÁ˶¯Ì¬¼ÓÔØ»úÖÆ£¬È»ºó¾ÍÊǾßÌåÐÞ¸´·½°¸ÎÊÌâÁË£¬¶ÔÓÚRobustÐÞ¸´·½°¸Ò²ÊDZȽϼòµ¥µÄ¡£ÏÂÃæÀ´¼òµ¥¿´Ò»ÏÂËûµÄ´óÖÂÔ­Àí£º

Robust²å¼þ¶Ôÿ¸ö²úÆ·´úÂëµÄÿ¸öº¯Êý¶¼ÔÚ±àÒë´ò°ü½×¶Î×Ô¶¯µÄ²åÈëÁËÒ»¶Î´úÂ룬²åÈë¹ý³Ì¶ÔÒµÎñ¿ª·¢ÊÇÍêȫ͸Ã÷¡£ÈçState.javaµÄgetIndexº¯Êý£º

public long getIndex() {
return 100;
}

±»´¦Àí³ÉÈçϵÄʵÏÖ£º

public static ChangeQuickRedirect changeQuickRedirect;
public long getIndex() {
if(changeQuickRedirect != null) {
//PatchProxyÖзâ×°ÁË»ñÈ¡µ±Ç°classNameºÍmethodNameµÄÂß¼­£¬²¢ÔÚÆäÄÚ²¿×îÖÕµ÷ÓÃÁËchangeQuickRedirectµÄ¶ÔÓ¦º¯Êý
if(PatchProxy.isSupport(new Object[0], this, changeQuickRedirect, false)) {
return ((Long)PatchProxy.accessDispatch(new Object[0], this, changeQuickRedirect, false)).longValue();
}
}
return 100L;
}

¿ÉÒÔ¿´µ½RobustΪÿ¸öclassÔö¼ÓÁ˸öÀàÐÍΪChangeQuickRedirectµÄ¾²Ì¬³ÉÔ±£¬¶øÔÚÿ¸ö·½·¨Ç°¶¼²åÈëÁËʹÓÃchangeQuickRedirectÏà¹ØµÄÂß¼­£¬µ±changeQuickRedirect²»Îªnullʱ£¬¿ÉÄÜ»áÖ´Ðе½accessDispatch´Ó¶øÌæ»»µô֮ǰÀϵÄÂß¼­£¬´ïµ½fixµÄÄ¿µÄ¡£Èç¹ûÐ轫getIndexº¯ÊýµÄ·µ»ØÖµ¸ÄΪreturn 106£¬ÄÇô¶ÔÓ¦Éú³ÉµÄpatch£¬Ö÷Òª°üº¬Á½¸öclass£ºPatchesInfoImpl.javaºÍStatePatch.java¡£

PatchesInfoImpl.java£º

public class PatchesInfoImpl implements PatchesInfo {
public List<PatchedClassInfo> getPatchedClassesInfo() {
List<PatchedClassInfo> patchedClassesInfos = new ArrayList<PatchedClassInfo>();
PatchedClassInfo patchedClass = new PatchedClassInfo("com.meituan.sample.d", StatePatch.class.getCanonicalName());
patchedClassesInfos.add(patchedClass);
return patchedClassesInfos;
}
}

StatePatch.java£º

public class StatePatch implements ChangeQuickRedirect {
@Override
public Object accessDispatch(String methodSignature, Object[] paramArrayOfObject) {
String[] signature = methodSignature.split(":");
if (TextUtils.equals(signature[1], "a")) {//long getIndex() -> a
return 106;
}
return null;
}

@Override
public boolean isSupport(String methodSignature, Object[] paramArrayOfObject) {
String[] signature = methodSignature.split(":");
if (TextUtils.equals(signature[1], "a")) {//long getIndex() -> a
return true;
}
return false;
}
}

¿Í»§¶ËÄõ½º¬ÓÐPatchesInfoImpl.javaºÍStatePatch.javaµÄpatch.dexºó£¬ÓÃDexClassLoader¼ÓÔØpatch.dex£¬·´ÉäÄõ½PatchesInfoImpl.javaÕâ¸öclass¡£Äõ½ºó£¬´´½¨Õâ¸öclassµÄÒ»¸ö¶ÔÏó¡£È»ºóͨ¹ýÕâ¸ö¶ÔÏóµÄgetPatchedClassesInfoº¯Êý£¬ÖªµÀÐèÒªpatchµÄclassΪcom.meituan.sample.d£¨com.meituan.sample.State»ìÏýºóµÄÃû×Ö£©£¬ÔÙ·´ÉäµÃµ½µ±Ç°ÔËÐл·¾³ÖеÄcom.meituan.sample.d class£¬½«ÆäÖеÄchangeQuickRedirect×ֶθ³ÖµÎªÓÃpatch.dexÖеÄStatePatch.javaÕâ¸öclass new³öÀ´µÄ¶ÔÏó¡£Õâ¾ÍÊÇ´òpatchµÄÖ÷Òª¹ý³Ì¡£Í¨¹ýÔ­Àí·ÖÎö£¬ÆäʵRobustÖ»ÊÇÔÚÕý³£µÄʹÓÃDexClassLoader£¬ËùÒÔ¿ÉÒÔ˵ÕâÌ׿ò¼ÜÊÇûÓмæÈÝÐÔÎÊÌâµÄ¡£

ÏÂÃæÖ±½ÓÉÏÒ»ÕÅͼÀ´¿´¿´È˼ҵÄÔ­Àí½á¹¹£º

ÔÙÀ´¿´Ò»ÏÂÃÀÍÅteam¹«¿ªµÄÔ­Àíͼ£º

Ô­ÀíÕæµÄºÜ¼òµ¥£ºÖ±½ÓÓÃDexClassLoader¼ÓÔØÐÞ¸´°ü£¬È»ºóÓÃloadClass·½·¨¼ÓÔØÐÞ¸´À࣬new³öжÔÏó£¬ÔÚÓ÷´Éä°ÑÕâеÄÐÞ¸´¶ÔÏóÉèÖõ½Ö¸¶¨ÀàµÄchangeQuickRedirect¾²Ì¬±äÁ¿Öм´¿É¡£ÆäʵÕâÖÖÐÞ¸´ÀàËÆÓÚJavaÖеÄÉè¼ÆÄ£Ê½Ö®¾²Ì¬´úÀí¡£

Èý¡¢°¸Àýʵ¼ù

ÖªµÀÁË´óÖÂÔ­Àí£¬ÏÂÃæ¾ÍÓÃÒ»¸ö¼òµ¥µÄ°¸ÀýÀ´ÔËÐУ¬¿´µ½Ð§¹û£¬ÕâÀïÎÒÃÇÐèҪн¨Èý¸öÏîÄ¿£¬Ö±½Ó¿½±´Ö®Ç°¿ª·¢²å¼þµÄÄǸöÏîÄ¿¼´¿É£¬¿ÉÒÔ¿´ÕâÆªÎÄÕ£ºAndroidÖвå¼þ¿ª·¢Ô­Àí½âÎö£¬Èý¸öÏîĿͼ½á¹¹ÈçÏ£º

±¾ÎÄÒÀÈ»²ÉÓÃÕâÖֽṹͼÈçÏ£º

Õ¦ÃÇÕâÀïÖ÷Òª¿´RobustHost£¬RobustPatch£¬RobustPatchImplÕâÈý¸ö¹¤³Ì£¬RobustInsertCodeToolsÊǸöJava¹¤³ÌÓÃÓÚºóÃæ»áÖØµã½éÉܵĶ¯Ì¬²åÈë´úÂ빤¾ß¡£

µÚÒ»¡¢ÐÞ¸´°ü½Ó¿Ú¹¤³ÌRobustPatch

Õâ¸ö¹¤³Ì±È½Ï¼òµ¥£¬´ó²¿·Ö¶¼Êǽӿڶ¨Ò壬Ö÷ÒªÓÐÕâÈý¸öÀàºÍ½Ó¿Ú£º

1¡¢ChangeQuickRedirect½Ó¿Ú

Õâ¸ö½Ó¿ÚÖ÷ÒªÊǺóÃæÐÞ¸´°üÖÐÿ¸öÐÞ¸´Àà±ØÐëʵÏÖµÄÒ»¸ö½Ó¿Ú£¬ÄÚ²¿ÓÐÁ½¸ö·½·¨£ºÒ»¸öÊÇÅжϵ±Ç°·½·¨ÊÇ·ñÖ§³ÖÐÞ¸´£¬Ò»¸ö·½·¨ÊǾßÌåµÄÐÞ¸´Âß¼­ÁË¡£

Á½¸ö·½·¨µÄ²ÎÊý¶¼ÊÇÒ»ÑùµÄ£º

µÚÒ»¸ö²ÎÊýÊÇ·½·¨µÄÇ©Ãû£¬Õâ¸öÇ©ÃûµÄ¸ñʽºÜ¼òµ¥£º·½·¨ËùÊôÀàÈ«³Æ:·½·¨Ãû:·½·¨ÊÇ·ñΪstaticÀàÐÍ£¬×¢ÒâÖмäʹÓÃðºÅ½øÐÐÁ¬½ÓµÄ¡£

µÚ¶þ¸ö²ÎÊýÊÇ·½·¨µÄ²ÎÊýÐÅÏ¢£¬¶ø¶ÔÓÚÕâ¸ö²ÎÊýºóÃæ·ÖÎö¶¯Ì¬²åÈë´úÂëÂß¼­µÄʱºò»á·¢ÏÖ²Ù×÷·Ç³£Âé·³£¬²Å°ÑÕâ¸ö²ÎÊýŪµ½Êֵġ£

2¡¢PatchesInfo½Ó¿Ú

Õâ¸ö½Ó¿Ú±È½Ï¼òµ¥£¬Ö»ÓÐÒ»¸ö·½·¨£¬Óû§´æ·ÅÒ»¸öÐÞ¸´°üÖÐËùÓдýÐÞ¸´ÀàµÄ¾ßÌåÐÅÏ¢£¬ÒòΪһ¸öÐÞ¸´°üÖпÉÄÜÓжà¸öÐèÒªÐÞ¸´µÄÀà¡£Õâ¸ö½Ó¿ÚÒ²ÊǺóÃæËÞÖ÷¹¤³ÌÖж¯Ì¬¼ÓÔØÐèÒªÓõ½µÄ¡£Í¨¹ýÕâ¸ö½Ó¿Ú»ñÈ¡µ½Ö¸¶¨ÐÞ¸´µÄÀàºÍ¾ÉÀàÐÅÏ¢¡£

3¡¢PatchedClassInfoÀà

Õâ¸öÀà±È½Ï¼òµ¥£¬Ö÷Òª¾ÍÊÇ´æ·ÅÁ½¸ö×ֶΣºÒ»¸öÊDZ¾´ÎÐÞ¸´ÀàÐÅÏ¢£¬Ò»¸öÊÇÐèÒªÐÞ¸´¾ÉÀàÐÅÏ¢£¬ÈÃÕâ¸öÀà»á±»ÉÏÃæµÄ½Ó¿ÚÓõ½¡£

µÚ¶þ¡¢ÐÞ¸´°ü¹¤³Ì

µ½ÕâÀïÕ¦ÃǾͿ´ÍêÁËÐÞ¸´°ü½Ó¿Ú¹¤³Ì¡£ÏÂÃæ¼ÌÐøÀ´¿´Ò»ÏÂÐÞ¸´°ü¹¤³Ì£º

ÐÞ¸´°ü¹¤³Ì±È½Ï¼òµ¥£¬Ö±½ÓÔö¼ÓÐÞ¸´À༴¿É£¬ÕâÀï¿ÉÒÔ¿´µ½£¬ÎÒÃÇÐèÒªÐÞ¸´ËÞÖ÷¹¤³ÌÖеÄÒ»¸öMoneyBeanÀ࣬Õâ¸öÀà±ØÐëʵÏÖÉÏÃæµÄÐÞ¸´°ü½Ó¿Ú¹¤³ÌÖеÄChangeQuickRedirect½Ó¿Ú£¬È»ºó¾ÍÊÇÐèÒª±£´æÐÞ¸´ÀàÐÅÏ¢ºÍ´ýÐÞ¸´¾ÉÀàÐÅÏ¢£¬ÔÚPatchesInfoImplÖнøÐб£´æ·µ»ØµÄ£¬¶øÕâ¸öÀàʵÏÖÁËÐÞ¸´°ü½Ó¿Ú¹¤³ÌÖеÄPatchesInfo½Ó¿Ú¡£

1¡¢MoneyBeanStatePatchÐÞ¸´Àà

Õâ¸öÀà¿´µ½ÁË£¬ÊµÏÖÁËÐÞ¸´½Ó¿ÚChangeQuickRedirect£¬È»ºóʵÏÖ¾ßÌåÁ½¸ö·½·¨¼´¿É¡£

1¡·ÔÚisSupport·½·¨ÖУ¬»áͨ¹ý·½·¨µÄÇ©ÃûÐÅÏ¢µÃµ½·½·¨Ãû£¬È»ºóÅжÏÖ§³ÖÐÞ¸´µÄ·½·¨¡£ÕâÀï¿´µ½µÄÊÇ´ýÐÞ¸´ÀàÖеÄgetMoneyValueºÍdescÕâÁ½¸ö·½·¨ÐèÒª½øÐÐÐÞ¸´¡£

2¡·accessDispatch·½·¨ÖУ¬Ö÷Òª½øÐÐÁ˾ßÌåÐÞ¸´·½°¸ÊµÐÐÁË£¬¿ªÊ¼Ò²ÊÇÏÈͨ¹ý·½·¨Ç©ÃûÐÅÏ¢£¬µÃµ½·½·¨Ãû£¬È»ºóÔÚÅжÏÄÄЩ·½·¨ÐèÒª½øÐÐÐÞ¸´£¬ÕâÀï°ÑgetMoneyValue·½·¨µÄ·µ»ØÖµÐÞ¸´³ÉÁË10000£¬°Ñdesc·½·¨µÄ·µ»ØÖµÐÞ¸´³ÉÁË¡±Patch Desc¡±¡£

µÚÈý¡¢ËÞÖ÷¹¤³ÌRobustHost

ËÞÖ÷¹¤³Ì×î´óµÄ¹¤×÷¾ÍÊÇÐèÒª¼ÓÔØÐÞ¸´°ü£¬Õâ¸ö²»Óöà½âÊÍÁË£¬·ÅÔÚApplicationÖм´¿É¡£¼ÓÔØÂß¼­Ã»Ê²Ã´¿É˵µÄ¡£ÕâÀïÎÒÃÇÓÐÒ»¸öMoneyBeanÀࣺ

Õâ¸öÀàµÄÿ¸ö·½·¨Ö®Ç°¶¼¼ÓÉÏÁ˾߱¸ÐÞ¸´¹¦ÄܵĴúÂë¶Î¡£±ÈÈçÏÖÔÚÈç¹ûÏßÉϵİüÖÐÕâ¸öÀàµÄ·½·¨·µ»ØÖµ³öÁËÎÊÌ⣬Õâʱºò¾Í¿ÉÒÔ½èÖúÈÈÐÞ¸´¹¦ÄÜ¡£°ÑµÚ¶þ¸öÐÞ¸´°ü¹¤³Ì´ò°üºÃ·¢²¼³öÈ¥¼´¿É¡£

ÔÙÀ´¿´Ò»ÏÂÕâÀïÓÐÒ»¸öPatchProxyÀࣺ

Õâ¸öÀàÆäʵÊǶÔÐÞ¸´Àà½øÐÐÁ˰ü×°ÁË£¬ÄÚ²¿ÓÐÒ»¸öÖØÒªÂß¼­¾ÍÊÇ»ñÈ¡µ±Ç°Ö´Ðз½·¨µÄÐÅÏ¢£¬°üÀ¨ÀàÃûºÍ·½·¨Ãû£¬ÕâÀïÖ÷ÒªÊÇͨ¹ý·½·¨Õ»ÐÅÏ¢µÃµ½µÄ£º

È»ºó¾ÍÊÇËÞÖ÷¹¤³ÌÖеļÓÔØÐÞ¸´°üÂß¼­ÁË

ʹÓÃDexClassLoader½øÐмÓÔØÐÞ¸´°üÎļþ£¬²»¶à½âÊÍÁË¡£ÓÐÁ˼ÓÔØÆ÷¾Í¿ªÊ¼ºóÐøµÄ¼ÓÔØÂß¼­ÁË¡£Ê×ÏÈÕ¦ÃǵûñÈ¡µ½PatchesInfoImplÀàÐÅÏ¢£¬ÒòΪÕâ¸öÀàÖб£´æÁËÐÞ¸´ÀàÐÅÏ¢¡£ÕâÀïÊÇnew³öÒ»¸öжÔÏó¡£È»ºó¾Íµ÷ÓÃÆä·½·¨µÃµ½ÐÞ¸´ÀàµÄÏàÐÅÐÅÏ¢£¬ÒÀ´Î±éÀúÐÞ¸´ÀàÐÅÏ¢ÁÐ±í£¬µÃµ½ÐÞ¸´ÀàºÍ´ýÐÞ¸´¾ÉÀàÐÅÏ¢£¬ÒÀȻʹÓ÷´Éänew³öжÔÏó£¬ÔÙ°ÑÐÞ¸´Àà¶ÔÏóÉèÖõ½´ýÐÞ¸´¾ÉÀàµÄ¾²Ì¬±äÁ¿changeQuickRedirectÖм´¿É¡£

ËÄ¡¢ÔËÐÐЧ¹û

ºÃÁË£¬µ½ÕâÀïÎÒÃǾͷÖÎöÍêÁËRobustÈÈÐÞ¸´¿ò¼ÜÖÐÉæ¼°µÄ¹¤³Ì£¬Ö÷Òª¾ÍÊÇÈý¸ö¹¤³Ì¡£ÏÂÃæ¿ªÊ¼Ö±½ÓÔËÐнá¹ûÁË¡£²»¹ýÕ¦ÃÇ»¹ÊǵÃÏÈŪ³öÐÞ¸´°ü£¬Õâ¸ö±È½Ï¼òµ¥£¬Ö±½ÓÔËÐÐÐÞ¸´°üRobustPatchImpl¹¤³Ì£¬µÃµ½apkÎļþ¼´¿É£¬±¾ÎÄÖмÓÔØµÄÊÇdexÎļþ£¬ËùÒÔÕ¦ÃǰÑÕâ¸öapkÖеÄclasses.dexÎļþŪ³öÀ´£¬È»ºóÔڸijÉpatch.dex·Åµ½É豸µÄsd¿¨Ä¿Â¼Ï¼´¿É¡£ÔËÐеÄʱºò¿ÉÄܻᱨ´í£º

¹ØÓÚÕâ¸ö´íÎóÕâÀ²»ÔÚ¶à½âÊÍÁË£¬ÒòΪզÃǰÑÐÞ¸´°ü½Ó¿Ú¹¤³ÌµÄ´úÂëÒ²¼Óµ½ÐÞ¸´°üdexÖÐÁË¡£¾ßÌå´íÎóÔ­ÒòºÍ½â¾ö°ì·¨£¬Ò»¶¨ÒªÈ¥ÕâÀïÕÒ£ºAndroidÖвå¼þ¿ª·¢Ô­Àí¡£¼ÇµÃÊÇÒ»¶¨Å¶¡£

µ½ÕâÀï¼ÙÉèÎÒÃÇÒѾ­½â¾öÁËËùÓÐÎÊÌ⣬ÏÂÃæÔËÐп´¿´Ð§¹û£º

Õ¦ÃÇÔÙ¿´¿´Ã»ÓÐÐÞ¸´Ö®Ç°µÄЧ¹û£º

´ÓÕâÀï¿ÉÒÔ¿´µ½£¬Õ¦ÃǾÍÐÞ¸´·½·¨³É¹¦ÁË¡£

Îå¡¢·ÖÎöÃÀÍŵÄʵ¼ù°¸Àý

²»¹ýÕ¦ÃÇ»¹Ã»ÓнáÊø¹¤×÷£¬ÒòΪÃÀÍŵÄÕâ¸ö¿ò¼ÜûÓпªÔ´£¬ËùÒÔÉÏÃæµÄ°¸Àý²¢²»Äܾ߱¸Ëµ·þÐÔ¡£ËùÒÔΪÁËÑéÖ¤ÎÒÃǵÄʵÏÖÂß¼­ÊÇûÓдíµÄ£¬Õ¦ÃÇÐèÒª·´±àÒëÃÀÍŵÄappÁË£¬¿´ËûµÄÈÈÐÞ¸´Âß¼­ÊÇʲôÑùµÄ¡£ÕâÀïÖ±½ÓʹÓÃJadx¹¤¾ß´ò¿ªÃÀÍÅapp¼´¿É£º

Õ¦ÃÇ´ò¿ªappÖ®ºó£¬¿ÉÒÔÖ±½ÓÈ«¾ÖËÑË÷PatchProxyÀ࣬¼ÇµÃÒª¹´Ñ¡ÉÏClass£¬²»È»ÄÚÈÝÌ«¶àÁË¡£È»ºóÕÒµ½ÁËÕâ¸öÀàµÄ¶¨Òå

¿´µ½Õâ¸öÀàµÄʵÏÖÁË£¬Æäʵµ½ÕâÀïÎÒÏë¸æËß´ó¼Ò£¬ÎҵݸÀý¹¤³ÌÖеÄPatchProxyÀà¾ÍÊǰÑÕâ¸öÀർ³öÀ´µÄ£¬ÒòΪÎÒÀÁµÃд´úÂë¡£ÕýºÃÕâ¸öÀàÓÖûÓлìÏý¡£

Õ¦ÃǼÌÐøÀ´¿´ËûµÄ¼ÓÔØ´úÂëÂß¼­£¬ÕâÀïÓиöС¼¼ÇÉÁË£ºÔڲ鿴һ¸öÓ¦ÓÃÖж¯Ì¬¼ÓÔØÂß¼­µÄʱºò£¬¿ÉÒÔÈ«¾ÖËÑË÷ÐÅÏ¢£ºDexClassLoader£¬ÈçϽá¹û£º

Æäʵ¾ÍÊÇÃÀÍŵÄPatchExecutorÀ࣬µã½øÈ¥Ö±½Ó²é¿´£º

¿´µ½ÕâÀïµÄºËÐļÓÔØÂß¼­£¬²»¶à½âÊÍ£¬´úÂëÂß¼­ºÜ¼òµ¥£¬´óÖºÍÎÒÃÇʵÏֵIJ¶àÁË¡£×îºóÕ¦ÃÇÔÙÀ´¿´Ò»ÏÂappÖеÄÀàÖеÄÿ¸ö·½·¨ÊÇ·ñ²åÈëÁËÐÞ¸´´úÂë¶Î£º

Ëæ±ã´ò¿ªÒ»¸öÀ࣬ÀàÖеÄÿ¸ö·½·¨Ö®Ç°¶¼ÓÐÕâ¶ÎÐÞ¸´´úÂë¡£¹þ¹þ£¬µ½ÕâÀïÎÒÃǾͷdz£È·¶¨ÁË£¬ÎÒÃǵݸÀýʵÏÖºÍÃÀÍŵÄÐÞ¸´¿ò¼ÜʵÏÖÂß¼­´óÖ²»²îÁË¡£

Áù¡¢×Ô¶¯²åÈëÐÞ¸´´úÂë

Æäʵµ½ÕâÀﻹ²»Ëã½áÊø£¬ÒòΪÕâÆªÎÄÕÂÆäʵ²»ÊÇÎÒÏë½éÉÜRobust¿ò¼ÜµÄÓÃÒ⣬ÒòΪ´ó¼Ò¿´ÍêÉÏÃæµÄÔ­ÀíÖ®ºó£¬·¢ÏÖÆäʵÐÞ¸´Ô­Àíû¶à´óÄѶȵġ£¶øÎÒµÄÓÃÒâÊÇÈçºÎÈÃÿ¸öÀàÖеÄÿ¸ö·½·¨¶¼²åÈëÒ»¶ÎÐÞ¸´´úÂë¡£

ÒòΪ´ÓÉÏÃæÎÒÃÇ¿ÉÒÔ¿´µ½£¬Õâ¸ö¿ò¼ÜµÄ×î´óÄѶÈÊÇÔÚÿ¸öÀàÿ¸ö·½·¨Ö®Ç°¶¼±ØÐëÓÐÐÞ¸´´úÂë¶Î¡£Èç¹ûûÓÐÄÇô·½·¨¾ÍɥʧÁËÐÞ¸´¹¦ÄÜ¡£µ«ÊÇÎÊÌâÔÚÓÚ£¬Ò»¸öÅÓ´óµÄÏîÄ¿±ÈÈçÃÀÍÅ£¬ÈçºÎÄܹ»±£Ö¤Ã¿¸ö¿ª·¢ÈËÔ±ÔÚ±àдһ¸ö·½·¨µÄʱºò¶¼ÐèÒªÊÖ¶¯¼ÓÉÏÕâ¶ÎÐÞ¸´´úÂëÄØ£¿Õâ¸öÊDz»¿ÉÄÜÔ¼Êø³É¹¦µÄ¡£ËùÒÔÕâ¸ö¾ÍÐèÒª½èÖú×Ô¶¯»¯²Ù×÷ÁË£¬ÆäʵÔÚÃÀÍŹٷ½ËµÃ÷Õâ¸ö¿ò¼ÜµÄʱºòÌáµ½ÒÀ¾Ý£º¡°²åÈë´úÂëÊÇÔÚ±àÒëÆÚ×Ô¶¯½øÐе쬶ÔÓÚ¿ª·¢ÕßÊÇ͸Ã÷µÄ¡±¡£ËùÒÔÕâ¾ä»°¶ÔÎÒµÄÓÕ»óÐÔ×î´ó£¬ÒòΪÕâ¾ä»°ÎÒÑо¿ÁËÕâ¸ö¿ò¼Ü¡£ËùÒÔÏÞÓÚÆª·ùÔ­Òò£¬²»ÄÜÔÚһƪÎÄÕÂÖн²½âÍêÁË¡£´ÓÕâÀï¿ÉÒÔ¿´µ½£¬Robust¿ò¼ÜµÄºËÐĵ㲻ÔÚÕâÆª£¬¶øÊÇÔÚÏÂһƪÎÄÕ£¬ÎÒ»á´ø´ó¼ÒÊÖ¶¯±àдÈçºÎÔÚ±àÒëÆÚÖÐ×Ô¶¯²åÈëÐÞ¸´´úÂ룬ÎÞÐ迪·¢ÈËÔ±²ÙÐÄ¡£µÈÄÇÆªÎÄÕ½éÉÜÍêÖ®ºó£¬»áÔÚÏêϸ½éÉÜÒ»ÏÂÃÀÍÅÕâ¸öÈÈÐÞ¸´¿ò¼ÜRobustµÄÓÅȱµã¡£

ÌØ´Ë˵Ã÷

¹ØÓÚÃÀÍŵÄÕâ¸öRobustÈÈÐÞ¸´¿ò¼ÜµÈÏÂһƪ½éÉÜÍê×Ô¶¯²åÈë´úÂ빦ÄÜÖ®ºó£¬»áͳһ×ܽáÒ»ÏÂÕâ¸ö¿ò¼ÜµÄÓÅȱµã¡£»¹ÊÇÄǾ仰£¬Õâ¸ö¿ò¼ÜµÄÖØµãÆäʵÊÇ×Ô¶¯²åÈë´úÂëÄ£¿é£¬»òÐíÕâ¸ö¾ÍÊÇÃÀÍÅûÓпªÔ´µÄÒ»¸öÔ­Òò£¬µ±È»Ò²ÓÐÆäËûÔ­Òò¡£¹ØÓÚ±¾ÎÄÖÐʵ¼ùµÄ°¸ÀýÊÇ´óÖÂÉÏʵÏÖÁËRobust¿ò¼ÜÔ­Àí£¬µ«ÊÇ»¹ÊÇÓкܶàϸ½ÚÎÊÌâÐèÒªÓÅ»¯µÄ¡£´ÓÎÒµÄÈý¸öÏîÄ¿´úÂëÒ²¿ÉÒÔ¿´µ½£¬Ð´µÄ±È½Ï´Ö²Ú¡£ºÜ¶àÇé¿ö²¢Ã»Óп¼Âǵ½¡£ËùÒÔÈç¹ûÏë×Ô¼ºÍêÉÆÓÅ»¯µÄ»°£¬¿ÉÒÔ×ÔÐвÙ×÷¼´¿É¡£

ÏîÄ¿ÏÂÔØµØÖ·£ºhttps://github.com/fourbrother/Robust

Æß¡¢×ܽá

±¾ÎÄÖ÷Òª½éÉÜÁËÃÀÍŵÄÈÈÐÞ¸´¿ò¼ÜRobustÔ­Àí£¬ÒòΪËûûÓпªÔ´£¬ËùÒÔÕ¦ÃǾÍͨ¹ý¹Ù·½¸ø³öµÄÔ­Àí½âÎö£¬´óÖÂʵÏÖÁ˼òµ¥°¸Àý£¬ÎªÁËÑéÖ¤ÎÒÃǵݸÀýºÍÃÀÍÅappµÄ¿ò¼ÜÂß¼­ÀàËÆ£¬Õ¦ÃÇͨ¹ý·´±àÒëÃÀÍÅapp£¬ºË¶ÔÖ®ºóÈ·¶¨ÁËÕ¦ÃǵÄʵÏÖÂß¼­¾ÍÊǺÍRobustʵÏÖ´óÖÂÏàͬ£¬»¹ÓоßÌåϸ½ÚÎÊÌâ¾Í²»ËµÁË¡£µ«ÊÇÎÒÃÇÔÚʵÏÖ°¸ÀýµÄʱºò»á·¢ÏÖÕâ¸ö¿ò¼ÜÓÐÒ»¸öºÜ´óµÄÔ¼Êø£¬¾ÍÊÇÿ¸öÀàµÄÿ¸ö·½·¨Ö®Ç°±ØÐë¼ÓÉÏÒ»¶ÎÐÞ¸´´úÂ룬Èç¹ûûÓÐÌí¼Ó¸Ã·½·¨¾ÍʧȥÁËÐÞ¸´¹¦ÄÜ¡£µ±È»Õâ¶Î´úÂëÊDz»¿ÉÄÜÔ¼ÊøÃ¿¸ö¿ª·¢ÈËÔ±ÔÚ¿ª·¢¹ý³ÌÖÐÊÖ¶¯Ìí¼ÓµÄ¡£¹Ù·½¸ø³öµÄ½âÊÍÊÇ£ºÔÚÏîÄ¿±àÒë½×¶Î×Ô¶¯Ìí¼Ó£¬¶ÔÓÚ¿ª·¢ÈËÔ±ÊÇ͸Ã÷µÄ¡£ËùÒÔÕâ¸ö¾ÍÊÇÎÒÕâ´Î½âÎöÕâ¸ö¿ò¼ÜµÄÖØµã£¬Ò²ÊÇÏÂһƪµÄÖØµã£¬ÈçºÎ±àд¹¤¾ßʵÏÖ×Ô¶¯²åÈëÐÞ¸´´úÂ롣˵µ½ÕâÀïÎҸоõͦÄھε쬱¾À´ÊÇÏëÔÚÕâÆªÎÄÕÂÒ»Æð¶¼½²½âÍêÁË£¬¿ÉÊÇûÏëµ½ÎÄÕÂд×ÅдמÍÄÚÈݶàÁË£¬ÕæÐIJ»ÄÜÔÚһƪÖнéÉÜÁË£¬Ö»ÄÜ·ÖÆª½éÉÜÁË¡£²»¹ýÕâ¸öÒ²²»Ó°ÏìÕ¦ÃǺóÃæµÄÖØµãƪ£¬Ï£Íû´ó¼ÒÄܹ»¿´Í걾ƪ֮ºó±£³Öן߶ÈÈÈÇéÆÚ´ýÏÂһƪÄÚÈÝ¡£Ð¡±àÖÜÄ©Îü×ÅÎíö²¸ø´ó¼ÒдÎÄÕ£¬»¹ÊÇÏ£Íû´ó¼ÒÄܹ»¶à¶à·ÖÏí£¬ÒªÓдòÉ;ÍÔںò»¹ýÁË¡£

   
2648 ´Îä¯ÀÀ       31
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ