Articles of 精灵

两个目标文件中md5sum的差异

我编译两次相同的.c和.h文件,并获得相同大小,但不同的md5sums的对象文件。 这是与objdump -d唯一的区别: 1) cpcidskephemerissegment.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_B8B9E66611MinFunctionEii>: 2) cpcidskephemerissegment.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_8B65537811MinFunctionEii>: 可能是什么原因? 谢谢!

静态库(.a)和共享库(.so)之间的文件格式差异?

我知道关于共享vs静态库的用例有很多问题,这个问题不是这个问题。 我在询问有关存储在磁盘上的文件格式的差异。 为什么问题是,两者有什么区别? 或者它们是完全一样的,只是在使用方面有所不同? 我相信他们不一样,因为在共享库上运行“nm”需要-D标志。 很明显,它需要做一些不同的事情。 为什么? 他们都是ELF文件吗? 唯一的区别是共享库可以包含一些依赖path吗?

为什么函数在x86 Linux的alignment地址加载elf可执行文件?

我一直在研究x86上的Linux elf可执行文件,主要是使用IDA,但也使用gdb。 我注意到的一件事是函数总是加载在字alignment的地址? 有人知道这个的原因吗? 我不知道x86指令的任何要求在alignment的地址开始。 而且它不能由于页面alignment而导致页面边界仍然可以在函数的任何地方。 我将不胜感激。 谢谢。

内存中的哪些部分是可写的?

我正在运行一些C代码,编译为Linux上的32位x86。 而我正在尝试访问一些内存。 显然,我可以写入.bss和.data并到堆栈。 前段时间, .ctors和.dtors段曾经是可写的 ,但似乎已经消失了。 如果没有反复试验,我怎样才能知道片段被映射到哪些片段? 我怎样才能找出哪些地址映射到可写内存,哪些是可执行的?

如何修改一个ELF文件,改变文件的部分数据长度?

我试图修改我自己的ELF文件的可执行内容,看看这是否可能。 我已经编写了一个程序,用于读取和分析ELF文件,search应更新的代码,更改它,然后在更新节标题中的sh_size字段之后将其写回。 但是,这是行不通的。 如果我只是交换一些字节,其他字节,它的工作原理。 但是,如果我改变大小,它会失败。 我知道一些sh_offset是紧邻的, 但是,当我缩小可执行代码的大小时,这应该不重要。 当然,我的程序中可能有一个错误(或多个错误),但我已经精心的经历过了。 我只是想知道,除了需要更新的sh_size字段以使其工作(在缩小尺寸时)还有其他事情吗?而不是寻求帮助来debugging我的程序。 除了那个领域,有什么能够改变长度的吗? 编辑: 安迪·罗斯似乎是完全正确的。 即使在这个非常简单的程序中,我在__libc_start_main中遇到了一些间接寻址,我无法修改它来更新它将到达的偏移量。 我很好奇,那么最好的办法还是尽量争取这个问题呢? 我知道在任何情况下我都无法解决这个问题,但对于一些简单的程序,应该可以更新运行所需的内容。 我应该尝试编写自己的虚拟机,还是尝试开发一个“debugging器”,用INT 3replace每个可疑的问题指令? 有任何想法吗?

将ELF共享库和自定义binfmt可执行文件加载到相同的Linux地址空间中

我正在开发一个项目,在Linux平台上加载和运行一个自定义的二进制格式可执行文件(在我的情况下是PE)。 到目前为止,我已经成功完成了这个工作,首先加载可执行文件,然后加载一个小的ELF共享库,调用可执行文件的开始地址,然后安全地退出。 尽pipe如此,我真的不想自己做ELF加载。 首先,我使用的共享库是用汇编语言编写的(我不能使用任何其他的东西,因为我没有链接到libc等),这将是非常特定于平台的,我想远离并使用C,所以我可以编译任何平台。 而且,使用Linux的本地ELF加载器,而不是我自己的简化版本,会更容易和更安全。 我想知道是否有办法使用我的binfmt处理程序(一个已安装的内核模块)加载我的可执行文件, 然后让Linux将我的共享库(及其依赖项)加载到相同的地址空间中,而不会覆盖我的可执行代码。 我首先想到uselib系统调用可能是有用的,但手册页上的描述不清楚这是否符合我的目的: 从libc 4.4.4只加载库“/lib/ld.so”被加载,以便这个dynamic库可以加载剩余的库(再次使用这个调用)。 这也是libc5中的事态。 glibc2不使用这个调用。 我也从来没有见过它的使用的例子,我总是警惕使用我不明白的系统调用。 有没有一个很好的方法来实现我所描述的? 我可以使用Linux的现有function将共享库(用C语言编写)加载到已经包含可执行代码的地址空间中,如果可以的话,如何在不知道加载的地方使用该库?

在Linux上访问main之外的主要参数

除了通过parsing/proc/self/cmdline之外,是否有可能在Linux上访问main (即共享库构造函数)之外的main参数?

FreeBSD&Linux中的ELF文件结构

在PE(对于Windows)中,可以通过#include<windows.h>来读取该结构的头部/部分,并且可以使用结构PIMAGE_DOS_HEADER来读取任何PE文件中的dos头部。 我怎么能在FreeBSD / Linux中做ELF头文件? 什么样的预处理器需要添加在C / C ++代码的头部? 从ELF的结构来看,FreeBSD和Linux有什么区别吗?

从elf文件的DYNAMIC部分删除条目

我有第三方库A ,这需要一些库B。 A链接到与静态版本B链接的binrary。 因此在B的dynamic版本中不再需要。 A不在我的控制之下,我不能重新编译它。 因此我想从A的 DYNAMIC部分删除NEEDED libA条目。 有没有办法用objcopy或其他工具来做到这一点?

规范的方式来签署(并validation)一个ELF文件?

我想签署ELF文件,最好用一个PGP密钥,然后能够validation签名。 否则,如果这样做更有意义,我还将使用Authenticode或SSL证书进行签名。 现有的选项,如signelf ,似乎只能在copyleft许可证下(即使是LGPL,但强制使用它的限制)或旧的/无法维护的。 我可以在专有程序中使用哪些选项? 注意:即使ELF不是Linux特有的,我们也可以将问题的范围限制在Linux上。 即使没有准备使用自由(非版权)FLOSS许可证下的程序和/或图书馆,如果出现某种事实上的标准,我将不胜感激。 我不知道一个,但那是我问的原因。 从我看到的所有发行版似乎都依赖于签名包和validation这些。 总的来说,这很好,但我想进一步推进。