我不太熟悉编译器魔法。将人类可读的代码(或不是真正可读的汇编指令)转换为机器代码的行为,对我来说,是结合魔法的火箭科学。
我将把这个问题的主题缩小到 Win32 可执行文件 (.exe)。当我在专门的查看器中打开这些文件时,我可以找到散落在不同地方的字符串(通常每个字符 16b),但其余的只是垃圾。我想不可读的部分(大部分)是机器代码(或者可能是资源,例如图像等...)。
有没有直接读取机器码的方法?将exe作为文件流打开并逐字节读取,如何将这些单独的字节转换为程序集?这些指令字节和汇编指令之间是否存在直接映射?
.exe是怎么写的?每条指令四个字节?更多的?较少的?我注意到一些应用程序可以像那样创建可执行文件:例如,在 ACD See 中,您可以将一系列图像导出到幻灯片中。但这不一定是 SWF 幻灯片,ACD See 也能够生成可执行的演示文稿。这是怎么做到的?
我如何理解 EXE 文件中发生的事情?
最佳答案
OllyDbg是一个很棒的工具,可以将 EXE 反汇编为可读指令,并允许您逐条执行指令。它还会告诉您程序使用了哪些 API 函数,如果可能,还会告诉您它提供的参数(只要在堆栈中找到了参数)。
一般而言,CPU 指令的长度是可变的,有的是一个字节,有的是两个字节,有的是三个字节,有的是四个字节等等。这主要取决于指令期望的数据类型。有些指令是通用的,例如“mov”,它告诉 CPU 将数据从 CPU 寄存器移动到内存中的某个位置,反之亦然。实际上,有许多不同的“mov”指令,用于处理 8 位、16 位、32 位数据的指令,用于从不同寄存器移动数据的指令等等。
您可以拿起 Paul Carter 博士的 PC Assembly Language Tutorial这是一本免费的入门级书籍,讨论了汇编以及 Intel 386 CPU 的工作原理。其中大部分甚至适用于现代消费者英特尔 CPU。
EXE 格式特定于 Windows。入口点(即第一条可执行指令)通常位于 EXE 文件中的同一位置。一次解释全部有点困难,但我提供的资源至少应该有助于解决您的一些好奇心! :)
关于windows - 如何手动读/写.exe机器代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756367/