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

解锁动静态库的神秘力量2:从代码片段到高效程序的蜕变(续篇)

③节头表(Section header table) :包含对节(sections)的描述。 ④节(Section ):ELF⽂件中的基本组成单位,包含了特定类型的数据。...1.3ELF组成结构分析: 首先我们先从程序头表和节头表来分析: 链接视图(Linking view) :对应节头表 Section header table : ⽂件结构的粒度更细,将⽂件按功能模块的差异进...⾏划分,静态链接分析的时候⼀般关注的是链接视图,能够理解ELF⽂件中包含的各个部分的信息。...也就是回答一个问题程序没有被加载进行就有自己对应的逻辑地址(静态的时候和自己的虚拟地址一样)。 其实我们的可执行程序编译的时候就已经链接好了。...为了提高动态库的加载效率,Linux系统会维护一个名为/etc/ld.so.cache的缓存文件。该文件包含了系统中所有已知动态库的路径和相关信息,动态链接器在加载动态库时会首先搜索这个缓存文件。

8610

ELF文件从形成到加载轮廓

如果使用动态链接,还会处理动态符号表(.dynsym)和全局偏移表/过程链接表(.got.plt),为运行时加载动态库做准备。...静态链接会将静态库(.a)内容直接嵌入可执行文件;动态链接则引用动态库(.so),仅记录加载信息,运行时由动态链接器(如 /lib64/ld-linux-x86-64.so.2)加载。...- `LOAD` 段:需要加载到内存的代码和数据段,可能包含 `.text`、`.data` 等 Section。 - `DYNAMIC` 段:用于动态链接,包含动态库加载信息。...链接视图与执行视图:节头表与程序头表的区别与应用 链接视图(Linking View) 对应**节头表(Section Header Table)**。 提供细粒度的文件结构,适合静态链接分析。...一个段可能包含多个节(比如 .text 和 .rodata 合成一个只读段)。段的偏移量记录在程序头表中。 节:由节头表管理,用于链接和调试。节的偏移量记录在节头表中,可能与段的偏移量重叠。

