android - Xposed Framework如何在Android中 Hook 方法

标签 android security xposed rooted-device

我正在浏览 Android 中的 Xposed 框架。专门看博客-http://d3adend.org/blog/?p=589对于潜在的对策,并且有几个关于这些问题的问题。

因此,当我们使用 Xposed Hook 一个方法时,框架将该方法设为 native 并执行它想要 Hook 的代码。那么在 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

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

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

最佳答案

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

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

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

Trampoline Hook Technique (C++)

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

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

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

关于android - Xposed Framework如何在Android中 Hook 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42142894/

相关文章:

android - 设置具有更大屏幕宽高比的 Android 模拟器

security - Laravel 存储 API key 的方式是什么?

ios - kSecUseAuthenticationUISkip 如何使用

Android RIL套接字和电话加密?

java - Xpose中如何从变量中获取字符串?

Android 即时应用程序 - 不能 "Run unverified software, run arbitrary native code"。仅即时应用程序运行时

android - Android 中的 Material 形式

c - 导致安全漏洞的缓冲区溢出示例

java - Xposed 访问函数中的变量

android - 未在特定设备品牌 ZTE-Z982 N9560 上获取 SQLite 表