3

我正在通过 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->access$800
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

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

实际方法是否运行?由于挂钩的方法代码会执行,因此它不会理想地执行原始方法代码。那么我们怎么可能在知道它会被替换的情况下在相同的方法中添加一个跟踪检测机制。

4

2 回答 2

12

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

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

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

蹦床钩技术 (C++)

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

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

最好的办法是依靠本机代码来检测它,但即便如此,任何具有完全设备控制能力的坚定且经过实验的黑客最终都可以设法击败它。

于 2017-02-22T10:00:43.387 回答
1

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

  1. XC_MethodHook:方法挂钩的回调类。通常,创建此类的匿名子类,这些子类覆盖beforeHookedMethod(XC_MethodHook.MethodHookParam)和/或afterHookedMethod(XC_MethodHook.MethodHookParam).
  2. XC_MethodReplacement:XC_MethodHook 的一个特例,它完全替换了原始方法。

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

我写的几篇文章-

在 Android 中创建一个新的 Xposed 模块

在 Android 设备上安装 Xposed Framework

于 2017-03-24T13:47:15.640 回答