简介

byOpen是一个绕过移动端系统限制的dlopen库。

支持特性

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);

}

iOS

虽然ios可以直接使用dlopen,但是审核上会有风险,苹果有可能会对提交AppStore的app扫描相关dlopen/dlsym等调用,来判断是否存在一些敏感的私有调用。

为了在通过调用一些私有接口的时候避免被苹果检测到,byOpen也通过自己实现dlopen/dlsym直接从已经加载进来的images列表里面直接查找对应symbol地址来调用。

当然,为了更加安全,相关调用的库符号硬编码字符串等,用户可以自行做层变换加密,不要直接编译进app。

接口用法

相关使用方式跟原生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

android 禁用dlsym_[原创] 分享一个最近新撸增强版的绕过Android/iOS的dlopen/dlsym限制的dlfunctions库...相关推荐

  1. android 禁用dlsym_[原创]解答andwei关于android平台通过dlsym来hook模块方法的原理的疑问...

    验证为啥可以修改函数地址指向的地方,这个地方难道不是在代码段吗? 修改了以后为啥备份的原函数地址还可以调用原函数,代码段原函数的首地址指向的地方的内容不是已经改成跳转方法的首地址了吗? 因为私信了,在 ...

  2. android 禁用dlsym_一个绕过移动端系统限制的dlopen库: byOpen

    简介 byOpen是一个绕过移动端系统限制的dlopen库. 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持). Android 7以上dl ...

  3. 三星s9 android p内测,官方:S9/S9+/Note9国行版喜提Android 10内测体验

    原标题:官方:S9/S9+/Note9国行版喜提Android 10内测体验 [手机中国新闻]就在刚刚,@三星GALAXY盖乐世发布微博称,针对于三星Galaxy S9|S9+和Galaxy Note ...

  4. android 禁用dlsym_(转载)android下运行时动态链接dlopen()和dlsym()的实现

    出处:http://my.oschina.net/wolfcs/blog/144412#OSC_h2_1 android下运行时动态链接dlopen()和dlsym()的实现 在android中,就如 ...

  5. 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧

    因为写博客总是需要录制 Android 软件的演示效果, 研究了将近一小时找到了合适的工具; 录制流程 : -- 1. 录制 Android 手机屏幕内容 : 使用 拍大师 软件录制 Android ...

  6. android 多个按键精灵,给大家分享一个,按键精灵安卓版,找多图, 以及找多图返回多个坐标的,相信大家绝对用得到 _ 按键精灵手机版 - 按键精灵论坛...

    大家感觉有用的回复多多支持一下,下面这个找图代码,是我平时写代码,都用到的,我感觉不错,毕竟用起来有大漠的感觉,哈哈 //TracePrint "--" Dim 找图组合,图片数组 ...

  7. android 网络图片工具类,分享一个Android图片模糊的工具类

    图片模糊,试过很多工具什么的,还是这个类比较好,直接用就好了 使用方法: imageView.setImageBitmap(BlurUtil.doBlur(drawable,10,15)); pack ...

  8. android 蓝牙打印代码,分享一个b4a下安卓操作蓝牙打印机的代码

    b4a的  用到 Serial的库 实测过能用 另外:有人有    zxing_b4a_1.3plus_lib_demo.zip 的库没有? 关键代码 Sub Process_Globals Dim ...

  9. manjaro linux内核,分享|一个值得推荐的发行版:Manjaro Linux

    在这个系列的第七篇,我们来说一说什么是 Manjaro.Manjaro 是基于 Arch Linux 并且拥有一个漂亮的用户界面的操作系统. Manjaro 并不像 Debian 或者 Arch 这些 ...

最新文章

  1. 如何在钉钉上开发自己的应用_神操作!老妈让我告诉老板,双十一买钉钉。
  2. Spring在bean配置文件中定义电子邮件模板
  3. Lua中的metatable
  4. ocLazyLoad angular 按需加载
  5. 微机个人笔记-存储单元编址
  6. 终于学会了 MySQL 主从配置和读写分离
  7. 项目进度管理表模板_IT项目进度管理—你能驾驭的项目节奏
  8. winform DevComponents.DotNetBar2 添加到工具栏方法
  9. linux下iso镜像的制作工具,ISO镜像文件制作转换工具(AnyToISO)
  10. 文档服务器 件排名,服务器十大品牌排名
  11. 华为u8500开启log方法
  12. php中md5加密函数怎么用,用PHP写的MD5加密函数
  13. ​创业10年的领导口出狂言:80后该退出IT行业!网友怒怼!
  14. 夏普Sharp SF-S751D 一体机驱动
  15. python输入esc退出循环_使python在按ESC键时立即退出程序
  16. 志愿者服务团队组织由哪些组织组成
  17. 计算机z,出国留学_计算机词汇(R-Z)_沪江英语
  18. wps合并所有sheet页_WPS怎么把几个工作表合并到一个工作表 - 卡饭网
  19. 计蒜客---它是多么甜蜜啊!
  20. 2020年7月5日第十一届蓝桥杯第一场省赛试题及详解(Java本科B组)

热门文章

  1. [XMC] CLOCK_XMC4
  2. Android快速设置Quick Settings Tile
  3. kali linux WiFi钓鱼
  4. html 图片选中效果,使用html5 svg和css3制作神奇的图片hover效果
  5. IBM朱近之:对云计算的十大误解
  6. 利用python-opencv中solvepnp函数解决位姿定位定向问题。
  7. 印度理工学院--亚洲大学的典范
  8. Oracle EBS中PO的类型详细介绍【转】
  9. 失去的远东国土海兰泡:述说近代中国血泪史
  10. AWTRIX时钟:一台可玩性极高的DIY时钟