重定位

ELF(Executable and Linkable Format)

和自甴很熟 提交于 2019-11-28 15:43:34
目录 0. 引言 1. ELF文件格式 2. ELF格式分析工具 0. 引言 0x1: ELF文件类型 ELF文件标准里把系统中采用ELF格式的文件归为以下几类 1. 可重定位文件(Relocatable File) 这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类 1) .o文件 2. 可执行文件(Executable File) 这类文件包含了可以直接执行的程序,它的代表就是ELF可执行文件,它们一般都没有扩展名 1) /bin/bash文件 3. 共享目标文件(Shared Object File) 这种文件包含了代码和数据,可以在以下两种情况下使用 1) 链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件 2) 动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分来运行 共享目标文件典型的类型就是: .so文件 4. 核心转储文件(Core Dump File) 当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件 1) core dump 1. ELF文件格式 我们知道,对于windows中使用的PE文件结构来说,也存在一种"磁盘上PE结构"和"内存中PE结构"的概念,原因在于操作系统为了提高CPU的读写效率

作为一个新人,怎样学习嵌入式Linux ?(韦东山)

不羁的心 提交于 2019-11-28 01:48:02
作为一个新人,怎样学习嵌入式Linux ?(韦东山) 被问过太多次,特写这篇文章来回答一下 。 在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会) 。 C语言要学到什么程度呢?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序 、 输入数字求和什么的。 学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析 。 以前我是用 VC来练习C语言的,经常去尝试着写一些C语言竞赛的题目。它们是纯C 、 纯数学、纯逻辑的题目,不涉及界面这些东西, 很适合煅炼你的编程能力。 回到主题,首先我们要明白你的目的是什么,大概来说所谓嵌入式Linux可以分为两部分:底层系统 、 应用开发。 如果你是想做应用开发,那么你去把C语言、数据结构 、 JAVA什么的学好吧。嵌入式应用开发和PC上的 应用开发并没有什么特别要注意的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序 和PC上的程序开发没什么差别 。 另外,当你有能力去优化时,你已经不用来问这个问题了。具体到某个例子, 比如说开发界面,在PC上我们用VC;在嵌入式Linux里也许我们用QT也许用Android,这个时候你应该去学学QT 、 Android的编程。但是基础还是C或JAVA,在此基础上去熟悉它们的接口。你学过VC的话

作为一个新人,怎样学习嵌入式Linux,(韦东山)

為{幸葍}努か 提交于 2019-11-28 01:47:45
还有一个比较好的文章,写的是具体的怎么按照韦东山的书和视频进行学习的。网址 https://www.zhihu.com/question/47881392 很早以前在网上看到的韦东山老师写的文章,复制到自己的博客,方便自己以后看。 在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。 C语言要学到什么程度呢?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。 学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析。以前我是用 VC来练习C语言的,经常去尝试着写一些C语言竞赛的题目。它们是纯C、纯数学、纯逻辑的题目,不涉及界面这些东西, 很适合煅炼你的编程能力。 回到主题,首先我们要明白你的目的是什么,大概来说所谓嵌入式Linux可以分为两部分:底层系统、应用开发。 如果你是想做应用开发,那么你去把C语言、数据结构、JAVA什么的学好吧。嵌入式应用开发和PC上的 应用开发并没有什么特别要注意的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序 和PC上的程序开发没什么差别。另外,当你有能力去优化时,你已经不用来问这个问题了。具体到某个例子, 比如说开发界面,在PC上我们用VC;在嵌入式Linux里也许我们用QT也许用Android

【操作系统】 内存管理

假如想象 提交于 2019-11-28 01:05:27
内存管理概念 内存管理的功能有: 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,提高编程效率。 地址转换。在多道程序环境下,程序中逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供存储变换功能,把逻辑地址转换成相应的物理地址。 内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。 存储保护。保证各道作业在各自的存储空间内运行,互不干扰。 创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤: 编译。由编译程序将用户源代码编译成若干目标模块。 链接。由链接程序将编译后形成的一组目标代码及所需的库函数链接在一起,形成一个完整的装入模块。 装入。由装入程序将装入模块装入内存运行。 程序的链接有以下三种方式: 静态链接。在程序运行前,先将各自目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。 装入时动态链接。将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。 运行时动态链接。对某些目标模块的链接,是在程序执行中需要该模块时才进行的。其优点是便于修改和更新,便于实现对目标模块的共享。 内存的装入模块在装入内存时,同样有以下三种方式: 绝对装入 。在编译时,若知道某个程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址

