ld.linux.so源代码分析--RTLD_START

之前在研究动态连接的时候,原本打算从头到尾分析下linux下动态链接器ld.linux.so的源代码,但是当时工作上比较忙,未能完成这一任务,只写了一篇介绍ld.so自举的blog

最近打算重新开始这一任务,详细的分析下这份代码。

首先,很多人认为这份代码应该belongs to内核,但是实际上这跟编译一样,属于用户态程序,由glibc提供,核心代码在elf/rtld.c中。

这些代码的理解最好建立在对动态连接的理论知识有一定的了解,不然可能会有些吃力,牛人除外。

这个文件有4个重要的部分,三个函数:_dl_main,_dl_start,_dl_start_final;一个宏RTLD_START。

dl_start已经在上面自举的那篇blog中做了分析,后续将补全另外三个部分。

这个文件的入口从一个宏开始,与平台相关,是一段汇编代码,也即本篇要分析的代码。

#ifdef RTLD_START
RTLD_START
#else
# error "sysdeps/MACHINE/dl-machine.h fails to define RTLD_START"
#endif

对于x86,RTLD_START定义在sysdeps/i386/dl-machine.h和sysdeps/x86_64/dl-machine.h中

以32位系统为例࿰

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 byOpen特性: 支持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,但还没完整详细测试过,是否使用请自行评估。 byOpen相关原理: 具体实现原理还是比较简单的,主要还是借鉴了一种绕过Android P对非SDK接口限制的简单方法的思想和实现方式。 虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary 从而绕过Android N的classloader-namespace限制,将系统/system/lib中任意so库加载到maps中,然后再通过fake dlopen的方式去dlsym。 byOpen接口用法: 相关静态库和接口在: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); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值