ÕªÒª£ºXposedÊÇÒ»¿î¿ÉÒÔÔÚ²»ÐÞ¸ÄAPKµÄÇé¿öÏÂÓ°Ïì³ÌÐòÔËÐеĿò¼Ü·þÎñ£¬»ùÓÚXposedÄܹ»ÖÆ×÷³öÐí¶à¹¦ÄÜÇ¿´óµÄÄ£¿é£¬ÇÒÔÚ¹¦Äܲ»³åÍ»µÄÇé¿öÏÂͬʱÔË×÷¡£ÔÚ±¾ÎÄÖУ¬×÷ÕßÏêϸ½éÉÜÁËXposedµÄ²Ù×÷²½ÖèÒÔ¼°µÇ½½Ù³ÖʵսÑÝÁ·¡£
CSDNÒÆ¶¯½«³ÖÐøÎªÄúÓÅÑ¡ÒÆ¶¯¿ª·¢µÄ¾«»ªÄÚÈÝ£¬¹²Í¬Ì½ÌÖÒÆ¶¯¿ª·¢µÄ¼¼ÊõÈȵ㻰Ì⣬º¸ÇÒÆ¶¯Ó¦Óᢿª·¢¹¤¾ß¡¢Òƶ¯ÓÎÏ·¼°ÒýÇæ¡¢ÖÇÄÜÓ²¼þ¡¢ÎïÁªÍøµÈ·½·½ÃæÃæ¡£Èç¹ûÄúÏëͶ¸å¡¢²ÎÓëÄÚÈÝ·Ò빤×÷£¬»òѰÇó½ü½³±¨µÀ£¬Çë·¢ËÍÓʼþÖÁtangxy#csdn.net£¨Çë°Ñ#¸Ä³É@£©¡£
ǰ¶Îʱ¼äдÁËһƪ¹ØÓÚCydia Substrate¹ã¸æ×¢ÈëµÄÎÄÕ£¬´ó¼Ò¶¼Ö±ºô¹ýñ«¡£µ«ÊÇ£¬ÕæÕýÁ˽âÕâÒ»·½ÃæµÄͬѧӦ¸ÃÖªµÀ£¬Æäʵ»¹ÓÐÒ»¸ö±ÈCydia
Substrate¸ü³öÃûµÄ¹¤¾ß£ºXPosed¡£
²»ÊÇÒòΪXposed±ÈCydia Substrate×öµÄ¶àºÃ£¬¶øÊÇXposedÊdz¹µ×¿ªÔ´µÄ¡£½ñÌ죬¾ÍÏò´ó¼Ò¼òµ¥µØ½éÉÜÒ»ÏÂXposed£¬²¢Êéдһ¸ö¼òµ¥µÄµÇ½½Ù³ÖDemo£¬Èôó¼Ò¿ìËÙµØÈëÃÅѧϰXposed¡£
Xposed
Xposed¿ò¼ÜÊÇÒ»¿î¿ÉÒÔÔÚ²»ÐÞ¸ÄAPKµÄÇé¿öÏÂÓ°Ïì³ÌÐòÔËÐУ¨ÐÞ¸Äϵͳ£©µÄ¿ò¼Ü·þÎñ£¬Í¨¹ýÌæ»»/system/bin/app_process³ÌÐò¿ØÖÆzygote½ø³Ì£¬Ê¹µÃapp_processÔÚÆô¶¯¹ý³ÌÖлá¼ÓÔØXposedBridge.jarÕâ¸öjar°ü£¬´Ó¶øÍê³É¶ÔZygote½ø³Ì¼°Æä´´½¨µÄDalvikÐéÄâ»úµÄ½Ù³Ö¡£
»ùÓÚXposed¿ò¼Ü¿ÉÒÔÖÆ×÷³öÐí¶à¹¦ÄÜÇ¿´óµÄÄ£¿é£¬ÇÒÔÚ¹¦Äܲ»³åÍ»µÄÇé¿öÏÂͬʱÔË×÷¡£´ËÍ⣬Xposed¿ò¼ÜÖеÄÿһ¸ö¿â»¹¿ÉÒÔµ¥¶ÀÏÂÔØÊ¹Óã¬ÈçPer
APP Setting£¨ÎªÃ¿¸öÓ¦ÓÃÉèÖõ¥¶ÀµÄdpi»òÐÞ¸ÄȨÏÞ£©¡¢Cydia¡¢XPrivacy£¨·ÀÖ¹Òþ˽й¶£©¡¢BootManager£¨¿ªÆô×ÔÆô¶¯³ÌÐò¹ÜÀíÓ¦Óã©¶ÔÔÉúLauncherÌæ»»Í¼±êµÈÓ¦Óûò¹¦Äܾù»ùÓÚ´Ë¿ò¼Ü¡£
Xposed¿ò¼ÜÊÇ»ùÓÚÒ»¸öAndroidµÄ±¾µØ·þÎñÓ¦ÓÃXposedInstaller£¬ÓëÒ»¸öÌṩAPI
µÄjarÎļþÀ´Íê³ÉµÄ¡£ËùÒÔ£¬°²×°Ê¹ÓÃXposed¿ò¼ÜÎÒÃÇÐèÒªÍê³ÉÒÔϼ¸¸ö²½Ö裺
°²×°±¾µØ·þÎñXposedInstaller
ÐèÒª°²×°XposedInstall.apk±¾µØ·þÎñÓ¦Óã¬ÎÒÃÇÄܹ»ÔÚÆä¹ÙÍøµÄframeworkÀ¸Ä¿ÖÐÕÒµ½£¬ÏÂÔØ²¢°²×°¡£µØÖ·Îª£ºhttp://repo.xposed.info/module/de.robv.android.xposed.installer¡£
°²×°ºÃºó½øÈëXposedInstallerÓ¦ÓóÌÐò£¬»á³öÏÖÐèÒª¼¤»î¿ò¼ÜµÄ½çÃæ£¬ÈçÏÂͼËùʾ¡£ÕâÀïÎÒÃǵã»÷¡°°²×°/¸üС±¾ÍÄÜÍê³É¿ò¼ÜµÄ¼¤»îÁË¡£²¿·ÖÉ豸Èç¹û²»Ö§³ÖÖ±½ÓдÈëµÄ»°£¬¿ÉÒÔÑ¡Ôñ¡°°²×°·½Ê½¡±£¬ÐÞ¸ÄΪÔÚRecoveryģʽÏÂ×Ô¶¯°²×°¼´¿É¡£
ÒòΪ°²×°Ê±»á´æÔÚÐèÒªRootȨÏÞ£¬°²×°ºó»áÆô¶¯XposedµÄapp_process£¬ËùÒÔ°²×°¹ý³ÌÖÐ»á´æÔÚÉ豸¶à´ÎÖØÐÂÆô¶¯¡£
TIPS£ºÓÉÓÚ¹úÄڵIJ¿·ÖROM¶ÔXposed²»¼æÈÝ£¬Èç¹û°²×°Xposed²»³É¹¦µÄ»°£¬Ç¿ÖÆÊ¹ÓÃRecoveryдÈë¿ÉÄÜ»áÔì³ÉÉ豸·´¸´ÖØÆô¶øÎÞ·¨Õý³£Æô¶¯¡£
ÏÂÔØÊ¹ÓÃAPI¿â
ÆäAPI¿âXposedBridgeApi-.jar£¨versionÊÇXposedAPIµÄ°æ±¾ºÅ£¬ÈçÎÒÃÇÕâÀïÊÇXposedBridgeApi-54.jar£©Îļþ£¬ÎÒÃÇÄܹ»ÔÚXposedµÄ¹Ù·½Ö§³ÖxdaÂÛ̳ÕÒµ½£¬ÆäµØÖ·Îª£º
http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067¡£
ÏÂÔØÍê±ÏºóÎÒÃÇÐèÒª½«Xposed Library¸´ÖƵ½libĿ¼£¨×¢ÒâÊÇlibĿ¼£¬²»ÊÇAndroidÌṩµÄlibsĿ¼£©£¬È»ºó½«Õâ¸öjar°üÌí¼Óµ½Build
PATHÖС£

