国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android反射@hide API 方法、變量,支持Android11和Android12

這篇具有很好參考價值的文章主要介紹了Android反射@hide API 方法、變量,支持Android11和Android12。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Android源碼中現(xiàn)在有大量的方法和變量被@hide所修飾,而這些被hide修飾的方法和變量是不允許應(yīng)用層進(jìn)行反射獲取的,所以富有探索精神的程序員們就開始想盡各種辦法繞過系統(tǒng)hide限制來使用@hide修飾的方法和變量。

1、套娃(適配Android10即之前)

Android11之前我們可以使用套娃的形式來欺騙系統(tǒng),讓系統(tǒng)誤以為是系統(tǒng)調(diào)用的hide方法。而到了Android11之后,套娃就已經(jīng)失效了嘍,要尋找新的方法來和系統(tǒng)對抗。

  1. 我們通過反射 API 拿到 getDeclaredMethod 方法。getDeclaredMethod 是 public 的,不存在問題;這個通過反射拿到的方法我們稱之為元反射方法。

  1. 我們通過剛剛反射拿到元反射方法去反射調(diào)用 getDeclardMethod。這里我們就實現(xiàn)了以系統(tǒng)身份去反射的目的——反射相關(guān)的 API 都是系統(tǒng)類,因此我們的元反射方法也是被系統(tǒng)類加載的方法;所以我們的元反射方法調(diào)用的 getDeclardMethod 會被認(rèn)為是系統(tǒng)調(diào)用的,可以反射任意的方法。

例子:

Method metaGetDeclaredMethod =
        Class.class.getDeclaredMethod("getDeclardMethod"); // 公開API,無問題
Method hiddenMethod = metaGetDeclaredMethod.invoke(hiddenClass,
        "hiddenMethod", "hiddenMethod參數(shù)列表"); // 系統(tǒng)類通過反射使用隱藏 API,檢查直接通過。
hiddenMethod.invoke // 正確找到 Method 直接反射調(diào)用

代表:FreeReflection

2、源碼分析

而目前的Android11和Android12系統(tǒng)修復(fù)了這個漏洞,套娃無法在繼續(xù)使用。

所以我們只能另辟蹊徑。

系統(tǒng)在判斷調(diào)用者的時候是通過調(diào)用棧來判斷調(diào)用者的方向的,所以只要我們在調(diào)用棧上做手腳,讓系統(tǒng)誤以為不是應(yīng)用層的調(diào)用棧,即可繞過@hide限制。

static jobject Class_getDeclaredMethodInternal(JNIEnv* env, jobject javaThis, jstring name, jobjectArray args) {
  // ……
  Handle<mirror::Method> result = hs.NewHandle(
      mirror::Class::GetDeclaredMethodInternal<kRuntimePointerSize>(
          soa.Self(),
          klass,
          soa.Decode<mirror::String>(name),
          soa.Decode<mirror::ObjectArray<mirror::Class>>(args),
          GetHiddenapiAccessContextFunction(soa.Self())));
  if (result == nullptr || ShouldDenyAccessToMember(result->GetArtMethod(), soa.Self())) {
    return nullptr;
  }
  return soa.AddLocalReference<jobject>(result.Get());
}

如果ShouldDenyAccessToMember返回true,則getDeclaredMethodInternal會返回null,則上層會拋出異常。

bool VisitFrame() override REQUIRES_SHARED(Locks::mutator_lock_) {
    ArtMethod *m = GetMethod();
    ......
    ObjPtr<mirror::Class> declaring_class = m->GetDeclaringClass();
    if (declaring_class->IsBootStrapClassLoaded()) {
        ......
        // 如果 PREVENT_META_REFLECTION_BLACKLIST_ACCESS 為 Enabled,跳過來自 java.lang.reflect.* 的訪問
        // 系統(tǒng)對“套娃反射”的限制的關(guān)鍵就在此
        ObjPtr<mirror::Class> proxy_class = GetClassRoot<mirror::Proxy>();
        if (declaring_class->IsInSamePackage(proxy_class) && declaring_class != proxy_class) {
            if (Runtime::Current()->isChangeEnabled(kPreventMetaReflectionBlacklistAccess)) {
                return true;
            }
        }
    }

    caller = m;
    return false;
}

套娃為什么會失效,原因就在VisitFrame中

3、重點來了--解決方案(適配Anroid11&Android12)

我們解決方法的方向就是破壞調(diào)用堆棧,讓系統(tǒng)無法識別api的真正調(diào)用者。

具體做法:

  1. 通過在jni層創(chuàng)建線程來執(zhí)行真正的反射操作,當(dāng)然,只是這樣還不足以欺騙系統(tǒng)。

  1. 通過對線程調(diào)用attachthread方法來改變調(diào)用堆棧,從而達(dá)到欺騙系統(tǒng)的目的。google對attachthread的部分講解:https://developer.android.com/training/articles/perf-jni?hl=zh-cn

4、源碼

話不多說,直接上源碼:

1、通過async來創(chuàng)建線程,因為async可以返回future來把異步同步化,線程內(nèi)執(zhí)行g(shù)etDeclaredField_internal

Java_com_macoli_reflect_1helper_NativeReflect_getDeclaredField(JNIEnv *env, jobject t,
                                                               jclass clz, jstring fieldName) {
    auto global_clazz = env->NewGlobalRef(clz);
    jstring global_method_name = static_cast<jstring>(env->NewGlobalRef(fieldName)) ;
? ? //通過async來創(chuàng)建線程,因為async可以返回future來把異步同步化,線程內(nèi)執(zhí)行g(shù)etDeclaredField_internal
    auto future = std::async(&getDeclaredField_internal, global_clazz, global_method_name);
    auto result = future.get();

    env->DeleteGlobalRef(global_clazz) ;
    env->DeleteGlobalRef(global_method_name) ;

    return result ;
}

2、真正執(zhí)行反射操作

關(guān)鍵:attachCurrentThread()來對調(diào)用堆棧進(jìn)行轉(zhuǎn)變。


JNIEnv *attachCurrentThread() {
    JNIEnv *env;
    int res = _vm->AttachCurrentThread(&env, nullptr);
    __android_log_print(ANDROID_LOG_DEBUG, "native", "Found attached %d", res);
    return env;
}

void detachCurrentThread() {
    _vm->DetachCurrentThread();
}


static jobject getDeclaredField_internal(jobject object, jstring field_name) {

    JNIEnv *env = attachCurrentThread();//這里是重點

    jclass clazz_class = env->GetObjectClass(object);
    jmethodID methodId = env->GetMethodID(clazz_class, "getDeclaredField",
                                          "(Ljava/lang/String;)Ljava/lang/reflect/Field;");
    jobject res = env->CallObjectMethod(object, methodId, field_name);
    jobject global_res = nullptr;
    if (res != nullptr) {
        global_res = env->NewGlobalRef(res);
    }

    detachCurrentThread();
    return global_res;
}

測試:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.reflect_btn).setOnClickListener(v -> {
            try {

                 /** {@hide} */
                 /*
                public void setTraceTag(long traceTag) {
                    mTraceTag = traceTag;
                }
                * */
                Method m = ReflectHelper.getDeclaredMethod(Looper.class , "setTraceTag" , new Class[]{long.class}) ;
                m.invoke(Looper.getMainLooper() , 1000) ;
                Log.d("gggl" , "setTraceTag " + m.toString()) ;

                Class<?> activityThreadCls = Class.forName("android.app.ActivityThread") ;
                Field f = ReflectHelper.getDeclaredField(activityThreadCls , "DEBUG_BROADCAST") ;
                Object tag = f.get(null) ;
                Log.d("gggl" , f.toString()) ;
                Log.d("gggl" , tag.toString()) ;
//                CpuUsageInfo cpuUsageInfo = new CpuUsageInfo() ;
                /** @hide */
                /*public CpuUsageInfo(long activeTime, long totalTime) {
                    mActive = activeTime;
                    mTotal = totalTime;
                }*/
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    Constructor cpuUsageInfoConstructor = ReflectHelper.getDeclaredConstructor(CpuUsageInfo.class , new Class[]{long.class , long.class}) ;
                    Object cpuUsageObj = cpuUsageInfoConstructor.newInstance(100 , 100) ;
                    Method getTotalM = CpuUsageInfo.class.getDeclaredMethod("getTotal") ;
                    Object r = getTotalM.invoke(cpuUsageObj) ;
                    Log.d("gggl" , "getTotal = " + r) ;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

華為mate 40 pro 測試結(jié)果:

Android反射@hide API 方法、變量,支持Android11和Android12

總結(jié):

源碼已上傳到gitee:https://gitee.com/gggl/reflect_helper

Android反射@hide API 方法、變量,支持Android11和Android12

反射Android @hide api 適配

Android11&Android12文章來源地址http://www.zghlxwxcb.cn/news/detail-507349.html

到了這里,關(guān)于Android反射@hide API 方法、變量,支持Android11和Android12的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Android多屏幕支持-Android12

    Android多屏幕支持-Android12

    android12-release AOSP 文檔 心主題 多屏幕概覽 術(shù)語 在這些文章中,主屏幕和輔助屏幕的定義如下: 主(默認(rèn))屏幕的 屏幕 ID 為 DEFAULT_DISPLAY 輔助屏幕的 屏幕 ID 不是 DEFAULT_DISPLAY 主題區(qū)域 文章 開發(fā)和測試 推薦做法 測試和開發(fā)環(huán)境 常見問題解答 相關(guān)文章集 顯示 系統(tǒng)裝飾支持

    2024年02月13日
    瀏覽(24)
  • 關(guān)于Android 11、12和13服務(wù)?;顔栴}

    關(guān)于Android 11、12和13服務(wù)?;顔栴}

    物聯(lián)網(wǎng)環(huán)境,為了解決不同廠商、不同設(shè)備、不同網(wǎng)絡(luò)情況下使用順暢,同時也考慮到節(jié)約成本,縮小應(yīng)用體積的好處,我們需要一個服務(wù)應(yīng)用一直存在系統(tǒng)中,?;钏蕴峁┓?wù)給其他客戶端調(diào)用。 開機自啟動,通過廣播通信, 必要權(quán)限 開機自啟動Service相關(guān)代碼 注意

    2023年04月08日
    瀏覽(24)
  • Android文件選擇器 路徑選擇 支持安卓4.4 ~ 13 支持Android/data目錄訪問 支持SD卡 適配Android11

    Android文件選擇器 路徑選擇 支持安卓4.4 ~ 13 支持Android/data目錄訪問 支持SD卡 適配Android11

    Android上進(jìn)行文件選擇或操作的第三方庫,自動申請存儲權(quán)限,支持 Android4.4 ~ 13,再也不用為了適配各種版本而苦惱了,快速集成,一句代碼搞定,完善的文檔,支持無root權(quán)限訪問和操作Android/data和Android/obb目錄(適配Android 13),支持SD卡,高度自定義UI滿足你的所有需求,使用非常

    2024年02月04日
    瀏覽(25)
  • Android RK3588-12 hdmi-in Camera方式最大支持3個

    ? hdmi-in Camera最大支持3個 ? ? modified: ? hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp ? ? modified: ? hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp ? ? modified: ? hardware/interfaces/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h ? ? modified:

    2024年02月08日
    瀏覽(33)
  • 11、Java 變量作用域、構(gòu)造方法官方教程

    11、Java 變量作用域、構(gòu)造方法官方教程

    Java 中的變量有3種: ?? ① 全局變量:被定義在類中( 成員變量 ) ?? ② 局部變量: 被定義在成員方法、代碼塊、靜態(tài)代碼塊中定義的變量 ?? ③ 參數(shù):方法聲明中的變量 There are several kinds of variables (變量): ?? Member variables (成員變量) in a class:these are called fields(屬

    2023年04月08日
    瀏覽(27)
  • 無涯教程-jQuery - hide( speed, callback)方法函數(shù)

    hide(speed,[callback])方法使用優(yōu)美的動畫隱藏所有匹配的元素,并在完成后觸發(fā)可選的回調(diào)。 這是此方法使用的所有參數(shù)的描述- speed? ? ? -? 代表三個預(yù)定義速度(\\\"slow\\\",\\\"normal\\\"或\\\"fast\\\")之一或運行動畫的毫秒數(shù)(如1000)的字符串)。 callback -? 這是可選參數(shù),表示動畫制作完成后要

    2024年02月15日
    瀏覽(18)
  • 讓chrome支持小于12px-的文字方式(多種方法)

    讓chrome支持小于12px-的文字方式(多種方法)

    Chrome 中文版瀏覽器會默認(rèn)設(shè)定頁面的最小字號是12px,英文版沒有限制 原由 Chrome 團(tuán)隊認(rèn)為漢字小于12px就會增加識別難度 中文版瀏覽器 與網(wǎng)頁語言無關(guān),取決于用戶在Chrome的設(shè)置里(chrome://settings/languages)把哪種語言設(shè)置為默認(rèn)顯示語言 系統(tǒng)級最小字號 瀏覽器默認(rèn)設(shè)定頁面

    2024年02月20日
    瀏覽(13)
  • 【flink番外篇】9、Flink Table API 支持的操作示例(12)- Over Windows(有界和無界的over window)操作

    一、Flink 專欄 Flink 專欄系統(tǒng)介紹某一知識點,并輔以具體的示例進(jìn)行說明。 1、Flink 部署系列 本部分介紹Flink的部署、配置相關(guān)基礎(chǔ)內(nèi)容。 2、Flink基礎(chǔ)系列 本部分介紹Flink 的基礎(chǔ)部分,比如術(shù)語、架構(gòu)、編程模型、編程指南、基本的datastream api用法、四大基石等內(nèi)容。 3、

    2024年02月02日
    瀏覽(27)
  • 【flink番外篇】9、Flink Table API 支持的操作示例(11)- Group Windows(tumbling、sliding和session)操作

    一、Flink 專欄 Flink 專欄系統(tǒng)介紹某一知識點,并輔以具體的示例進(jìn)行說明。 1、Flink 部署系列 本部分介紹Flink的部署、配置相關(guān)基礎(chǔ)內(nèi)容。 2、Flink基礎(chǔ)系列 本部分介紹Flink 的基礎(chǔ)部分,比如術(shù)語、架構(gòu)、編程模型、編程指南、基本的datastream api用法、四大基石等內(nèi)容。 3、

    2024年02月01日
    瀏覽(31)
  • 如何通過Android平臺的API實現(xiàn)5G網(wǎng)絡(luò)的支持 安卓系統(tǒng)版本和5g網(wǎng)絡(luò)相關(guān)【一】

    如何通過Android平臺的API實現(xiàn)5G網(wǎng)絡(luò)的支持 安卓系統(tǒng)版本和5g網(wǎng)絡(luò)相關(guān)【一】

    前面分享了兩篇5G基帶相關(guān)的移植修改博文。 安卓高通機型的基帶移植 修改 編譯的相關(guān) 增加信號 支持5G等【一】 安卓高通機型的基帶移植 修改 編譯的相關(guān) 增加信號 支持5G等【二】 今天的帖子聊聊安卓版本與5G網(wǎng)絡(luò)與機型和修改之間相關(guān)的話題。眾所周知,目前的機型基本

    2024年02月09日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包