Android Hook 借助Xposed

时间:2020-11-26 04:28:53

主要就是使用到了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的应用。如下所示:

  1. public class Main implements IXposedHookLoadPackage {
  2. /**
  3. * 包加载时候的回调
  4. */
  5. public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
  6. // 将包名不是 com.example.login 的应用剔除掉
  7. if (!lpparam.packageName.equals("com.example.login"))
  8. return;
  9. XposedBridge.log("Loaded app: " + lpparam.packageName);
  10. }
  11. }

. 声明主入口路径

需要在assets文件夹中新建一个xposed_init的文件,并在其中声明主入口类。如这里我们的主入口类为com.example.loginhook.Main。

Android Hook 借助Xposed

使用findAndHookMethod方法Hook劫持登陆信息

这是最重要的一步,我们之前所分析的都需要到这一步进行操作。如我们之前所分析的登陆程序,我们需要劫持,就是需要Hook其com.example.login.MainActivity中的isCorrectInfo方法。我们使用Xposed提供的findAndHookMethod直接进行MethodHook操作(与Cydia很类似)。在其Hook回调中使用XposedBridge.log方法,将登陆的账号密码信息打印至Xposed的日志中。具体操作如下所示:

  1. import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
  2. public class Main implements IXposedHookLoadPackage {
  3. /**
  4. * 包加载时候的回调
  5. */
  6. public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
  7. // 将包名不是 com.example.login 的应用剔除掉
  8. if (!lpparam.packageName.equals("com.example.login"))
  9. return;
  10. XposedBridge.log("Loaded app: " + lpparam.packageName);
  11. // Hook MainActivity中的isCorrectInfo(String,String)方法
  12. findAndHookMethod("com.example.login.MainActivity", lpparam.classLoader, "isCorrectInfo", String.class,
  13. String.class, new XC_MethodHook() {
  14. @Override
  15. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  16. XposedBridge.log("开始劫持了~");
  17. XposedBridge.log("参数1 = " + param.args[0]);
  18. XposedBridge.log("参数2 = " + param.args[1]);
  19. }
  20. @Override
  21. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  22. XposedBridge.log("劫持结束了~");
  23. XposedBridge.log("参数1 = " + param.args[0]);
  24. XposedBridge.log("参数2 = " + param.args[1]);
  25. }
  26. });
  27. }