2017-02-09 169 views
1

我正在通过Android中的Xposed框架。具体阅读博客 - http://d3adend.org/blog/?p=589潜在的对策,并在这些线上有几个问题。Xposed框架如何在Android中挂钩方法

因此,当我们使用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 

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

实际的方法是否运行?由于挂钩的方法代码执行,它不会理想地执行原始方法代码。那么我们如何能够以相同的方法添加一个stracktrace检测机制,并知道它将被替换。

回答

7

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

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

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

Trampoline Hook Technique (C++)

正如你可以看到当一个方法被调用它不直接去原代码,但到注入代码块中的人可以做任何他想要的(转储,更改参数等),那么它将跳回到真正的代码。您也可以在真正的代码之后执行此操作,以便获得方法输出。 Xposed通过在挂钩方法和之前使用来执行此操作。挂钩方法

添加栈跟踪检测机制根本无济于事。您将调用Java方法来获取实际的堆栈跟踪。通过钩住getStacktrace方法,保存一个有效的真正堆栈跟踪,然后当getStackTrace被调用并包含Xposed方法时,它可以很容易地被击败,返回以前保存的真正的堆栈跟踪。

最好的办法是依靠本机代码来检测它,但即使如此,任何确定和实验的黑客,完全的设备控制,可以设法最终击败它。

+0

你能解释一下这部分“这个扩展的启动过程中增加了一个额外的jar到classpath,并呼吁从那里方法某些地方“来自xposed教程。 https://github.com/rovo89/XposedBridge/wiki/Development-tutorial – Suraj

1

要添加到上述各点,当你调用XposedHelpers.findAndHookMethod回调可以是 -

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

第一个只是为您提供挂钩来执行原始方法之前和之后的方法,其中第二个完全替代它。EG - Xposed example on github

夫妇我已经写了帖子 -

Creating a new Xposed module in Android

Installing Xposed Framework on Android devices