作者简介: 伟林,中年码农,从事过电信、手机、安全、芯片等行业,目前依旧从事Linux方向开发工作,个人爱好Linux相关知识分享。 原理概述 为什么要研究链接和加载?写一个小的main函数用户态程序,或者是一个小的内核态驱动ko,都非常简单。但是这一切都是在gcc和linux内核的封装之上,你只是实现了别人提供的一个接口,至于程序怎样启动、怎样运行、怎样实现这些机制你都一无所知。接着你会对程序出现的一些异常情况束手无策,对内核代码中的一些用法不能理解,对makefile中的一些实现不知所云。所以这就是我们
在Linux中,可执行文件的格式是ELF格式,而有一些命令可以帮助我们了解它们更多的“秘密”,以此来帮助我们解决问题。
在了解了共享对象的绝对地址的引用问题后,我们基本上对动态链接的原理有了初步的了解,接下来的问题是整个动态链接具体的实现过程了。动态链接在不同的系统上有不同的实现方式。ELF的动态链接的实现方式会比PE的简单一点,在这里我们先介绍ELF的动态链接过程在LINUX下的实现,最后我们会专门的章节中介绍PE在Windows下的动态链接过程和它们的区别
1999年86open项目选择ELF作为x86处理器上Unix和类Unix系统的标准二进制文件格式。使用ELF的原因包括:灵活性、可扩展性、对不同字节序格式支持、跨平台支持地址size。
我们知道动态链接器本身也是一个共享对象,但是事实上它有一些特殊性。对于普通共享对象文件来说,它的重定位工作由动态链接器来完成。他也可以依赖其他共享对象,其中的被依赖共享对象由动态链接器负责链接和装载。可是对于动态链接器来说,它的重定位工作由谁来完成?它是否可以依赖于其他共享对象?
目标文件是源代码编译但未链接的中间文件(Windows的.obj和Linux的.o),Windows的.obj采用 PE 格式,Linux 采用 ELF 格式,两种格式均是基于通用目标文件格式(COFF,Common Object File Format)变化而来,所以二者大致相同。本文以 Linux 的 ELF 格式的目标文件为例,进行介绍。
1, 编译器编译源代码生成的文件叫做目标文件。 从结构上说,是编译后的可执行文件,只不过还没有经过链接 3.1 目标文件的格式 1,可执行文件的格式: Windows下的PE 和 Linux下的ELF 2,从广义上说,目标文件与可执行文件的格式几乎是一样的,所以广义上可以将目标文件与可执行文件看成是一种类型的文件。 3,可执行文件,动态链接库,静态链接库都按照可执行文件格式存储(Windows下是 PE-COFF格式,Linux下是ELF格式)。 4,Linux下命令: $: file ***
ELF文件装载链接过程及hook原理 ELF文件格式解析 可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档、目的档、共享库和核心转储的标准文件格式。 ELF文件主要有四种类型: 可重定位文件(Relocatable File) 包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。 可执行文件(Executable File) 包含适合于执行的一个程序,此文件规定了 exec() 如何创
既然程序最终都被变成了一条条机器码去执行,那为什么同一个程序,在同一台计算机上,在Linux下可以运行,而在Windows下却不行呢?
ELF(Executable and Linkable Format)是一种可执行文件和可链接文件的标准格式,用于在Linux和Unix系统中存储程序和库文件。它是一种二进制文件格式,包含程序的代码、数据、符号表、段表等信息。
拿到一个编译好的可执行文件,你能获取到哪些信息?文件大小,修改时间?文件类型?除此之外呢?实际上它包含了很多信息,这些你都知道吗?
最近因为项目上的需要,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux中一些编译、链接相关的内容。
可执行与可链接格式 (Executable and Linkable Format,ELF),常被称为 ELF格式,是一种用于可执行文件、目标代码、共享库和核心转储(core dump)的标准文件格式,一般用于类Unix系统,比如Linux,Macox等。ELF 格式灵活性高、可扩展,并且跨平台。比如它支持不同的字节序和地址范围,所以它不会不兼容某一特别的 CPU 或指令架构。这也使得 ELF 格式能够被运行于众多不同平台的各种操作系统所广泛采纳。 ELF文件一般由三种类型的文件:
该方法的主要原理是利用dl_runtime_resolve函数来对动态链接的函数进行重定位。
静态链接是在链接阶段将程序各模块文件链接成一个完整的可执行文件,运行时作为整体一次性加载进内存。动态加载允许用户将程序各模块编译成独立的文件而不将它们链接起来,在需要使用到模块时再动态地将其加载到内存中。
可执行文件的符号表(symbol table)记录了某个可执行文件中的函数名、全局变量、宏定义等符号信息,这些信息对于我们调试十分重要。
ld命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行程序或库文件。
在Linux操作系统中,一段C程序从被写下到最终被CPU执行,要经过一段漫长而又复杂的过程。下图展示了这个过程
链接器主要完成符号解析和重定位两个任务。 目标文件有三种形式:可重定位目标文件(.so);可执行目标文件(.exe),共享目标文件(.so)。 linux x86-64 的可重定位目标文件使用 ELF 格式。ELF 头的前 16 字节描述文件对应系统的字的大小和字节顺序,后面还有头的大小,目标文件类型,机汽类型,各 section header 的文件偏移,以及它们的大小和数量。 一般 ELF 包含以下几种 section: .text:可执行机器码 .rodata:只读数据,如字符串
今天翻翻老本,翻到一款上天入地的神器 —— readelf,据说用它可以拂开云雾,抽丝剥茧,去伪存真,深入其里。它就像一把精工刀,专用于对ELF格式文件进行外科手术般的解剖,今天我们来见识见识。
本节我们结合前面的知识点,通过动手实践来分析一个”恶意“程序。这次我们使用的例子具有极强的动手实践性,它也非常能代表恶意程序入侵系统的很多流程步骤,跟着做下来你一定收获颇多。
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说readelf命令使用说明[通俗易懂],希望能够帮助大家进步!!!
在上一篇博客 【Android 逆向】ELF 文件格式 ( ELF 程序头入口大小 | ELF 程序头入口个数 | ELF 文件节区头入口大小 | ELF 文件节区头入口个数 | 字符表序号 ) 中 , 分析到该 ELF 文件的程序头有 7 个入口 , 每个入口大小 32 字节 ;
本文介绍了ELF的基本结构和内存加载的原理,并用具体案例来分析如何通过ELF特性实现HIDS bypass、加固/脱壳以及辅助进行binary fuzzing。
随着 Android 开发的技术宽度不断向 native 层扩展,Native hook 已经被用于越来越多的业务场景中,之前作者一直游离于Java层面的逆向,后来工作使然,接触到了Native 层的Hook,熟悉了ELF的文件结构&GOT/PLT&In Line Hook的相关知识和实际操作,Android Native Hook 的实现方式有很多种,我们接下来要讲的是 GOT/PLT Hook (篇幅略略略长,阅读时长约 20 min )
相信有不少 Linux 用户都碰到过运行第三方(非系统自带软件源)发布的程序时的 glibc 兼容性问题,这一般是由于当前 Linux 系统上的 GNU C 库(glibc)版本比较老导致的,例如我在 CentOS 6 64 位系统上运行某第三方闭源软件时会报:
vma是指的不同段的地址入口,可以看到虽然段有很多,但是type类型大部分都一样,比如代码段类型分为了两个段描述更加细致;数据段更夸张用了五个段存储初始化了的变量
建议关闭地址随机化,否则会出现gdb中无法在断点处停下来的情况(尤其是qemu中)。可以参考:https://blog.csdn.net/gatieme/article/details/104266966
每个目标文件都有好多个段,目标文件在被链接成可执行文件时,输入目标文件中的各个段如何被合并到输出文件?
欲成其事先利其器。要想完成一项复杂的任务,工具的作用至关重要。要想在Linux系统上开发或研究木马病毒等特殊程序,我们需要使用一系列强大的开发和调试攻击。本节先介绍几种在Linux系统上极为强大的工具。
在IDA动态调试-没啥卵用的静态加固中,我构造了一个畸形的ELF文件,虽然能够糊弄一下IDA的静态分析,但是动态分析无效。
今天我们要来探究的内容是一个或者多个源文件(.c)是如何变成一个可执行程序(.exe)的,博主将在Linux环境gcc编译器中进行分步演示,让你深入理解程序环境。
原文:http://xcd.blog.techweb.com.cn/archives/222.html
/proc/kallsyms会显示内核中所有的符号,但是这些符号不是都能被其他模块引用的(绝大多数都不能),能被导出的是符号的类型是大写的那些(例如T,U)。
我相信大家都有过这样的经历,在面试过程中,考官通常会给你一道题目,然后问你某个变量存储在什么地方,在内存中是如何存储的等等一系列问题。不仅仅是在面试中,学校里面的考试也会碰到同样的问题。
ELF目标文件格式最前部ELF文件头(ELF Header),它包含了描述了整个文件的基本属性,比如ELF文件版本、目标机器型号、程序入口地址等。其中ELF文件与段有关的重要结构就是段表(Sectio
eCapture是一款基于eBPF技术实现的用户态数据捕获工具。不需要CA证书,即可捕获https/tls的通讯明文。
上边的资料对ELF文件格式的分析非常详细,这边主要记录一下自己感觉比较重要和掌握的不是很清楚的部分,增加一些自己的理解,也方便后续查阅。
在ANSI C(美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准)的任何一种实现中,程序都存在两个不同的环境。
节包含了ELF文件中除了文件头,程序段头表,节头表之外的所有内容。 节的索引中有几项是特殊的,比如如下几个:
那么多对于我们初学者来说要学习哪种风格呢?答案是肯定的,学习GNU风格的汇编代码,因为做Linux驱动开发必须掌握的linux内核、uboot,而这两个软件就是GNU风格的。
背景:第三方so依赖glibc2.14版本,如何在不升级redhat 6.2自带的gblic2.12情况下,运行so?
本文是对去年做的webview接入HttpDNS工作的一个总结,拖的时间有点久了。主要分享了GOT Hook webview中域名解析函数的方法。 HttpDNS简介 首先简单介绍下移动App接入HttpDNS后有什么好处,这里直接引用腾讯云文档中的说明: HttpDNS是通过将移动APP及桌面应用的默认域名解析方式,替换为通过Http协议进行域名解析,以规避由运营商Local DNS服务异常所导致的用户网络接入异常。减少用户跨网访问,降低用户解析域名时延。 更详细的内容可以参考这篇文章:【鹅厂网事】
①这里所谓的“二进制”,英文称为raw binary。这种程序只包含机器码。而ELF程序还包含有其它额外的信息,如段的加载地址,运行地址,重定位表,符号表。
Go 语言以其高效和简洁著称,是许多现代软件开发的首选语言之一。作为一个强大的编程语言,Go 提供了丰富的标准库,其中 debug 库尤为重要。本文将深入探讨 Go 语言的 debug 库,解释其各个子包的功能,并探讨在系统运维中的实际应用。
我们经常在游戏目录下看见dll文件,这是windows下的动态链接库。在linux下我们可以使用-shared -fpic生成so文件。
$ ld a.o b.o -e main -o ab // -e main 表示将main函数作为程序入口
书接上文,我们已经学习了 Linux 中的编辑器 vim 的相关使用方法,现在已经能直接在 Linux 中编写C/C++代码,有了代码之后就要尝试去编译并运行它,此时就可以学习一下 Linux 中的编译器 gcc/g++ 了,我们一般使用 gcc 编译C语言,g++ 编译C++(当然 g++ 也可编译C语言),这两个编译器我们可以当作一个来学习,因为它们的命令选项都是通用的,只是编译对象不同。除了编译器相关介绍外,本文还会库、自动化构建工具、提权等知识,一起来看看吧
编译与链接的过程可以分解为4个步骤:分别是预处理(Prepressing )、编译(Compilation )、汇编(Assembly )和链接(Linking ),一个helloworld的编译过程如下:
链接是将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存中执行。
领取专属 10元无门槛券
手把手带您无忧上云