av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

Android 繞過反射黑名單的方法

瀏覽:27日期:2022-09-20 18:11:12
限制原理

Google 從 Android P 開始引入了針對非公開 API 的限制,這一點可以從 Native 相關的源碼中找到限制的原理,從而從中找到解決辦法,不過非必要原因不太建議去挑戰這種限制,畢竟不清楚在后續的版本中會不會做限制,維護起來挺麻煩的。

在 Native 層有幾個訪問級別:

class HiddenApiAccessFlags { public: enum ApiList { kWhitelist = 0, kLightGreylist, kDarkGreylist, kBlacklist, };}

另外還有幾個對應的響應級別:

enum Action { kAllow, //通過 kAllowButWarn, //通過,但日志警告 kAllowButWarnAndToast, //通過,且日志警告和彈窗 kDeny //拒絕訪問};

這里介紹一下網上的一些解決方式,此外,還可以把我們調用了反射方法的類的類加載器設置為系統類加載器,這樣就可以繞過 Native 層的限制了。

系統類偽裝

黑名單在系統中有一個 fn_caller_is_trusted 的條件:如果調用者是系統類,那么就允許被調用。即如果我們能以系統類的身份去反射,那么就能暢通無阻:

首先通過反射 API 拿到 getDeclaredMethod 方法。getDeclaredMethod 是 public 的,不存在問題;這個通過反射拿到的方法網上稱之為元反射方法。 然后通過剛剛的元反射方法去反射調用 getDeclardMethod。這里我們就實現了以系統身份去反射的目的——反射相關的 API 都是系統類,因此我們的元反射方法也是被系統類加載的方法;所以我們的元反射方法調用的 getDeclardMethod 會被認為是系統調用的,可以反射任意的方法。

偽代碼如下:

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

隱藏 API 的調用有「豁免」條件,即只要它是豁免的,則即使它在黑名單中,也會被放行。這種方式暴露給了 Java 層,因此可以通過 VMRuntime.setHiddenApiExemptions 方法來實現。再結合上面這個方法,我們只需要通過 「元反射」 來反射調用 VMRuntime.setHiddenApiExemptions 就能將我們自己要使用的隱藏 API 全部都豁免掉了。另外系統在檢查豁免時是通過方法簽名進行前綴匹配的,而 Java 方法簽名都是 L 開頭的,因此我們可以把直接傳個 L 進去,那么所有的隱藏API全部被赦免了!

源碼直接參考網上大佬的開源項目: FreeReflection。

public final class BootstrapClass { private static final String TAG = 'BootstrapClass'; private static Object sVmRuntime; private static Method setHiddenApiExemptions; static { if (SDK_INT >= Build.VERSION_CODES.P) { try {Method forName = Class.class.getDeclaredMethod('forName', String.class);Method getDeclaredMethod = Class.class.getDeclaredMethod('getDeclaredMethod', String.class, Class[].class);Class<?> vmRuntimeClass = (Class<?>) forName.invoke(null, 'dalvik.system.VMRuntime');Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, 'getRuntime', null);setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, 'setHiddenApiExemptions', new Class[]{String[].class});sVmRuntime = getRuntime.invoke(null); } catch (Throwable e) {Log.w(TAG, 'reflect bootstrap failed:', e); } } } /** * make the method exempted from hidden API check. * * @param method the method signature prefix. * @return true if success. */ public static boolean exempt(String method) { return exempt(new String[]{method}); } /** * make specific methods exempted from hidden API check. * * @param methods the method signature prefix, such as 'Ldalvik/system', 'Landroid' or even 'L' * @return true if success */ public static boolean exempt(String... methods) { if (sVmRuntime == null || setHiddenApiExemptions == null) { return false; } try { setHiddenApiExemptions.invoke(sVmRuntime, new Object[]{methods}); return true; } catch (Throwable e) { return false; } } /** * Make all hidden API exempted. * * @return true if success. */ public static boolean exemptAll() { return exempt(new String[]{'L'}); }}

以上就是Android 繞過反射黑名單的方法的詳細內容,更多關于Android 繞過反射黑名單的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: av毛片| 免费在线国产视频 | 国产精品色 | www.亚洲精品 | 久久新视频 | 最新日韩在线视频 | 亚洲一区| a在线观看 | 亚洲国产精品一区二区www | 日本一区二区三区精品视频 | 91麻豆精品国产91久久久久久 | 成人精品鲁一区一区二区 | 欧美激情va永久在线播放 | 91久久久久久久久久久 | 最新国产精品 | av网站免费在线观看 | 91在线最新 | 久久久久久久av麻豆果冻 | 337p日本欧洲亚洲大胆精蜜臀 | 91精品一区二区 | 一久久久 | 久久久国产精品一区 | 一区欧美 | 色爱综合网 | 完全免费在线视频 | 一区二区三区四区在线视频 | 精品三级在线观看 | 日韩精品免费视频 | 狠狠亚洲 | 91精品91久久久 | 亚洲性综合网 | 91成人精品| 国产午夜精品一区二区三区 | 久草成人| 亚洲国产成人在线观看 | 久久久久国产一区二区三区 | 日韩精品在线播放 | 久久激情视频 | 99久久精品国产一区二区三区 | av在线免费观看网站 | 久久久久久国产精品免费免费 |