Android Xposed Framework 如何挂钩方法

How does Xposed Framework hook methods in Android

我正在 Android 中学习 Xposed 框架。专门阅读博客 - http://d3adend.org/blog/?p=589 以了解潜在的对策,并在这些方面有几个问题。

因此,当我们使用 Xposed 挂钩一个方法时,框架将该方法设为本机并执行它想要挂钩的代码。那么在 stacktrace 中原始方法是如何被调用的呢?

com.example.hookdetection.DoStuff->getSecret    //This one
de.robv.android.xposed.XposedBridge->invokeOriginalMethodNative
de.robv.android.xposed.XposedBridge->handleHookedMethod
com.example.hookdetection.DoStuff->getSecret    //This one again
com.example.hookdetection.MainActivity->onCreate
android.app.Activity->performCreate
android.app.Instrumentation->callActivityOnCreate
android.app.ActivityThread->performLaunchActivity
android.app.ActivityThread->handleLaunchActivity
android.app.ActivityThread->access0
android.app.ActivityThread$H->handleMessage
android.os.Handler->dispatchMessage
android.os.Looper->loop
android.app.ActivityThread->main
java.lang.reflect.Method->invokeNative
java.lang.reflect.Method->invoke
com.android.internal.os.ZygoteInit$MethodAndArgsCaller->run
com.android.internal.os.ZygoteInit->main
de.robv.android.xposed.XposedBridge->main
dalvik.system.NativeStart->main

还有为什么它在堆栈跟踪中出现两次。我想了解它们的执行顺序。

实际方法是运行吗?由于钩子方法代码执行它不会理想地执行原始方法代码。那么我们怎么可能在知道它会被替换的相同方法中添加一个 stracktrace 检测机制。

如果您对低级代码和 android 内核不满意,那么 Xposed 的内部工作原理并不容易理解。简而言之,当您在 Android 设备上打开应用程序时,有一个名为 Zygote 的主进程会将其作为子进程生成。

Xposed 的目的是能够控制 Zygote 并检测何时将要产生一个进程,以便有人能够在对它们进行任何调用之前通过替换它们的定义来挂钩方法。

通过使用 Xposed 你有很多控制权,你可以替换整个方法体,所以原始代码永远不会被调用,或者你可以使用 beforeCall 和 afterCall 挂钩,这基本上是蹦床技术的一种用法(A C++下面的示例)

正如你所看到的,当一个方法被调用时,它不会直接转到原始代码,而是转到一个注入的代码块,在那里有人可以做任何他想做的事情(转储、更改参数等),然后它会跳回去到真正的代码。您也可以在真正的代码之后执行此操作,以便获得方法输出。 Xposed 通过使用 beforeHookedMethodafterHookedMethod.

来实现这一点

添加堆栈跟踪检测机制根本无济于事。您将调用 Java 方法来获取实际的堆栈跟踪。它可以通过挂钩 getStacktrace 方法轻松击败,保存有效的真实堆栈跟踪,然后在调用 getStackTrace 并包含 Xpo​​sed 方法时,return 先前保存的真实堆栈跟踪。

您最好的选择是依靠本机代码来检测它,但即便如此,任何坚定且经过试验并拥有完全设备控制权的黑客最终都可以设法击败它。

要在调用 XposedHelpers.findAndHookMethod 时添加以上几点,回调可以是 -

  1. XC_MethodHook : 方法挂钩的回调 class。通常,创建这个 class 的匿名子 classes 来覆盖 beforeHookedMethod(XC_MethodHook.MethodHookParam) and/or afterHookedMethod(XC_MethodHook.MethodHookParam)
  2. XC_MethodReplacement : XC_MethodHook 的特例,完全替代了原来的方法。

第一个只是为您提供了在原始方法之前和之后执行方法的挂钩,而第二个则完全替换了它。例如 - Xposed example on github

我写了几个帖子 -

Creating a new Xposed module in Android

Installing Xposed Framework on Android devices