首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

枚举当前已加载的所有共享库的所有ELF节

ELF(Executable and Linkable Format)是一种可执行文件和可链接文件的格式,用于在Linux和UNIX系统中存储和执行程序。ELF文件由多个节(section)组成,每个节包含特定类型的数据,如代码、数据、符号表等。

枚举当前已加载的所有共享库的所有ELF节是指获取当前系统中已加载的共享库(动态链接库)的所有节信息。共享库是一种可重用的代码和数据的集合,可以被多个程序共享使用,提供了模块化和动态链接的特性。

枚举共享库的所有ELF节可以通过使用Linux系统中的工具或编程语言来实现。以下是一种可能的实现方式:

  1. 使用命令行工具:
    • 使用ldd命令列出当前正在运行的程序所依赖的共享库。例如:ldd /path/to/program
    • 对于每个共享库,使用readelf命令获取其所有节的信息。例如:readelf -S /path/to/shared/library
  2. 使用编程语言:
    • 使用C/C++语言,可以使用dl_iterate_phdr函数遍历当前进程中加载的共享库,并使用dlinfo函数获取每个共享库的节信息。
    • 使用Python语言,可以使用ctypes库调用dl_iterate_phdr函数,并解析返回的结构体来获取共享库的节信息。

枚举共享库的所有ELF节可以用于调试、性能分析、安全审计等场景。通过分析共享库的节信息,可以了解程序的内部结构、依赖关系、符号表等,有助于理解程序的运行机制和进行问题排查。

腾讯云提供了多个与云计算相关的产品,如云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据实际需求和场景来确定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

认识 JavaAgent --获取目标进程加载所有

Java RASP也是基于JavaAgent实现。趁热记录下JavaAgent基础概念,以及简单使用JavaAgent实现一个获取目标进程加载测试。...)功能动态。...>... classes)//加载类进行重新转换方法,重新转换类会被回调到ClassFileTransformer列表中进行处理。...•premain方式回调到ClassFileTransformer中类是虚拟机加载所有类,这个是由于代理加载顺序比较靠前决定,在开发者逻辑看来就是:所有类首次加载并且进入程序main()方法之前...如果想要重新定义一全新类(类名在加载类中不存在),可以考虑基于类加载器隔离方式:创建一个新自定义类加载器去通过新字节码去定义一个全新类,不过只能通过反射调用该全新类局限性。

