byOpen

绕过移动端系统限制的 dlopen 库
授权协议 Apache-2.0
开发语言 Java C/C++ Lua
所属分类 手机/移动开发、 手机开发工具
软件类型 开源软件
地区 国产
投 递 者 越学文
操作系统 OS X
开源组织
适用人群 未知
 软件概览

byOpen是一个绕过移动端系统限制的增强版dlfunctions库。

支持特性

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接口限制的简单方法的思想和实现方式。

虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary

从而绕过Android N的classloader-namespace限制,将系统/system/lib中任意so库加载到maps中,然后再通过fake dlopen的方式去dlsym。

增强版fake dlopen

关于fake dlopen的方式实现,网上已有很多实现,比如:

byOpen参考了里面的实现,重新实现了一遍,并且做了一些小改进:

  • 不在/proc/self/maps中的系统库,也能绕过限制强行加载进来使用
  • 除了从.dynsym中检索符号,还支持从.symtab中检索符号(参考:Enhanced_dlfunctions,顺带修复了里面的一些bug)
  • 整个dlopen过程只有一次malloc分配(省去整个符号表的内存分配和copy)
  • 兼容原始dlopen,如果是低版本android系统,没有限制,还是会优先切到原生dlopen上去直接调用

Android例子

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

虽然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
  • 原标题:开源软件丨绕过移动端系统限制的 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. 子目录过滤器