2017-02-09 219 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