無法訪問android sdk加載項列表,android 禁用dlsym_一個繞過移動端系統限制的dlopen庫: byOpen

 2023-09-28 阅读 30 评论 0

摘要:簡介byOpen是一個繞過移動端系統限制的dlopen庫。支持特性無法訪問android sdk加載項列表、Android支持App中加載和使用Android系統庫接口(即使maps中還沒有被加載也支持)。Android 7以上dlopen, System.load都是被限制調用的,雖然目前網上有Nougat_dlfunctions等庫通過

簡介

byOpen是一個繞過移動端系統限制的dlopen庫。

支持特性

無法訪問android sdk加載項列表、Android

支持App中加載和使用Android系統庫接口(即使maps中還沒有被加載也支持)。

Android 7以上dlopen, System.load都是被限制調用的,雖然目前網上有Nougat_dlfunctions等庫通過從maps中找so庫來繞過加載限制。

不過對于app中還沒被加載到maps的so庫,這種方式就不行了。

封閉安卓車載系統破解?而byOpen不僅支持fake dlopen方式從maps加載,還可以將還沒加載到maps的so庫繞過系統限制強行加載進來使用,實現更加通用化得dlopen。

注:目前的實現方式理論上還是比較通用的,至少我這Android 10上測試ok,但還沒完整詳細測試過,是否使用請自行評估。

相關原理

具體實現原理還是比較簡單的,主要還是借鑒了一種繞過Android P對非SDK接口限制的簡單方法的思想和實現方式。

android?雖然這篇文章中主要目的是為了繞過hide api,不過它里面使用的將自己假裝成系統調用的方式,一樣可以用到System.loadLibrary上去,讓系統以為是系統自身在調用System.loadLibrary

從而繞過Android N的classloader-namespace限制,將系統/system/lib中任意so庫加載到maps中,然后再通過fake dlopen的方式去dlsym。

增強版fake dlopen

關于fake dlopen的方式實現,網上已有很多實現,比如:

android obb訪問限制、byOpen參考了里面的實現,重新實現了一遍,并且做了一些小改進:不在/proc/self/maps中的系統庫,也能繞過限制強行加載進來使用

除了從.dynsym中檢索符號,還支持從.symtab中檢索符號(參考:Enhanced_dlfunctions,順帶修復了里面的一些bug)

整個dlopen過程只有一次malloc分配(省去整個符號表的內存分配和copy)

兼容原始dlopen,如果是低版本android系統,沒有限制,還是會優先切到原生dlopen上去直接調用

android設置向導怎么關閉?Android例子

Android相關測試App例子在:Android Sample

注:目前自帶的App測試例子里面的系統庫我寫死了,有些系統版本上有可能不存在,請先改成用戶自己的庫和符號名,再編譯測試

public class MainActivity extends AppCompatActivity {

android5禁用觸屏。private static final String SYSTEM_LIBRARY = "curl";

private static final String SYMBOL_NAME = "curl_version";

除了Native版本dlopen接口,byOpen額外提供了java版本的System.loadLibrary接口在java層直接繞過系統庫加載。

關鍵代碼如下:

android禁用虛擬鍵?static public boolean loadLibrary(String libraryName) {

Method forName = Class.class.getDeclaredMethod("forName", String.class);

Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);

Class> systemClass = (Class>) forName.invoke(null, "java.lang.System");

Method loadLibrary = (Method) getDeclaredMethod.invoke(systemClass, "loadLibrary", new Class[]{String.class});

loadLibrary.invoke(systemClass, libraryName);

}

而native版本的dlopen_android.c實現中,我將這段繞過的系統加載的方式,通過jni重新實現了一遍,然后和fake dlopen無縫結合到了一起。

iOS

雖然ios可以直接使用dlopen,但是審核上會有風險,蘋果有可能會對提交AppStore的app掃描相關dlopen/dlsym等調用,來判斷是否存在一些敏感的私有調用。

為了在通過調用一些私有接口的時候避免被蘋果檢測到,byOpen也通過自己實現dlopen/dlsym直接從已經加載進來的images列表里面直接查找對應symbol地址來調用。

當然,為了更加安全,相關調用的庫符號硬編碼字符串等,用戶可以自行做層變換加密,不要直接編譯進app。

接口用法

相關靜態庫和接口在:dlopen.h

相關使用方式跟原生dlopen完全相同:

typedef by_char_t const* (*curl_version_t)();

by_pointer_t handle = by_dlopen("libcurl.so", BY_RTLD_LAZY);

if (handle)

{

by_pointer_t addr = by_dlsym(handle, "curl_version");

if (addr)

{

curl_version_t curl_version = (curl_version_t)addr;

by_print("curl_version: %s", curl_version());

}

by_dlclose(handle);

}

編譯

編譯需要先安裝:xmake

Android

直接編譯庫

$ xmake f -p android --ndk=~/file/android-ndk-r20b

$ xmake

通過gradle編譯測試Apk

$ cd src/android

$ ./gradlew app:assembleDebug

通過xmake直接編譯apk

$ xmake apk_build

通過xmake直接安裝測試apk

$ xmake apk_test

iOS

直接編譯庫

$ xmake f -p iphoneos -a [armv7|arm64]

$ xmake

MacOS

我們也可以在macOS下編譯測試,也是支持的:

$ xmake

$ xmake run

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/102970.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息