<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## jvmti ### 原理 本質是?JVMTI 本質上是在JVM內部的許多事件進行了埋點,包括內存申請、線程創建、類加載、GC信息、方法執行等,也可以控制JVM的某些行為 C/C++實現一個JVMTI Agent,在Agent里面注冊一些JVM事件的回調。當事件發生時JVMTI調用這些回調方法。Agent可以在回調方法里面實現自己的邏輯。 ### 功能 1.重新定義類 2.跟蹤對象分配和垃圾回收過程 3.遵循對象的引用樹,遍歷堆中的所有對象 4.檢查 Java 調用堆棧 5.暫停(和恢復)所有線程 ### 優點 1. Google自家推出,其穩定性和后續的維護更新可以得到保障,功能強大 ### 缺點 1. Android9.0開放 2. Debug可用 3. 影響性能 ### 實現 ### java實現 ``` //加載so ?System.load(agentPath); //加載jvmti Debug.attachJvmtiAgent(agentPath,null,getClassLoader()); //系統最終從加載的庫中尋找Agent\_xx方法,即回調so內部的Agent\_XX方法 ``` ![](https://img.kancloud.cn/b4/e6/b4e659568c42d292ae32a15ca9685ce8_969x516.png) ### nativa實現 ~~~ #include <jni.h> #include <string> #include "jvmti.h" #include "utils.h" jvmtiEnv *mJvmtiEnv = NULL; jlong tag = 0; //初始化工作 extern "C" JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM *vm, char *options, void *reserved) { //準備jvmti環境 vm->GetEnv(reinterpret_cast<void **>(&mJvmtiEnv), JVMTI_VERSION_1_2); //開啟jvmti的能力 jvmtiCapabilities caps; //獲取所有的能力 mJvmtiEnv->GetPotentialCapabilities(&caps); mJvmtiEnv->AddCapabilities(&caps); return JNI_OK; } //調用System.Load()后會回調該方法 extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env; if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } return JNI_VERSION_1_6; } void JNICALL objectAlloc(jvmtiEnv *jvmti_env, JNIEnv *jni_env, jthread thread, jobject object, jclass object_klass, jlong size) { //對象創建 } void JNICALL objectFree(jvmtiEnv *jvmti_env, jlong tag) { //對象釋放 } void JNICALL methodEntry(jvmtiEnv *jvmti_env,JNIEnv* jni_env,jthread thread,jmethodID method) { //方法進入 } void JNICALL methodExit(jvmtiEnv *jvmti_env,JNIEnv* jni_env,jthread thread,jmethodID method,jboolean was_popped_by_exception, jvalue return_value) { //方法退出 } extern "C" JNIEXPORT void JNICALL Java_com_hly_memorymonitor_Monitor_agent_1init(JNIEnv *env, jclass jclazz) { //開啟jvm事件監聽 jvmtiEventCallbacks callbacks; memset(&callbacks, 0, sizeof(callbacks)); callbacks.MethodEntry = &methodEntry; callbacks.MethodExit = &methodExit; callbacks.VMObjectAlloc = &objectAlloc; callbacks.ObjectFree = &objectFree; //設置回調函數 mJvmtiEnv->SetEventCallbacks(&callbacks, sizeof(callbacks)); //開啟監聽 mJvmtiEnv->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL); mJvmtiEnv->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, NULL); mJvmtiEnv->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_ENTRY, NULL); mJvmtiEnv->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_EXIT, NULL); env->ReleaseStringUTFChars(_path, path); } extern "C" JNIEXPORT void JNICALL Java_com_hly_memorymonitor_Monitor_agent_1release(JNIEnv *env, jclass clazz) { mJvmtiEnv->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL); mJvmtiEnv->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_OBJECT_FREE, NULL); mJvmtiEnv->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_METHOD_ENTRY, NULL); mJvmtiEnv->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_METHOD_EXIT, NULL); } ~~~ 1.在Agent\_OnAttach()內部初始化,準備jvmti環境,開啟及獲取能力; 2.在xx\_agent\_1init()內部,開啟jvmti事件監聽,設置需要關注的回調(該回調在jvmti.h內部有詳細的定義,設置需要關注的即可,本案例關注了JVMTI\_EVENT\_VM\_OBJECT\_ALLOC、JVMTI\_EVENT\_OBJECT\_FREE、JVMTI\_EVENT\_OBJECT\_FREE、JVMTI\_EVENT\_METHOD\_EXIT),執行SetEventNotificationMode JVMTI\_ENABLE 開啟監聽; 3.在xx\_agent\_1release()內部,執行SetEventNotificationMode JVMTI\_DISABLE 關閉監聽; ## epic 原理是通過修改ArtMethod的入口函數,把入口函數的前8個字節修改為一段跳轉指令,跳轉到執行hook操作的函數,原理跟阿里的熱修復框架AndFix差不多,如下圖所示。 ![](https://img.kancloud.cn/b9/6d/b96d6504a2eb9a6ffa636e31b0cd7ffd_1240x850.png) 1. 受限于 inline hook 本身,短方法 (Thumb-2 下指令小于 8 個字節,ARM64 小于 16 字節) 無法支持。 2. 被完全內聯的方法不支持。 # 參考資料 [ASM hook隱私方法調用,防止App被下架](https://juejin.cn/post/7043399520486424612) [我為Dexposed續一秒——論ART上運行時 Method AOP實現](https://weishu.me/2017/11/23/dexposed-on-art/) [Android JVMTI實現應用內存動態檢測](https://www.jianshu.com/p/ab7bbc319dd9)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看