Èç¹ûÖ±½Ó½«jar°ü·ÅÖõ½ÁËlibsĿ¼Ï£¬ºÜ¿ÉÄÜ»á²úÉú´íÎó£º
¡°IllegalAccessError: Class ref in pre-verified
class resolved to unexpected implementation¡±
¹À¼ÆXposed×÷ÕßÔÚÆä¿ò¼ÜÄÚ²¿Ò²ÒýÓÃÁËBridgeApi£¬ÕâÑù²Ù×÷±ÜÃâÖØ¸´ÒýÓá£
ʵս£¬µÇ½½Ù³Ö£¨ÔÀí£©
֮ǰ¸ú´ó¼ÒҲ˵¹ýʹÓÃCydiaSubstrate½øÐÐ¹ã¸æ×¢È룬ºÜ¶àÍøÓÑÎÊÎÒ£¬³ýÁ˼òµ¥µØ×¢ÈëÒ»¸ö¹ã¸æ£¬»¹ÄÜ×öʲôÂð£¿
µÇ½½Ù³Ö£¡£¡£¡
ÄãûÌý´í£¬½ñÌìÎÒÃÇÕâÀï¾Í¼òµ¥µØÑÝʾһÏ£¬ÈçºÎ¶ÔÒ»¸öÓ¦ÓóÌÐòµÄµÇ½¹¦ÄܽøÐнٳ֣¬²¢°ÑÕ˺ÅÃÜÂë´òÓ¡³öÀ´¡£
ÈçÎÒÃdz£¼ûµÄµÇ½½Ù³Ö£¬¾ÍÊÇʹÓÃÁËHook¼¼ÊõÀ´Íê³ÉµÄ¡£ÄÇôÕâ¸öµÇ½½Ù³ÖÊÇÈçºÎÍê³ÉµÄÄØ£¿ÏÂÃæÎÒÃǾ;ßÌåÀ´¿´¿´Ò»¸öÔÚ¿ª·¢Öг£¼ûµ½µÄµÇ½Àý×Ó¡£Ê×ÏÈ£¬ÎÒÃÇ¿´¿´Ò»¸ö³£¼ûµÄµÇ½½çÃæÊÇʲôÑù×ӵġ£