9410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    其中的链接环节,就会需要节区头部表。当然这里说的是静态链接。静态链接完成后,节区头部表在后续的加载执行中已经不会再用到了。...我们再来看看动态链接:动态链接的典型场景就是一个可执行文件加载了一个so文件,并执行了so的函数。...链接编辑器也会构造很多数据来协助动态链接器处理可执行文件和共享目标文件。 这些数据包含在可加载段中,在执行过程中可用。...� 类型为 SHT_PROGBITS 的 .got 和 .plt 节区包含两个不同的表:全局偏移表和过 程链接表。...在加载视图中,数据被划分为段: 可执行文件或者共享目标文件的程序头部是一个结构数组,每个结构描述了一个段 或者系统准备程序执行所必需的其它信息。

    2.3K50

    深度解密Android中基于pltgot的hook实现原理

    3.2 节头表SHT(section_header_table) ELF文件在链接视图中是 以节(section)为单位来组织和管理各种信息。 ?...4、装载、动态链接与重定位 4.1、装载 这个很好理解,我们在使用一个动态库内的函数时,都要先对其进行加载,在android中,我们通常是使用System.loadLibrary的方式加载我们的目标共享库...4.2、动态链接 动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有的程序模块都链接成一个个单独的可执行文件。...看了上面的例子,大家觉得native-hook复杂吗?看上去不复杂?那如果让你来设计一个类似于xHook的库,你能直接在框架里硬编码0x2FE0吗?...,当然不行,因此需要一个通用的逻辑来定位具体的偏移和基址才行,接下来我们重点来看下偏移和基址如何通过通用的代码来动态确定 6.1 解析基址和偏移 我们接下来要做的重要的工作是在运行期间,动态定位目标共享库中的基址和偏移

    3.6K20

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

    连接(链接)视图:可以简单理解为目标文件的储存视图,也就是文件的静态解析视图; 运行(执行)视图:可以简单理解为目标文件的内存视图,也就是文件的动态运行视图; 其实就是程序run没run起来的区别~ 2.2...ELF文件在链接视图中是 以节(section)为单位来组织和管理各种信息 看图图~ 其中比较重要的是圈起来的几个点,以下是说明: .dynsym:为了完成动态链接,最关键的还是所依赖的符号和相关文件的信息...“段 (segment)”包含一个或者多个“节(section)” 程序头只对可执行文件或共享目标 文件有意义,对于其它类型的目标文件,该信息可以忽略 在目标文件的文件头 (elf header)中,e_phentsize...~~ 不是我懒~ ---- 二、动态库装载、动态链接与重定位简单理解 1、装载 作者是Android出身,所以仅从Android角度来分析如何加载so的,我们在使用一个动态库(.so)内的函数时,都要先对其进行加载...节~ 中间经过经过PLT和GOT的跳转,到达我们最终的真实的导入函数的地址~ 2、更快速的找到目标函数的偏移 前面也提到过动态链接重定位表中的.rel.plt是对函数引用的修正,它所修正的位置位于.got

    1.2K41

    数据结构——单链表的实现

    所谓逻辑上的连续,就是指你你可以通过第一个节点找到第二个节点,就行火车一样你可以从一节车厢走到另一节的车厢。 物理上的不连续是指内存地址的不连续,不想顺序表中的数组是连续的。...物理的不连续我们也可以把他理解成火车,火车的车厢是可以随意地拆卸和组装的,每个车厢不一定都是同时同地生产。 节点间依靠一个指针连接。...结构体的创建 链表也是和顺序表一样要创建一个结构体来储存相应的数据。不同于顺序表,链表的结构体只有两个需要存放的数据,一个为要存放的数据,另一个为下一个结构体的地址。...问的好,因为,这里我们定义了SLNode* plist = NULL;它不就是一个一级指针吗,我们要改变它里面的内容不就要把它的地址传过去吗,我们传了一个一级指针的地址过去,不就要用二级这种接收吗,这样才可以做到修改...没问题,再多删一个看看 也没有问题,这个是我们自己写的assert断言。 结语 到这我们的基础教学就结束了,还要好几个函数没有写,就比如查找函数,指定位置的插入和删除。

    12710

    ELF文件及android hook原理

    链接视图和执行视图 ELF文件在磁盘中和被加载到内存中并不是完全一样的,ELF文件提供了两种视图来反映这两种情况:链接视图和执行视图。...节区头部表(Section Header Table)包含了描述文件节区的信息,比如大小,偏移等。...段的链接信息(sh_link、sh_info) 如果节的类型是和链接相关的,比如重定位表、符号表等,那么sh_link和sh_info两个成员包含的意义如下。对于其他段,这两个成员没有意义。...BSS段(.bss) .bss段存放的未初始化的全局变量和局部静态变量。.bss段不占磁盘空间。 ? 字符串表(.strtab) 在ELF文件中,会用到很多字符串,比如节名,变量名等。...bucket数组包含nbucket个项目,chain数组包含nchain个项目,下标都是从0开始。bucket和chain中都保存了符号表的索引。chain表项和符号表存在对应。

    3.9K81

    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接

    链接器产生的可执行目标文件在重要的系统功能中扮演着关键角色,比如加载和运行程序、虚拟内存、分页、内存映射。 理解链接将使你能够利用共享库。...包含二进制代码和数据,其形式可以被直接复制到内存并执行。   共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。   ....strtab:一个字符串表,其内容包括. symtab和, debug节中的符号表,以及节头部中的节名字。字符串表就是以nu11结尾的字符串的序列。...符号和符号表   每个可重定位目标模块m都有一个符号表,它包含m定义和引用的符号的信息。在链接器的上下文中,有三种不同的符号:   由模块m定义并能被其他模块引用的全局符号。...它初始化执行环境,调用用户层的main函数,处理main函数的返回值,并且在需要的时候把控制返回给内核。 ? 总结   链接可以在编译时由静态编译器来完成,也可以在加载时和运行时由动态链接器来完成。

    2.6K31

    ELF文件格式解析

    :链接视图和执行视图。...链接视图只在链接中起作用,而执行视图只在加载并执行时起作用。   为什么需要区分两种不同视图?(即为什么要区分段和节?)内存分配和权限管理以页为单位,一节太小浪费空间,所以把相同权限的节放到一起管理。...SHT_HASH 5 此节区包含符号哈希表。所有参与动态链接的目标都必须包含一个符号哈希表。目前,一个目标文件只能包含一个哈希表,不过此限制将来可能会解除。...SHT_DYNAMIC 6 此节区包含动态链接的信息。目前一个目标文件中只能包含一个动态节区,将来可能会取消这一限制。 SHT_NOTE 7 此节区包含以某种方式来标记文件的信息。...SHT_DYNSYM 11 作为一个完整的符号表,它可能包含很多对动态链接而言不必要的符号。因此,目标文件也可以包含一个 SHT_DYNSYM 节区,其中保存动态链接符号的一个最小集合,以节省空间。

    2.6K40

    Ext JS 4 架构你的应用 第2节 (官方文档翻译)

    架构你的应用 第3节 (官方文档翻译) 在上一篇文章中我们介绍了,怎样基于Ext JS构建一个 潘多拉风格的应用。...在上面的配置中,你可能会注意到我们配置了3个存储。 models 和 stores 通常来说在服务端我们可以使用静态json文件里的模拟的数据。...以后我们可以参考静态json文件的内容去实现服务端的动态数据处理。 对于我们的应用,我们决定使用两个模型Station和Song.我们也需要为这两个模型创建3个存储来绑定到数据组件上。...在init方法中,你应该设置对视图和应用事件的监听器。 在大型的应用中,你也许希望在运行时再加载额外的控制器。你可以通过getController 方法来实现。...下一节我们将了解更高级的控制器技术,通过实现我们的控制器行为和为视图添加更多的细节继续拓展我们的潘多拉应用。

    75110

    【数据结构】——单链表的实现(赋源码)

    我对于链表的理解:链表其实就是顺序表的升级版,对顺序表的优化让程序的工作效率更加高效。...1.上图是一辆火车,火车是由一节节的车厢组成的, 每一节车厢都是有他们自己所属于的编号,把他们有规律的一节节的串联起来,而我们所说的链表也是如此,通过一个个的地址将数据给连接起来,方便我们的增删查改,...2.链表中每个节点都是独⽴申请的(即需要插⼊数据时才去申请⼀块节点的空间),我们需要通过指针变量来保存下⼀个节点位置才能从当前节点找到下⼀个节点。...与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/节点” 节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)。...(SLTNode* phead)//plist是第一个节点的地址,用一级指针接收 { SLTNode* pcur = phead;//用pcur接受第一个节点的位置即plist while(pcur

    8110

    求职笔记-iOS篇

    10、一个十级台阶,你在第一级台阶,每次能往上走一级或者两级台阶,问走到第十级台阶有多少种方案? 正文 以下是iOS相关的知识点。...UIWindow的主要作用: 作为最顶层的视图容器,存放app的视图; 传递触摸和键盘等事件; KVO与Notification的异同 KVO和Notification本质都是观察者模式。...对象回收时Weak指针自动被置为nil的实现原理 Runtime维护着一个Weak表,用于存储指向某个对象的所有Weak指针; Weak表是Hash表,Key是所指对象的地址,Value是Weak指针地址的数组...) 根据帧率动态加载消息数量,当进行消息追赶的时候,多条消息调用一次insert,用CADisplayLink保证添加速率和帧率一致; 代码创建cell 图像预加载,程序在启动的时候会进行礼物版本同步...一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source/Timer/Observer。

    1.2K60

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

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

    3.7K52

    【数据结构】链表最强结构-带头双向循环链表(超详解)

    双向:节点结构中存在前一节点和后一节点的地址,寻找前一节点和后一节点很便利 图示: 带头/不带头 带头:在本来的头结点之前还有一个哨兵卫节点作为头节点,它的址域指针指向头节点,值域不做使用...图的邻接表等等 使用的链表数据结构,都是带头双向循环链表 其他 这种结构在 笔试面试 中出现很多 结构虽然结构复杂,实现反而比较简单(结构优势) 带头+双向+循环链表增删查改实现...: 设计传入参数为链表指针的地址,只有传入指针的地址,才能修改指针的内容,即改成动态开辟的链表地址将之带出函数 设计返回类型为节点指针,返回动态开辟的链表节点指针,使之在函数外就能够接受到改地址...//初始化哨兵卫头结点址域 plist->next = plist; plist->prev = plist; return plist; } 节点开辟 注:在后许多位置都需要开辟节点,这里我们将之封装成一个函数...void ListErase(ListNode* pos) { //断言传入指针不为NULL assert(pos); //记录pos的前一节点和后一节点 ListNode* prev = pos

    31730

    跟着官方文档学习3D Touch

    集成静态和动态的快捷操作项.png 定义静态快捷操作需要在app的Info.plist文件中配置UIApplicationShortcutItems这个Key,UIApplicationShortcutItems...注意:两种定义快捷操作项的方式都能显示两行文本和一个可选的图标。 注意:quick actions最多显示4项。也就是说,无论是静态还是动态,这两种定义快捷操作项的方式最多显示四个快捷操作项。...我们在Info.plist文件中定义的静态快捷操作项的顺序(数组中字典的先后顺序)也就是静态快捷操作项在屏幕上显示的顺序(默认第一个显示在最下面,也就是这些快捷操作项在屏幕上自下向上排列)。...系统会优先加载Info.plist中配置的快捷操作项,只有在Info.plist中定义的静态快捷操作项不够4个的时候,才会去加载动态快捷操作项。...程序优先加载Info.plist文件中定义的静态快捷操作项,如果Info.plist中的静态快捷操作项不足4个才会去加载代码定义的动态快捷操作项(前提是代码中定义了动态快捷操作项)来补充剩余的插槽。

    6.4K50

    CSAPP---第七章-链接

    : elf头剩下部分包含帮助链接器语法分析和解释目标文件的信息,其中包括: elf头大小,节头部表的偏移量,以及节头目表中条目的数量和大小。...不同节的位置和大小是由节头部表描述的,节头目表看做是一个数组,里面存放了一堆entry,每个entry描述一个节的位置和大小。...符号和符号表 每个可重定位目标模块m都有一个符号表,它包含当前m定义和引用的符号信息。...对静态库文件中所有成员重复此过程,直到U和D不再发生变化。此时,任何不包含在E中的成员目标文件都简单被丢弃,而链接器继续处理下一个输入文件。...接着,它注意到 prog2 包含一个 .interp 节,这一节包含动态链接器的路径名,动态链接器本身就是一个共享目标文件(如在 Linux 系统上的 ld-linux.so).

    92510

    链接 动态链接 静态链接

    要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事: 符号解析 目标文件定义和引用符号...符号解析的目的是将每个符号引用和一个符号定义联系起来 重定位 编译器和汇编器生成从地址零开始的代码和数据节。....line .strtab 节头部表 注意上面的除了节头部表,其余都可以叫做节,这就是一个很核心的点,节是和链接相关的,每一个节经过链接会变成段,段对应的是执行相关的,而且段对应的是可执行目标文件的....bss .symtab .debug .line .strtab 节头表 随即这些段就会被加载到存储器地址中,也就是大名鼎鼎的存储器结构,包含栈堆,内核等等的结构。...这就是一个静态链接器如何将一个可重定位文建变成可执行目标文件从而运行到平台上。 动态链接有是怎么回事呢?

    2.9K30

    数据结构(单链表(1))

    前言 线性表中有着许多的结构,如顺序表和链表。而单链表则是链表的最基础的一种形式,下面就让我们对其做一个了解。...结构 我们可以将单链表的结构想象成火车的车厢: 淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加⼏节。只需要将⽕⻋⾥的某节⻋厢去掉/ 加上,不会影响其他⻋厢,每节⻋厢都是独⽴存在的。...结点的组成主要有两个部分:当前结点要保存的数据和保存下⼀个结点的地址(指针变量)。...中指针变量plist保存的是第⼀个结点的地址,我们称plist此时“指向”第⼀个结点,如果我们希望 plist“指向”第⼆个结点时,只需要修改plist保存的内容为0x0012FFA0。...链表中每个结点都是独⽴申请的(即需要插⼊数据时才去申请⼀块结点的空间),我们需要通过指针变量来保存下⼀个结点位置才能从当前结点找到下⼀个结点。

    9110

    ELF 64 格式详解

    ), 重定位的文件(可重定位文件)必须包含,可加载的文件可选(共享目标文件,可执行文件) 段头表(Program header table),可加载的文件必选,重定位文件可选 段和节的实际内容,包括可加载的数据...,符号表等 节头表和段头表其实分别是链接和加载的视图,结构大致如下: image.png ELF 64的数据类型定义如下: image.png ELF文件头格式 文件头格式如下: image.png...字符串表 字符串节表包含用于节名字和符号名字的字符串,内部的字符串表是包含C格式的字符串,对外的索引就是对应字符串的起始位置偏移,单位是字节。...程序段头表 对于可执行和共享库,为了加载方便,用的视图是段,也就是内容一样,只是分类方式变化了。...包含一个C格式的字符串,并且按8字节对齐 descsz and desc 该项的描述符长度和描述符信息,描述符信息需要 8字节对齐 type 和该项所有者,信息解析者相关的一个值 动态段表 动态段表的实际内容如下

    1.2K31

    Hack ELF Loader:用户态execve

    [zjhasdk6g5.png] 这两种视图都在一个文件里,可以简单理解为你写了程序,里面既有A功能也有B功能,执行链接的时候,使用A;实际运行的时候,使用B。...对我们elf loader 有用的是执行视图,毕竟我们是要将可执行文件加载到内存运行起来。在执行视图中,程序头部表对可执行文件是必须的,同时在执行的时候,是按照段进行加载的,节的意义不大。...目标文件的“段”包含一个或者多个“节区”, 也就是“段内容(Segment Contents)”。程序头部仅对于可执行文件和共享目标文件有意义。...[bfunju7wae.png] 依赖库的加载(动态链接) 链接有两种方式,一种是静态链接,另一种是动态链接,这两种链接方式各有好处。...但是静态链接的程序相对较少,更多地是需要动态链接的程序,在linux 中很多程序都会依赖glibc,那谁来负责完成glibc的加载呢?这就涉及INTERP段了,里面包含了动态链接器的路径。

    2.3K10
    领券