2K10
  • ELF 64 格式详解

    ), 重定位文件(可重定位文件)必须包含,可加载文件可选(共享目标文件,可执行文件) 段头表(Program header table),可加载文件必选,重定位文件可选 段和实际内容,包括可加载数据...ELF 包含了ELF文件中除了文件头,程序段头表,头表之外所有内容。...结构定义如下: image.png r_offset 标识需要重定位位置,对于可重定位文件,是从开头到需要被重定位存储位置偏移量,对于可执行或共享,是需要被重定位存储位置虚拟地址,单位都是字节...(s, t)(((s) << 32) + ((t) & 0xf f f f f f f f L)) r_addend 计算重定向位置时候需要额外加常数项 程序段头表 对于可执行和共享,为了加载方便,...可以先实际看下共享段表信息,readelf -l libtxffmpeg.so image.png 可以看到,段是由组成,这是对于加载器,权限一样,就可以合并到一块,方便内存管理。

    1.1K31

    ELF文件格式简介

    (5):保留段; PT_PHDR(6):保存程序头表本身位置和大小,当前段不能在文件中出现一次以上,且仅仅当程序表头为内存映像一部分时起作用,它必须在所有加载项目之前; [PT_LPROC(0x70000000...):所有包含当前掩码都表示预留给特定处理器; sh_addr:如果当前需要被装载到内存,则当前项存储当前映射到内存首地址,否则应该为0; sh_offset:当前首地址相对于文件偏移; sh_size...:一组目标文件、、系统共享资源和其他共享链接在一起创建可执行文件。...当加载此可执行文件时必须使系统中其他共享资源和动态可用,程序才能正常运行。   ...64bit共享,小端存储,版本为1,机器架构为x86-64,程序头表项有7项,头表项有24项。

    2.1K31

    CSAPP---第七章-链接

    可重定位目标文件格式 elf文件格式如下: elf头信息+节数组+头部表(描述每个所在位置) elf头信息如下所示: elf头以一个16个字节序列开始,这个序列描述了生成该文件系统大小和字节顺序...: elf头剩下部分包含帮助链接器语法分析和解释目标文件信息,其中包括: elf头大小,头部表偏移量,以及头目表中条目的数量和大小。...所有引用该可执行目标文件共享这个 .so 文件中代码和数据,而不是像静态内容那样被复制和嵌入到引用它们可执行文件中。...下面是一些现实世界中例子: 分发软件。 微软 Wmdows 应用开发者常常利用共享来分发软件更新。他们生成一个共享新版本,然后用户可以下载,并用它替代当前版本。...更进一步地说,在运行时无需停止服务器,就可以更新存在函数,以及添加新函数。 Linux 系统为动态链接器提供了一个简单接口,允许应用程序在运行时加载和链接共享

    85810

    链接 动态链接 静态链接

    链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号引用,使得它们指向这个存储器位置,从而重定位这些。 静态链接输入文件是一系列目标文件,输出是可执行目标文件。....bss .symtab .debug .line .strtab 头表 随即这些段就会被加载到存储器地址中,也就是大名鼎鼎存储器结构,包含栈堆,内核等等结构。...在了解之前,我们要知道静态,刚才我们所说都仅仅是将一系列可重定位目标文件变成一个可执行目标文件,实际上,所有的编译系统都提供了一种机制,将所有的目标模块打包成一个单独文件,称为静态,他也可以作为静态链接器输入...像一些glibc提供函数,我们可能随时随处都会用上,如果我们每次把函数代码复制到每个进程文本段中,这无疑是一种浪费资源,所以出来了共享概念,在运行时,可以加载到任意存储器地址,并在存储器中和一个程序链接起来...共享也叫共享目标,以.so为结尾,像linux系统提供了dlopen这样函数去加载和链接共享。 其实.symtab这个存放符号地方也是值得研究,有机会再记录。

    2.9K30

    ELF文件格式解析

    ELF Header   所有ELF文件首先都以一个64字大小ELF头作为开头,其包含内容可以用readelf -h xxx.so或者拖入010Editor中用模板查看,如下图所示: 其中比较重要就是它记录了...DT_SYMBOLIC 16 ignored ignored optional 在共享object中出现该元素为在库中引用改变动态连接器符号解析算法。...并且只有程序头部表是程序内存映像一部分时才起作用。如果存在此类型段,则必须在所有加载段项目的前面。...ELF加载   经过测试,ELF文件被加载时会每个LOAD段记录将文件进行加载,具体来说,就是将ELF文件从LOAD段p_offset位置读取p_filesz大小数据,映射到内存中ELF基址+p_vaddr...ELF Header和Program Header给占据了他们大小是0x40+0x1C0=0x200   此外,值得注意ELF加载时并没有读取所有ELF文件中内容去加载到内存中,实际上我这个ELF

    2.5K40

    详解共享动态加载

    在本文中,我将尝试解释在Linux系统中动态加载共享内部工作原理。 这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享和可执行文件。为了解动态加载内部工作方式进行了优化。...一般来说,非常有用,因为它们可以缩短编译时间(在编译应用程序时不必编译依赖关系所有源代码)和模块化开发过程。 静态链接到编译可执行文件(或另一个)中。编译后,新组件将包含静态内容。...共享在运行时由可执行文件(或其他共享加载。这让它们变得更加复杂,通常大家对这个领域可能存在认知障碍,我们将在这篇文章中讨论。 示例设置 为了探索共享世界,我们将在本文中使用一个示例。...可以静态地执行此操作-并将random所有符号直接加载到main可执行文件中。 我们告诉编译器我们要使用librandom文件。由于它是动态加载,为什么我们在编译时需要它?...我们可以看到librandom.so我们指定,但是我们还得到了四个我们没有想到额外依赖项。这些依赖性似乎出现在所有编译共享中。这些是什么呢?

    3.1K20

    扒一扒ELF文件

    2.如果用于加载执行(可执行文件),则加载器则将把ELF文件看作是程序头表描述集合,一个段可能包含多个头表可选。 4....程序执行也必须依靠其提供信息。 段头表   段头表。存放所有不同段将在内存中位置。 .text section   代码段。存放编译程序机器代码,一般是只读。...Elf32_Word sh_flags; //标志:该在虚拟空间中访问属性 Elf32_Addr sh_addr; //虚拟地址:若可被加载,则对应虚拟地址 Elf32_Off...System V忽略所有应用程序物理地址信息。 Elf32_Word p_filesz; //此成员给出段在文件映像中所占字节数。可以为0。...共享文件是一种特殊可重定位目标。   2.ELF目标文件格式可以从编译链接角度和程序执行角度两个角度看,前者是可重定位目标格式,后者是可执行目标格式。

    72820

    深度解密Android中基于pltgothook实现原理

    4、装载、动态链接与重定位 4.1、装载 这个很好理解,我们在使用一个动态库内函数时,都要先对其进行加载,在android中,我们通常是使用System.loadLibrary方式加载我们目标共享...当共享被装载时候,动态链接器linker会将共享装载到进程地址空间,并且将程序中所有未决议符号绑定到相应动态链接中,并进行重定位工作。...从上面的简图中,我们可以看到,当执行我们代码段.text中writeText函数时候,内部会通过BLX相对寻址方式进入.plt,计算程序计数器 PC 的当前值跳转进入.got。...具体可以看看:LoliProfiler实现。 8、思考与小结 Q:比如我要hook我当前应用中malloc函数,是否只对某个共享进行hook即可?...其实hook操作本身技术原理并不复杂,但是要针对android平台下共享进行hook操作,仅仅只了解hook操作是不够,可以看到上面大部分内容其实是在跟ELF文件周旋,要结合它加载、动态链接

    3.5K20

    从程序员角度看ELF

    (这里针对ELF可执行文件,对于共享.init段,还是由interpreter来调用!!!...这里特定解释器是动态链接器,即ld.so,它自己也是ELF   共享格式。...链接器然后通过指向程序符号表和链接器自己符号表若干指针来初始化一个符号   表链。从概念上讲,程序文件和所有加载到进程中共享一个符号表。...在该过程结束时,所有都被映射进来了,加载器拥有了一个由程序和所有映射进   来符号表联合而成逻辑上全局符号表。   ...缓冲文件创建程序扫描包含共享所有目录,查找所有共享,提取每一   个SONAME,对于具有相同SONAME多个,除版本最高外其余忽略。

    97840

    Android Native Hook

    虽然 ELF 文件本身就支持三种不同类型(重定位、执行、共享),不同视图下格式稍微不同,不过它有一个统一结构,这个结构如下图所示。...在我们调用了dlopen(“libname.so”)之后,系统首先会检查缓存中加载 ELF 文件列表。如果未加载则执行加载过程,如果加载则计数加一,忽略该调用。...然后系统会用从 libname.so dynamic区中读取其所依赖,按照相同加载逻辑,把未在缓存中加入加载列表。...读 ELF 程序头部表,把所有 PT_LOAD 区 mmap 到内存中。 从“.dynamic”中读取各信息项,计算并保存所有虚拟地址,然后执行重定位操作。...这里还有一个“邪恶”细节,由于指令执行是依赖当前运行环境,即所有寄存器值,而我们插入新指令是有可能更改寄存器状态,所以我们要保存当前全部寄存器状态到栈中,使用 BLX 指令跳转执行 Hook

    1.2K20

    黑客级别的文章:把动态内存操作玩出了新花样!

    这样的话,动态代码段在加载到物理内存中之后,就可以被多个不同进程来共享了,只要把代码段物理地址,映射到每个进程自己虚拟地址即可。...动态链接(比如执行 dlopen)大致步骤是: 检查加载 ELF 列表。(如果 libtest.so 已经加载,就不再重复加载了,仅把 libtest.so 引用计数加一,然后直接返回。)...从 libtest.so .dynamic section 中读取 libtest.so 外部依赖 ELF 列表,从此列表中剔除加载 ELF,最后得到本次需要加载 ELF 完整列表(包括...链接器把所有被依赖共享对象加载到内存中时,会把每个共享对象中符号给汇总起来,得到全局符号表。 然后再检查每个共享对象中 .rel.plt,是否需要对一些地址进行重定位。...动态在被加载到内存中时,因为存在加载顺序问题,所以加载地址不是固定。 还有一种说法:对于某一个进程而言,它在被加载到内存中时,它所依赖所有动态顺序是一定

    1.2K20

    【胖虎逆向之路】——GOTPLT Hook详解&针对自定义soHook实操

    “段 (segment)”包含一个或者多个“(section)” 程序头只对可执行文件或共享目标 文件有意义,对于其它类型目标文件,该信息可以忽略 在目标文件文件头 (elf header)中,e_phentsize...~~ 不是我懒~ ---- 二、动态装载、动态链接与重定位简单理解 1、装载 作者是Android出身,所以仅从Android角度来分析如何加载so,我们在使用一个动态(.so)内函数时,都要先对其进行加载...使用~ 当so动态被装载时候,动态链接器linker会将动态装载到进程地址空间,并且将程序中所有没确定符号绑定到相应动态链接中,并进行重定位工作~ 3、重定位 共享进行重定位主要原因是在于导入符号原因...@plt里面~ 那么,由此可以得出当执行我们代码段.text中 curl_a_website 函数时候,内部会通过BLX相对寻址方式进入.plt,计算程序计数器 PC 的当前值跳转进入.got...来,跑起来~ 使用命令获取: cat /proc/对应进程pid/maps 上图已经列举出了我们应用加载一些so,左边标记红色地址就是各个so基址 addr = base_addr

    97541

    含大量图文解析及例程 | Linux下ELF文件、链接、加载(上)

    共享(shared)目标文件:通常是.so动态链接文件或者动态链接生成可执行文件。一种特殊类型可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。...但并不是所有以上三种ELF形式都有这两张表, 如果用于编译和链接(可重定位目标文件),则编译器和链接器将把elf文件看作是头表描述集合,程序头表可选。...如果用于加载执行(可执行目标文件),则加载器则将把elf文件看作是程序头表描述集合,一个段可能包含多个头部表可选。 如果是共享目标文件,则两者都含有。...因为链接器在链接时候需要头部表来查看目标文件各个 section 信息然后对各个目标文件进行链接;而加载器在加载可执行程序时候需要程序头表 ,它需要根据这个表把相应加载到进程自己虚拟内存...其中各个含义如下: 这样我们就把一个可重定位ELF文件中每一个字节都搞清楚了。 静态链接 编译、链接需求 为了节省空间和时间,不将所有的代码都写在同一个文件中是一个很基本需求。

    3K52

    ELF文件及android hook原理

    、目的档、共享和核心转储标准文件格式。...链接视图和执行视图 ELF文件在磁盘中和被加载到内存中并不是完全一样ELF文件提供了两种视图来反映这两种情况:链接视图和执行视图。...因为ELF目标文件不需要被装载,所以它没有程序头表,而ELF可执行文件和共享文件都有。 使用readelf查看程序头表。 ?...与普通程序不同是,动态链接模块装载地址是从地址0x00000000开始,这个地址是无效共享对象最终装载地址在编译时时不确定,而是在装载时,装载器根据当前地址空间空前情况,动态分配一块足够大小虚拟地址空间给相应共享对象...动态加载器解析结束,可以看到got表项正确指向了libc动态中printf地址 ?

    3.8K81

    ELF文件加载过程(load_elf_binary函数详解)--Linux进程管理与调度(十三)

    load_shlib 用于动态把一个共享捆绑到一个已经在运行进程, 这是由uselib()系统调用激活 core_dump 在名为core文件中, 存放当前进程执行上下文....如果目标映像与各种链接是静态链接,因而无需依靠共享、即动态链接,那就不需要解释器映像;否则就一定要有解释器映像存在。...,再读如各种数据结构,从这些数据结构中可知各段或地址及标识,然后调用mmap()把找到加载内容加载到内存中。...动态链接器检查程序对共享依赖性,并在需要时对其进行加载。...动态链接器对程序外部引用进行重定位,并告诉程序其引用外部变量/函数地址,此地址位于共享加载在内存区间内。

    7.9K51

    ELF中可以被修改又不影响执行区域

    这里讲一些我在学习过程中一些额外发现,如有理解不对地方,欢迎斧正。 一. 关于ELF链接视图和装载视图(执行视图)。在所有介绍ELF文件格式文档中,都会出现这样一张图: ?...静态链接完成后,区头部表在后续加载执行中已经不会再用到了。 我们再来看看动态链接:动态链接典型场景就是一个可执行文件加载了一个so文件,并执行了so函数。...解释器可以是一个可执行文件,也可以是一个共享目标文件。 共享目标文件被加载到内存中时,其地址可能在各个进程中呈现不同取值。...因为任何符合 ABI 规范程序都要从共享目标中导入基本系统服务,动态链 接器会参与每个符合 ABI 规范程序执行。... 也就是说,动态链接时通过段去解析出对应section内容。...这些区域不属于任何 头部和区,其内容未指定。 在加载视图中,数据被划分为段: 可执行文件或者共享目标文件程序头部是一个结构数组,每个结构描述了一个段 或者系统准备程序执行所必需其它信息。

    2.2K50

    深入浅出ELF

    如果有这个segment的话,必须要在所有加载segment之前,并且在文件中不能出现超过一次。...使用flush_old_exec来更新当前可执行文件所有引用; 使用setup_new_exec设置新可执行文件在内核中状态; setup_arg_pages在栈上设置程序调用参数内存页; 循环每一项...interpreter又称为dynamic linker,以glibc2.27为例,它大致功能如下: 将实际要执行ELF程序中内存段加载当前进程空间中; 将动态内存段加载当前进程空间中;...在interpreter根据DT_NEEDED加载所有需要动态后,就实现了完整进程虚拟内存映像布局。...在寻找某个动态符号时,interpreter会使用广度优先方式去进行搜索,即先在当前ELF符号表中找,然后再从当前ELFDT_NEEDED动态中找,再然后从动态DT_NEEDED里查找。

    76330

    吴章金: 如何创建一个*可执行*共享

    先来看看两类文件区别 当前 Linux 下面的二进制程序标准格式是 ELF,这类格式可以用来表示 4 种不同类型文件: 可重定位目标文件(.o),用于静态链接 可执行文件格式,用于运行时创建进程映像...共享目标文件(.so,共享),协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃时自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定...,执行加载后可直接运行 共享 如果可执行文件用到外部库函数,那么需要通过动态链接器加载引用到共享并在运行时解析用到相应符号 所以,前者和后者通常情况下是独立存在,是联合行动,两者差异明显:...-rdynamic 等价于 -Wl,-E / -Wl,--export-dynamic,确保所有”中符号都 export 到动态符号表,包括当前未用到那些符号。...先来回顾一下共享,在本文第 2 直接执行时候马上出段错误,基本原因是共享没有强制提供一个标准 C 程序入口。

    1.1K20
    领券