Æä¶ÔÓ¦µÄµÇ½Á÷³Ì´úÂëÈçÏÂËùʾ£º
// µÇ½°´Å¥µÄonClickʼþ mLoginButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // »ñÈ¡Óû§Ãû String username = mUserEditText.getText() + ""; // »ñÈ¡ÃÜÂë String password = mPasswordEditText.getText() + ""; if (isCorrectInfo(username, password)) { Toast.makeText(MainActivity.this, "µÇ½³É¹¦£¡", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "µÇ½ʧ°Ü£¡", Toast.LENGTH_LONG).show(); } } }); |
ÎÒÃǻᷢÏÖ£¬µÇ½½çÃæÉÏÃæµÄÓû§ÐÅÏ¢¶¼ÊÇ´æ´¢ÔÚEditText¿Ø¼þÉÏ£¬È»ºóͨ¹ýÓû§ÊÖ¶¯µã»÷¡°µÇ½¡±°´Å¥²Å»á½«ÉÏÃæµÄÐÅÏ¢·¢ËÍÖÁ·þÎñÆ÷¶Ë£¬È¥ÑéÖ¤Õ˺ÅÓëÃÜÂëÊÇ·ñÕýÈ·¡£ÕâÑù¾ÍºÜ¼òµ¥ÁË£¬ºÚ¿ÍÃÇÖ»ÐèÒªÕÒµ½¿ª·¢ÕßÔÚʹÓÃEditText¿Ø¼þµÄgetText·½·¨ºó½øÐÐÍøÂçÑéÖ¤µÄ·½·¨£¬Hook¸Ã·½·¨£¬¾ÍÄܽٳֵ½Óû§µÄÕË»§ÓëÃÜÂë½ÙÁË¡£
TIPS£ºµ±È»£¬ÎÒÃÇÒ²¿ÉÒÔ·ÂÕÕÉÏ֮ǰCydiaSubstrateµÄ¹ã¸æ×¢ÈëÀý×Ó£¬×öÒ»¸öһģһÑùµÄActivity£¬ÔÚ½Ù³ÖÔActivityÓÅÏȵ¯³öÀ´£¬´ïµ½ÆÛÆÓû§»ñÈ¡ÃÜÂëµÄÄ¿µÄ¡£
¾ßÌåÁ÷³ÌÈçÏ£º

