byOpen是一个绕过移动端系统限制的增强版dlfunctions库。
支持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接口限制的简单方法的思想和实现方式。
虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary
上去,让系统以为是系统自身在调用System.loadLibrary
从而绕过Android N的classloader-namespace限制,将系统/system/lib中任意so库加载到maps中,然后再通过fake dlopen的方式去dlsym。
关于fake dlopen的方式实现,网上已有很多实现,比如:
byOpen参考了里面的实现,重新实现了一遍,并且做了一些小改进:
Android相关测试App例子在:Android Sample
注:目前自带的App测试例子里面的系统库我写死了,有些系统版本上有可能不存在,请先改成用户自己的库和符号名,再编译测试
public class MainActivity extends AppCompatActivity { private static final String SYSTEM_LIBRARY = "curl"; private static final String SYMBOL_NAME = "curl_version";
除了Native版本dlopen接口,byOpen额外提供了java版本的System.loadLibrary接口在java层直接绕过系统库加载。
关键代码如下:
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可以直接使用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
$ xmake f -p android --ndk=~/file/android-ndk-r20b $ xmake
$ cd src/android $ ./gradlew app:assembleDebug
$ xmake apk_build
$ xmake apk_test
$ xmake f -p iphoneos -a [armv7|arm64] $ xmake
我们也可以在macOS下编译测试,也是支持的:
$ xmake $ xmake run
原标题:开源软件丨绕过移动端系统限制的 dlopen 库 byOpen byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 软件基本信息 序号 维度 详情 1 软件类型 手机开发工具 2 开发语言 Java C/C++ Lua 3 授权协议 Apache-2.0 4 操作系统 OS X 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没
byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是被限制调用的,虽然目前网上有Nougat_dlfunctions等库通过从maps中找so库来绕过加载限制。 不过对于app中还没被加载到maps的so
简介 byOpen是一个绕过移动端系统限制的dlopen库。 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是被限制调用的,虽然目前网上有Nougat_dlfunctions等库通过从maps中找so库来绕过加载限制。 不过对于app中还没被加载到maps的so库,这种方
问题内容: 作为此后C插件系统的继续:符号查找错误,我仍在编写我的插件系统,并遇到了新的错误。 概括一下插件是什么,该程序包含一个由外壳接口的网络应用程序,消息具有类型,因此可用于在网络上创建应用程序。例如,可能的应用程序是聊天或转移应用程序。 因此,shell命令可以在网络上发送特定应用程序的消息,当接收到一条消息时,如果它对应于特定应用程序,则将消息内容作为参数执行一个动作功能,它可能就是该应
Request size limit etcd is designed to handle small key value pairs typical for metadata. Larger requests will work, but may increase the latency of other requests. For the time being, etcd guarantees
我设置了滑块的最小值和最大值(例如从1..100开始)。但我有另一个控件,它限制滑块的值范围,比如说从30..60。现在用户应该无法将滑块拇指移动到30以下和60以上,但最小值和最大值仍然应该是1和100。
1.1. RokidOS 系统移植适配 1.1.1. 硬件相关 1.1.2. 软件相关 1.1. RokidOS 系统移植适配 1.1.1. 硬件相关 硬件设计相关文档 我们为各位开发者提供了几款硬件开发板的参考实现,如果您需要了解或查询硬件配置、原理图、开发板样式等信息,请结合您所使用的硬件设备,到开发板用户手册章节了解相应信息。 1.1.2. 软件相关 RokidOS 板级配置体系 为了让开发
问题内容: 我正在通过migrations.changeColumn函数在迁移中添加一个约束。 添加约束是可行的,但是由于您需要提供Possibly unhandled SequelizeDatabaseError: relation “myAttribute_unique_idx” already exists`。 (使用的数据库是postgres) 我也尝试过使用removeIndex 但是在
6.2.1. SVN版本库到Git的迁移 6.2.2. Hg版本库到Git的迁移 6.2.3. 通用版本库迁移 6.2.4. Git版本库整理 6.2.4.1. 环境变量过滤器 6.2.4.2. 树过滤器 6.2.4.3. 暂存区过滤器 6.2.4.4. 父节点过滤器 6.2.4.5. 提交说明过滤器 6.2.4.6. 提交过滤器 6.2.4.7. 里程碑名字过滤器 6.2.4.8. 子目录过滤器