Android Studio Xposed模塊編寫(一)


1、環境說明

  本文主要參考https://my.oschina.net/wisedream/blog/471292?fromerr=rNPFQidG的內容,自己實現了一遍,侵權請告知

  已經安裝xposed Installer的nexus5一台,Xposed Installer版本2.7 experimental1, Android 版本4.4.4

  開發環境Android Studio 2.2.3

  庫版本 XposedBridgeApi-54.jar

2、開發流程

  1、拷貝XposedBridgeApi-54.jar到新建工程的libs目錄

  2、修改app目錄下的build.gradle文件,在AndroidManifest.xml中增加Xposed相關內容

  3、新建hook類,編寫hook代碼

  4、在app上右鍵新建assets folder,然后在assets目錄下新建文件xposed_init,在里面寫上hook類的完整路徑

3、Hook模塊編寫

1、新建Android studio工程,選擇無activity,並將XposedBridgeApi-54.jar拷貝到libs目錄下,然后雙擊app目錄下的build.gradle文件,將

compile fileTree(include: ['*.jar'], dir: 'libs')
替換為
provided fileTree(include: ['*.jar'], dir: 'libs')

2、修改AndroidManifest.xml文件,在Application標簽下增加內容如下

        <meta-data
            android:name="xposedmodule"
            android:value="true" />
        <meta-data
            android:name="xposeddescription"
            android:value="模塊描述" />
        <meta-data
            android:name="xposedminversion"
            android:value="54" />

 

3、新建hook類,命名為XMdodule,內容如下

public class XModule implements IXposedHookLoadPackage{

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if(loadPackageParam.packageName.equals("com.example.test")){
            XposedBridge.log("XLZH " + loadPackageParam.packageName);
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                    return "this is imei";
                }
            });
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                    return "this is imsi";
                }
            });
        }
    }
}

代碼功能是hook 系統TelephonyManager類的getDeviceId()和getSubscriberId()方法,返回字符串,而且只hook com.example.test應用。

4、新建assets目錄,在其中新建文本xposed_init,里面內容為

com.zcgames.xposedtest.XModule

最后的目錄結構如下圖所示

4、Hook目標應用編寫

Android Studio新建com.example.test應用,MainActivity.java內容如下

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.getImei);

        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
                try {
                    Log.d("XLZH", "get imei " + tm.getDeviceId());
                    Log.d("XLZH", "get imsi " + tm.getSubscriberId());
                }catch (Exception e) {
                    Log.d("XLZH", e.getMessage());
                    e.printStackTrace();
                }
            }
        });
    }
}

5、實施Hook

1、XposedTest工程編寫完成后,點擊Build-Build Apk(因為沒有Activity,所以無法點擊運行自動安裝),build成功后,在app/build/output/apk目錄下生成app-debug.apk,點擊as下發的Terminal,進入該目錄使用adb install安裝即可

2、com.example.test工程完成后,點擊run運行,點擊按鈕,使用logcat | grep XLZH,查看結果如下

3,打開xposed Installer應用,選擇模塊,可以看到XposedTest模塊,選中,然后重啟手機,再次打開目標應用,點擊按鈕,結果如下所示,hook成功

6、幾個小坑

1、xposed加載模塊失敗,在xposed installer的log中看到提示如下

     java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

     原因:因為沒有修改build.gradle文件,默認libs目錄下的內容會被包僅apk中,導致和手機上原有的發生了沖突,在build.gradle中把compile修改成provided即可。

2、xposed_init中區分大小寫,例如com.zcgames.xposedtest.XModule修改成com.zcgames.XposedTest.XModule,也會導致模塊加載失敗

3、模塊安裝后再次使用adb install安裝時,提供程序已經安裝,需要到設置->應用中找到安裝的模塊進行卸載(沒有activity,無法在桌面卸載)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM