我参加了三星的采访.他们询问了很多关于程序内存布局的问题.我对此几乎一无所知.
我用Google搜索了"可执行程序的内存布局"."进程的内存布局".
我很惊讶地看到关于这些主题的信息不多.大多数结果都是论坛查询.我只是想知道为什么?
这些是我发现的几个链接:
我想从一本正确的书而不是一些网络链接中学到这一点.(兰迪海德也是一本书,但还有一本书).我可以在哪本书中找到关于这个主题的清晰和更多信息?
我也想知道,为什么操作系统书没有在他们的书中涵盖这一点?我读了第6版的摊位.它只是讨论了过程控制块.
整个布局的创建是对的任务linker吗?我在哪里可以阅读有关此过程的更多信息 我想要从磁盘上的程序到处理器上执行的完整信息.
编辑:
最初,即使在阅读下面给出的答案后,我也不清楚.最近,我在看完这些文章之后看到了这些文章,我明白了.
帮助我理解的资源:
- www.tenouk.com/Bufferoverflowc/Bufferoverflow1b.html
- 5部分PE文件格式教程:http://win32assembly.online.fr/tutorials.html
- 优秀文章:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
- PE Explorer:http://www.heaventools.com/
是的,"可执行程序的布局(PE/ELF)"!="进程的内存布局").在第3个链接中找到自己.:)
在清除了我的概念后,我的问题让我看起来很愚蠢.:)
我想了解可执行文件的工作原理。我希望详细了解一个非常具体的示例将使我能够做到这一点。我的最终目标(可能过于雄心勃勃)是获取一个 hello-world .exe 文件(使用 C 编译器编译并链接)并详细了解它是如何加载到内存中并由 x86 处理器执行的。如果我成功了,我想写一篇文章和/或制作关于它的视频,因为我还没有在互联网上找到这样的东西。
我想问的具体问题用粗体标出。当然,非常欢迎任何进一步的建议和来源做类似的事情。非常感谢您的帮助!
此答案概述了 C 代码在作为程序进入物理内存之前所经历的过程。我还不确定我有多想研究 C 代码是如何编译的。有没有办法在汇编之前查看 C 编译器生成的汇编代码?我可能会认为了解加载和链接过程是值得的。与此同时,我需要了解的最重要的部分是
我对 PA 格式有一个非常基本的了解(这种理解将在“到目前为止我学到的东西”一节中概述)并且我认为那里提供的资料应该足够了,我只需要再研究一下,直到我足够了解基本的 Hello-World 程序。当然,非常欢迎有关此主题的更多来源。
对于 x86 来说,将字节码转换为汇编代码(反汇编)似乎相当困难。尽管如此,我很想了解更多关于它的信息。您将如何反汇编一个短字节代码段?
我仍在寻找一种查看进程内存(分配给它的虚拟内存)内容的方法。我已经研究过 windows-kernel32.dll 函数,例如ReadProcessMemory但还不能让它工作。我也很奇怪似乎没有(免费)工具可用于此目的。再加上对加载的理解,我也许就能理解进程是如何从 RAM 运行的。此外,我正在寻找允许查看整个进程虚拟内存内容的汇编程序员的调试工具。我目前搜索的起点是这个问题。您对我如何查看和理解从 RAM 加载和进程执行有进一步的建议吗?
这个 StackOverflow 问题的其余部分详细描述了我到目前为止所学到的知识并提供了各种来源。它旨在可复制并帮助任何试图理解这一点的人。但是,我对目前看到的示例仍然有一些疑问。
在 Windows 中,可执行文件遵循PA 格式。在官方文件和这篇文章给出的格式的一个很好的概述。该格式描述了 .exe 文件中各个字节的含义。开头是我不会担心的 DOS 程序(出于遗留原因包括在内)。然后是一堆标头,它们提供有关可执行文件的信息。实际的文件内容被分成具有名称的部分,例如“.rdata”。在文件头之后,还有段头,它告诉您文件的哪些部分是哪个段以及每个段的作用(例如,如果它包含可执行代码)。
可以使用诸如 dumpbin(用于查看二进制文件的微软工具)之类的工具来解析标题和部分。为了与 dumpbin 输出进行比较,可以使用十六进制编辑器甚至使用 Powershell(命令Format-Hex -Path <Path …