windows - 如何手动读/写.exe机器代码?

标签 windows winapi operating-system exe executable

我不太熟悉编译器魔法。将人类可读的代码(或不是真正可读的汇编指令)转换为机器代码的行为,对我来说,是结合魔法的火箭科学。

我将把这个问题的主题缩小到 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/

相关文章:

windows - MulDiv 是否比存储已知值和在其他代码中进行数学计算效率低

windows - 在一行中使用多个命令

c++ - WaitForSingleObject 超时太快

linux - Pintos 示例

c - shm_open() 和 ftruncate() 的用途?

c - 整数大小的变化?

windows - vlc 马赛克中的 Udp 流

winapi - 获取父窗口的正确方法

winapi - 无法编译 Win32 应用程序

c# - Windows应用程序-c#中的MySql错误System.InvalidOperationException