Articles of 加载器

Linux用户空间ELF加载器

我需要做一个相当不寻常的事情:手动执行一个elf可执行文件。 即加载所有部分到正确的位置,查询main()并调用它(然后清理)。 可执行文件将被静态链接,所以不需要链接库。 我也控制基地址,所以不用担心可能的冲突。 那么,是否有任何图书馆? 我发现OSKit和它的liboskit_exec,但自2002年以来似乎已经死了。 我可以参与部分项目(当然尊重许可证),并根据我的需要定制它们,但是因为我在Linux世界中是个不错的select,所以我甚至不知道在哪里find这些部分! 🙂 PS。 我需要ARM平台。 UPD好了,装载精灵的事情似乎需要一些关于它的好的知识(叹气),所以我出去读一些规格和手册。 我想我会坚持仿生/链接器和libelfsh。 多谢你们! 总结发现: libelf : http : //directory.fsf.org/project/libelf/ elfsh和libelfsh (现在是eresi的一部分): http ://www.eresi-project.org/ elfio (另一个精灵库): http : //sourceforge.net/projects/elfio/ OSKit和liboskit_exec (过时): http : //www.cs.utah.edu/flux/oskit/ 仿生/链接器 : https : //android.googlesource.com/platform/bionic

加载时间ELF重定位

我在Linux下编写了一个简单的用户空间ELF加载器(为什么?)。 我目前的加载程序非常简单,只能加载静态链接的包含位置无关代码的ELF文件。 通常,当一个程序被内核的ELF加载器加载时,它被加载到它自己的地址空间中。 因此,数据段和代码段可以按照ELF段中指定的正确的虚拟地址加载。 但是,在我的情况下,我通过mmap从内核请求地址,可能会或可能不会获得ELF段中请求的地址。 这是代码段的问题,因为它是独立的。 但是,如果数据段没有加载到预期的地址,则代码将无法正确引用存储在数据段中的任何内容。 事实上,我的加载程序似乎工作正常与一个简单的程序集可执行文件不包含任何数据。 但是,只要我添加一个数据段并引用它,可执行文件无法正确运行或SEGFAULT。 如果可能的话,我可以如何修正对数据段的任何引用以指向正确的位置? (静态)ELF文件中是否存在重定位部分?

是否有可能取代操作系统的装载机? 任何方式来获得对Loader的控制?

我只是想知道是否有可能取代操作系统(Windows是我的select)的Loader(可执行程序加载程序,而不是引导加载程序)。 是否有任何第三方装载机可用于修补默认的装载机? 有什么办法通过我可以获得对OS Loader的控制? 我的意思是,我希望事情能够让我看到(每一步)。 如果你问我为什么要这样做, For learning purposes.

链接:.a,.lib和.def文件

我正在使用GNU binutils在Windows上构build一个dll。 我知道DLL可以加载时,可执行文件加载或运行时(使用LoadLibrary API调用)。 对于加载时加载,我似乎只需要dll文件:不需要.a,.lib或.def文件。 我想知道这些文件格式代表什么和他们的目的是什么。 我所知道的和一些具体的问题: .a是Unix上通常用于静态库的扩展。 .a文件是使用GNU ld的–out-implib选项生成的。 据说这是一个“import图书馆”,够公平的。 现在的问题是“如果链接时不需要导入库,对我有什么好处?” .lib是在Windows上用于静态库的扩展,根据维基百科,它也被用作windows下的“导入库”,所以我强烈怀疑它们只是binutils调用.a文件的另一个名称。 真假 ? 我可以find所有页面.def文件列出了导出的DLL符号。 这与“import图书馆”应该做什么有些类似? 此外,我在这里读到,使用.def文件是手动指定源文件中的导出(我所做的)的替代方法。 但我也记得阅读(无法find参考).def文件提供一个索引( 序数 )到导出的符号,允许更快的运行时加载。 是这样吗 ?

更改Windows DLL加载顺序? (加载顺序,不是search顺序)

说我有一个可执行文件: app.exe 我在这个可执行文件中使用2个不同的第三方DLL: foo.dll bar.dll和应用程序必须隐式链接到这些DLL,也就是我不能使用::LoadLibrary来加载它们。 (注意:并不是我无法调用LoadLibrary ,但是这些DLL需要静态链接(C ++ DLL与__declspec(dllexport) ),所以我调用LoadLibrary没有任何意义,因为可改变的加载器已经调用它了。 这两个DLL 没有任何依赖关系,也就是说,他们的加载顺序是不确定的,据我所知( 应该是不相关的)。 (两者的依赖关系基本上只在标准的windows dll(kernel32,msvcrt等) 我现在有问题,我希望控制这些DLL的加载顺序,那就是我希望foo.dll 总是在bar.dll之前加载( DLL_PROCESS_ATTACH )。 是不是有可能告诉Windows DLL加载器加载一个DLL之前? 编辑:要检查可执行文件的DLL加载顺序 ,可以使用DUMPBIN.exe实用程序:(只需启动Visual Studio命令提示符) 编辑:根据这个答案 / 这个博客条目 ,NT加载程序确实按顺序走入导入部分。 (这将导致独立的 DLL以它们出现在导入部分的顺序加载。) C:\path\to\program> dumpbin /IMPORTS app.exe | grep -i \.dll MSVCR80D.dll KERNEL32.dll OLEAUT32.dll MSVCP80D.dll foo.dll bar.DLL 这个输出意味着MSVCR80D.dll(及其依赖[a] )将首先被加载,并且bar.DLL将被最后加载。 卸载将以相反的顺序发生。 我还没有发现的是如何影响这个加载顺序 … (笔记) [a]:当然,这意味着kernel32.dll将被加载,因为msvcr80d.dll将依赖于kernel32.dll。 根据一些要求,我为此添加了一个基本原理:( 但是请 ,我仍然对此感兴趣, 我知道如何解决MFC问题。 […]

作为代码执行数据?

我的客户要求我编写一个自定义的encryption可执行文件,以防止许可证系统轻易破解。 现在,我明白这是一种错误的安全感,但是尽pipe如此,他还是坚持了这一点。 所以,我挖掘了我的可移植可执行文件的知识,并提出了这个想法: encryption可执行文件 将其粘贴到加载器可执行文件的最后,并将其放大 加载器解密数据 它将代码复制到分配有具有可执行权限的VirtualAlloc的页面 它find应用程序的入口点 跳到那里,我们都准备好了。 我有一个问题跳到那里的一部分。 我怎样才能做到这一点? 如果我要为它设置一个函数指针,签名是什么? 加载的可执行文件main()函数的签名? 还是我需要诉诸大会? 我知道在加载代码之后可能需要更正绝对地址。 我如何检查是否需要,以及如何执行此操作? 编辑:在窗口上工作和编译与GCC。 如有必要,我可以切换Microsoft编译器。 编辑2:澄清:我知道它是毫无意义的。 我相信这代表任何一种DRM。 这是由我的客户来决定,他仍然希望尽pipe我警告他这件事。 提前致谢。