ʵս£¬µÇ½½Ù³Ö£¨±àÂ룩
Ã÷°×ÁËÔÀíÏÂÃæÎÒÃǾÍʵ¼ÊµÄ²Ù×÷Ò»´Î£¬ÕâÀïÎÒÃÇÑ¡ÔñʹÓÃXposed¿ò¼ÜÀ´²Ù×÷¡£Ê¹ÓÃXposed½øÐÐHook²Ù×÷Ö÷Òª¾ÍÊÇʹÓõ½ÁËXposedÖеÄÁ½¸ö±È½ÏÖØÒªµÄ·½·¨£¬handleLoadPackage»ñÈ¡°ü¼ÓÔØÊ±ºòµÄ»Øµ÷²¢Äõ½Æä¶ÔÓ¦µÄclassLoader£»findAndHookMethod¶ÔÖ¸¶¨ÀàµÄ·½·¨½øÐÐHook¡£ËüÃǵÄÏêϸ¶¨ÒåÈçÏÂËùʾ£º
/** * °ü¼ÓÔØÊ±ºòµÄ»Øµ÷ */ public void handleLoadPackage(final LoadPackageParam lpparam) /** * XposedÌṩµÄHook·½·¨ * * @param className ´ýHookµÄClass * @param classLoader classLoader * @param methodName ´ýHookµÄMethod * @param parameterTypesAndCallback hook»Øµ÷ * @return */ Unhook findAndHookMethod(String className, ClassLoader classLoader,
String methodName, Object... parameterTypesAndCallback) |
µ±È»£¬ÎÒÃÇʹÓÃXposed½øÐÐHookÒ²·ÖΪÈçϼ¸¸ö²½Ö裺
1. ÔÚAndroidManifest.xmlÎļþÖÐÅäÖòå¼þÃû³ÆÓëApi°æ±¾ºÅ
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="xposedmodule" android:value="true" /> <!-- Ä£¿éÃèÊö --> <meta-data android:name="xposeddescription" android:value="Ò»¸öµÇ½½Ù³ÖµÄÑùÀý" /> <!-- ×îµÍ°æ±¾ºÅ --> <meta-data android:name="xposedminversion" android:value="30" /> </application> |
2. н¨Ò»¸öÈë¿ÚÀಢ¼Ì³Ð²¢ÊµÏÖIXposedHookLoadPackage½Ó¿Ú
ÈçϲÙ×÷£¬ÎÒÃÇн¨ÁËÒ»¸öcom.example.loginhook.MainµÄÀ࣬²¢ÊµÏÖIXposedHookLoadPackage½Ó¿ÚÖеÄhandleLoadPackage·½·¨£¬½«·Çcom.example.login°üÃûµÄÓ¦ÓùýÂ˵ô£¬¼´ÎÒÃÇÖ»²Ù×÷°üÃûΪcom.example.loginµÄÓ¦Óá£ÈçÏÂËùʾ£º
public class Main implements IXposedHookLoadPackage { /** * °ü¼ÓÔØÊ±ºòµÄ»Øµ÷ */ public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { // ½«°üÃû²»ÊÇ com.example.login µÄÓ¦ÓÃÌÞ³ýµô if (!lpparam.packageName.equals("com.example.login")) return; XposedBridge.log("Loaded app: " + lpparam.packageName); } } |
3. ÉùÃ÷Ö÷Èë¿Ú·¾¶
ÐèÒªÔÚassetsÎļþ¼ÐÖÐн¨Ò»¸öxposed_initµÄÎļþ£¬²¢ÔÚÆäÖÐÉùÃ÷Ö÷Èë¿ÚÀà¡£ÈçÕâÀïÎÒÃǵÄÖ÷Èë¿ÚÀàΪcom.example.loginhook.Main¡£

4. ʹÓÃfindAndHookMethod·½·¨Hook½Ù³ÖµÇ½ÐÅÏ¢
ÕâÊÇ×îÖØÒªµÄÒ»²½£¬ÎÒÃÇ֮ǰËù·ÖÎöµÄ¶¼ÐèÒªµ½ÕâÒ»²½½øÐвÙ×÷¡£ÈçÎÒÃÇ֮ǰËù·ÖÎöµÄµÇ½³ÌÐò£¬ÎÒÃÇÐèÒª½Ù³Ö£¬¾ÍÊÇÐèÒªHookÆäcom.example.login.MainActivityÖеÄisCorrectInfo·½·¨¡£ÎÒÃÇʹÓÃXposedÌṩµÄfindAndHookMethodÖ±½Ó½øÐÐMethodHook²Ù×÷£¨ÓëCydiaºÜÀàËÆ£©¡£ÔÚÆäHook»Øµ÷ÖÐʹÓÃXposedBridge.log·½·¨£¬½«µÇ½µÄÕ˺ÅÃÜÂëÐÅÏ¢´òÓ¡ÖÁXposedµÄÈÕÖ¾ÖС£¾ßÌå²Ù×÷ÈçÏÂËùʾ£º
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; public class Main implements IXposedHookLoadPackage { /** * °ü¼ÓÔØÊ±ºòµÄ»Øµ÷ */ public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { // ½«°üÃû²»ÊÇ com.example.login µÄÓ¦ÓÃÌÞ³ýµô if (!lpparam.packageName.equals("com.example.login")) return; XposedBridge.log("Loaded app: " + lpparam.packageName); // Hook MainActivityÖеÄisCorrectInfo(String,String)·½·¨ findAndHookMethod("com.example.login.MainActivity", lpparam.classLoader, "isCorrectInfo", String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("¿ªÊ¼½Ù³ÖÁË~"); XposedBridge.log("²ÎÊý1 = " + param.args[0]); XposedBridge.log("²ÎÊý2 = " + param.args[1]); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("½Ù³Ö½áÊøÁË~"); XposedBridge.log("²ÎÊý1 = " + param.args[0]); XposedBridge.log("²ÎÊý2 = " + param.args[1]); } }); } } |
5. ÔÚXposedInstallerÖÐÆô¶¯ÎÒÃÇ×Ô¶¨ÒåµÄÄ£¿é
±àÒëºó°²×°ÔÚAndroidÉ豸ÉϵÄÄ£¿éÓ¦ÓóÌÐò²»»áÁ¢¼´µÄÉúЧ£¬ÎÒÃÇÐèÒªÔÚXpasedInstallerÄ£¿éÑ¡ÏîÖй´Ñ¡´ýÆôÓõÄÄ£¿é²ÅÄÜÈÃÆäÕý³£µÄÉúЧ¡£È磺

6. ÖØÆôÑéÖ¤
ÖØÆôAndroidÉ豸£¬½øÈëXposedInstaller²é¿´ÈÕ־ģ¿é£¬ÒòΪÎÒÃÇ֮ǰʹÓõÄÊÇXposedBridge.log·½·¨´òÓ¡log£¬ËùÒÔlog¶¼»áÏÔʾÔÚ´Ë´¦¡£ÎÒÃÇ·¢ÏÖÎÒÃÇÐèÒª½Ù³ÖµÄÕ˺ÅÃÜÂë¶¼ÏÔʾÔÙÀ´´Ë´¦¡£

TIPS£ºÕâÀïÎÒÃÇÊÇͨ¹ýÄæÏò·ÖÎö¸ÃµÇÂ½Ò³ÃæµÄµÇ¼Åжϵ÷Óú¯ÊýÀ´Íê³ÉHookÓë½Ù³Ö¹¤×÷µÄ¡£ÓÐЩ¶ÁÕßÓ¦¸ÃÏë³öÀ´ÁË£¬ÎÒÃÇÄܲ»ÄÜÖ±½ÓHookϵͳÖÐÌṩ¸øÎÒÃǵĿؼþEditText£¨ÊäÈë¿ò¿Ø¼þ£©ÖеÄgetText()·½·¨½øÐÐHookÄØ£¿ÕâÑùÎÒÃǾÍÄܹ»¶ÔϵͳÖÐËùÓеÄÊäÈë½øÐÐ¼à¿Ø½Ù³ÖÁË¡£ÕâÀïÁô¸ø´ó¼ÒÒ»¸ö˼¿¼£¬¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔ³¢ÊÔһϡ£ |