亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

繞過Android P以上非公開API限制的辦法是什么

發布時間:2021-12-18 16:14:01 來源:億速云 閱讀:199 作者:iii 欄目:移動開發

這篇文章主要介紹“繞過Android P以上非公開API限制的辦法是什么”,在日常操作中,相信很多人在繞過Android P以上非公開API限制的辦法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”繞過Android P以上非公開API限制的辦法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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

然后,我們通過剛剛反射拿到元反射方法去反射調用 getDeclardMethod。這里我們就實現了以系統身份去反射的目的——反射相關的 API  都是系統類,因此我們的元反射方法也是被系統類加載的方法;所以我們的元反射方法調用的 getDeclardMethod  會被認為是系統調用的,可以反射任意的方法。

偽代碼如下:

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

到這里,我們已經能通過「元反射」的方式去任意獲取隱藏方法或者隱藏 Field 了。但是,如果我們所有使用的隱藏方法都要這么干,那還有點小麻煩。在  上文中,我們后來發現,隱藏 API 調用還有「豁免」條件,具體代碼如下:

if (shouldWarn || action == kDeny) {     if (member_signature.IsExempted(runtime->GetHiddenApiExemptions())) {       action = kAllow;       // Avoid re-examining the exemption list next time.       // Note this results in no warning for the member, which seems like what one would expect.       // Exemptions effectively adds new members to the whitelist.       MaybeWhitelistMember(runtime, member);       return kAllow;     }     // 略     }

只要 IsExempted 方法返回 true,就算這個方法在黑名單中,依然會被放行然后允許被調用。我們再觀察一下IsExempted方法:

bool MemberSignature::IsExempted(const std::vector<std::string>& exemptions) {   for (const std::string& exemption : exemptions) {     if (DoesPrefixMatch(exemption)) {       return true;     }   }   return false; }

繼續跟蹤傳遞進來的參數 runtime->GetHiddenApiExemptions() 發現這玩意兒也是 runtime  里面的一個參數,既然如此,我們可以一不做二不休,仿照修改 runtime flag 的方式直接修改 hidden_api_exemptions_  也能繞過去。但如果我們繼續跟蹤下去,會有個有趣的發現:這個API 竟然是暴露到 Java 層的,有一個對應的  VMRuntime.setHiddenApiExemptions Java方法;也就是說,只要我們通過  VMRuntime.setHiddenApiExemptions 設置下豁免條件,我們就能愉快滴使用反射了。

再結合上面這個方法,我們只需要通過 「元反射」來反射調用 VMRuntime.setHiddenApiExemptions 就能將我們自己要使用的隱藏  API 全部都豁免掉了。更進一步,如果我們再觀察下上面的 IsExempted 方法里面調用的  DoesPrefixMatch,發現這玩意兒在對方法簽名進行前綴匹配;童鞋們,我們所有Java方法類的簽名都是以 L開頭啊!如果我們把直接傳個  L進去,所有的隱藏API全部被赦免了!

到此,關于“繞過Android P以上非公開API限制的辦法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巧家县| 金坛市| 皋兰县| 南靖县| 九台市| 张家港市| 治多县| 湟中县| 新乡市| 睢宁县| 丹凤县| 分宜县| 保定市| 红原县| 溧阳市| 民县| 通海县| 疏勒县| 伊春市| 镇雄县| 钟山县| 娄底市| 扎囊县| 噶尔县| 九龙坡区| 镇安县| 尼勒克县| 黄骅市| 永济市| 吴堡县| 普格县| 高唐县| 苍南县| 伊通| 城固县| 临湘市| 砀山县| 密云县| 镇安县| 葫芦岛市| 阿坝县|