2019-8-10-linux

◇◆丶佛笑我妖孽 提交于 2019-11-28 00:02:03
============================================= title:2019-8-10-linux ============================================= title:2019-8-10-linux 程序的组成 代码重定位 基本概念 链接脚本的作用 链接脚本介绍 链接脚本代码实例分析 C函数怎么使用lds文件中的变量 如何编写位置无关码 重定位代码实例分析 方式一 重点: #F44336 方式二 title:2019-8-13-linux ATPCS中各寄存器的使用规则及其名称 ARM——THUMB子程序调用规则 ATPCS 寄存器的使用规则总结 #F44336 数据栈使用规则 #F44336 title:2019-8-19-linux MakeFile中的符号 汇编中标签的含义 中断发生时CPU的处理过程 CPU处理中断程序 CPU从中断服务程序返回到主程序 ARM的七种工作模式 七种模式的概述 各模式之间的切换逻辑 程序的组成 代码段:用于存放数据 数据段:用于存放全变量(有初始值,且不为零) 只读数据段:用于存放只读数据,如:const 变量 bss段:用于存放未初始化的全局变量,或初始化为零的全局变量 comment段:用于存放代码的一些注释信息 其中bss段和comment的内容不存放在bin文件中。

Linux的ELF文件

社会主义新天地 提交于 2019-11-27 22:35:20
一、文件头: sizeof(Elf32_Ehdr)=52 e_type: 类型---可重定位文件.o、可执行文件、共享目标文件.so e_ehsize: 文件头大小---52 e_machine: CPU平台属性,如Intel_x86; e_entry: 入口虚拟地址,但是可重定位文件没有; e_shoff: 段表偏移量, 即在ELF文件的位置;下面两个11*40=440表达段表长度 e_shnum: 段表描述符数量,即段表中段的个数:11 e_shentsize: 段表描述符大小,sizeof(Elf32_Shdr)=40 e_shstrndx: 段表字符串表所在的段在段表中的下标; 二、段表: sizeof(Elf32_Shdr)=40 sh_name: 段名,如.test/.data/.bss/.rodata/.comment, .rel.text/.rel.data, .symtab, .strtab/.shstrtab, sh_type: 类型---程序段、重定位表、符号表、字符串表 sh_flags: 标志位---可写、可执行、分配空间 sh_addr: 加载后在地址空间中的虚拟地址 sh_offset: 段偏移量,即该段该文件中的地址!!!!!!!!!!!!!!!!! sh_size: 段大小 sh_link: 符号表的下标 sh_info: 作用于哪个段? 三

AIX中逻辑卷管理

99封情书 提交于 2019-11-27 20:44:01
1、逻辑卷管理 逻辑卷的大小确定: 逻辑卷大小(MB)=PP的大小(MB)*LV包含的LP的个数 LV占用的物理空间(MB)=PP的大小(MB)*LV包含的LP的个数*LV拷贝的副本数 逻辑卷控制块(LVCB) #getlvcb -TA hd2 显示逻辑卷hd2中的LVCB信息 1.1 创建逻辑卷 AIX通过在卷组上创建逻辑卷来为文件系统、数据集裸设备提供可使用的空间。 逻辑卷可以创建文件系统,或者直接作为裸设备使用。 使用mklv指令创建逻辑卷。 mklv指令参数 -a position 设置内部物理卷分配策略(在物理卷上的逻辑分区的位置)。Position 变量可以是以下之一: m --在每个物理卷的外部中间扇区内分配逻辑分区。这是缺省的位置。 c--在每个物理卷的中间扇区内分配逻辑分区。 e--在每个物理卷的外部边缘段内分配逻辑分区。 ie--在每个物理卷的内部边缘段内分配逻辑分区。 im--在每个物理卷的内部中间段内分配逻辑分区。 -b BadBlocks 设置坏区重定位策略。Relocation 变量可以是以下之一: y--发生坏区重定位。这是缺省值。 n--防止发生坏区重定位。 -c copies 设置分配给每个逻辑分区的物理分区数。Copies 变量的值可以设置为从 1 到 3,缺省值是 1。 -d Schedule 当多于一个的逻辑分区被写入时,设置调度策略

写壳1

本小妞迷上赌 提交于 2019-11-27 20:35:59
写壳的步骤 编写加壳器,加载被加壳程序和壳dll程序 将 dll 程序中 .text 拷贝到被加壳程序 将被加壳程序的 eip 指向stub 代码 需要让 stub 提供一个入口点 1. 加载 PE 文件5. 加载 Stub 文件 8. 加载共享数据,写入了原始OE篇2. 添加了一个区段4. 实现了一个 stub 提供了 start 7. 提供了一个共享数据结构 9. 重新跳转到 oep3. 将区段的内容进行了拷贝6. 重新设置了 oep10. 因为没有进行壳代码重定位,所以跳转失败 11. 对壳代码进行了重定位12. 加密代码段,保存了 key rva size13. 壳代码根据提供的内容进行解密 14. 解密时分页没有访问属性 15. 提供了获取函数的功能,添加了一个 VirtualProtect 函数 16. 设置属性,修复了加密的后的代码,最终跳转oep 首先,加载要加壳的PE文件 // 加载一个 PE 文件void CMyPack::LoadFile(LPCSTR FileName){ // 打开一个文件,理论上应该对文件进行判断,是否是一个 PE 文件,位数是多少 HANDLE FileHandle = CreateFileA(FileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN

SHELL手动加壳

一个人想着一个人 提交于 2019-11-27 13:13:54
SHELL 壳的运行原理: 加壳过的EXE文件是可执行文件,它可以同正常的EXE文件一样执行。 用户执行的实际上是外壳程序,这个外壳程序负责把用户原来的程序在内存中解压缩,并把控制权交还给解开后的真正程序 ,这一切工作都是在内存中运行的,整个过程对用户是透明的。 • 编译 :将单个的 .c 或 .cpp 编译成中间文件 (.obj),在 VS 下,这个过程由 cl.exe 程序完成。 • 链接 :将编译出的 .obj 中间文件、系统的启动文件和用到的库文件链接成一个可执行文件 (.exe)。VS 下由 link.exe 程序完成 • 装载 :将一个可执行文件映射到虚拟地址空间并执行,由操作系统完成。在装载的过程中,完了让程序正常被执行,会有下列几个步骤: 1.判断是否开启重定位,如果开启了,将 PE 文件加载到指定位置,并且修复目标PE 文件的重定位。 2.遍历导入表,加载使用到的所有模块到内存,修复模块相关的信息,并根据导入表中的函数名称,填充所有的 IAT 地址项。 3.查看当前是否存在 TLS 回调函数,如果存在,则传入进程创建事件,依次调用 所有的 TLS 回调函数。 4.以 PE 文件中的 AddressOfEntryPoint 为起始位置,创建线程并运行。 MZ 头: (0x00) WORD e_magic: 标识当前是一个有效的 DOS 文件,必须为 0x5A4D。

gcc/g++编译选项: -fPIC

旧时模样 提交于 2019-11-27 05:11:13
在理解PIC概念之前,先了解一下动态链接库的载入时重定位概念。 载入时重定位: 我们知道,Linux的可执行文件一般是elf格式的,在这个可执行文件的头部包含了很多重要的信息:如文件格式,加载地址,符号表等。当连接器链接生成可执行文件时,会将程序的加载地址写入可执行文件头。在程序运行时,动态加载器将可执行文件载入文件头指定的加载地址处,并加载该地址,开始从该地址处运行。由此可见,可执行文件的起始地址是在编译时就决定的: ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x4005b0 // 程序入口地址 Start of program headers: 64 (bytes into file) Start of section headers: 4472 (bytes into