標籤:
主要就是使用到了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)
<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>
建立一個入口類並繼承並實現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);
- }
- }
. 聲明主入口路徑
需要在assets檔案夾中建立一個xposed_init的檔案,並在其中聲明主入口類。如這裡我們的主入口類為com.example.loginhook.Main。
使用findAndHookMethod方法Hook劫持登陸資訊
這是最重要的一步,我們之前所分析的都需要到這一步進行操作。如我們之前所分析的登陸程式,我們需要劫持,就是需要Hook其com.example.login.MainActivity中的isCorrectInfo方法。我們使用Xposed提供的findAndHookMethod直接進行MethodHook操作(與Cydia很類似)。在其Hook回調中使用XposedBridge.log方法,將登陸的帳號密碼資訊列印至Xposed的日誌中。具體操作如下所示:
[java] view plaincopy
- 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]);
-
- }
- });
- }
Android Hook 藉助Xposed