我只需要一个hello world演示来查看机器代码实际上是如何工作的.
虽然windows的EXE和linux'ELF接近机器代码,但它不是PURE
如何编写/执行PURE机器代码?
我尝试了以下内容,但生成的文件仍然是ELF,而不仅仅是部分内容.
$ objcopy --only-section=<name> <infile> <outfile>
Run Code Online (Sandbox Code Playgroud)
我只想要该部分的内容.有没有可以做到这一点的实用工具?有任何想法吗?
我对编译魔术并不熟悉.改造人类可读的代码(或不行为真正可读大会指令)转换成机器代码,对我来说,火箭科学与巫术相结合.
我将把这个问题的主题缩小到Win32可执行文件(.exe).当我在专门的查看器中打开这些文件时,我可以找到分散在不同位置的字符串(通常每个字符16b),但其余的只是垃圾.我认为不可读的部分(大多数)是机器代码(或者可能是资源,例如图像等......).
有没有简单的方法来读取机器代码?将exe作为文件流打开并逐字节读取,如何将这些单独的字节转换为汇编?这些指令字节和汇编指令之间是否有直接的映射?
.exe是如何写的?每条指令四个字节?更多?减?我注意到一些应用程序可以像这样创建可执行文件:例如,在ACD中您可以将一系列图像导出到幻灯片中.但这不一定是SWF幻灯片,ACD See也能够生成EXEcutable演示文稿.怎么做的?
我怎样才能理解EXE文件中的内容?
我想了解可执行文件的工作原理。我希望详细了解一个非常具体的示例将使我能够做到这一点。我的最终目标(可能过于雄心勃勃)是获取一个 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 …
executable ×2
windows ×2
assembly ×1
binutils ×1
disassembly ×1
elf ×1
exe ×1
linux ×1
machine-code ×1
shell ×1
winapi ×1