使用 NASM 编译 Windows 可执行文件

Dav*_* Xu 2 windows x86 assembly nasm

我想使用 NASM 编译 Win32 可执行文件,但我不知道如何。是否有任何必要的头文件告诉 Windows 这个文件是可执行的?

另外,谁能告诉我 Windows 如何知道这是表单应用程序还是控制台应用程序?

小智 9

问题 1:

我想使用 NASM 编译 Win32 可执行文件,但我不知道如何。

编译:

nasm -f win32 test.asm -o test.o

ld test.o -o test.exe

来源: http : //ccm.net/faq/1559-compiling-an-assembly-program-with-nasm

问题2:

是否有任何必要的头文件告诉 Windows 这个文件是可执行的?

文件扩展名表示可执行文件。通过读取此文件的 PE 文件结构,“Windows”能够获取正确加载和执行文件所需的所有信息。

问题 3:

另外,谁能告诉我 Windows 如何知道这是表单应用程序还是控制台应用程序?

读这个:

从技术角度来说,控制台和 Windows 可执行文件之间的唯一区别是 exe 文件的 PE 标头中的一个字节。手动切换该字节(例如使用十六进制编辑器)转换应用程序类型。这是一个发布良好的 hack,用于在 VB6 中创建控制台应用程序(未明确支持此类应用程序)。

要确定和更改应用程序的子系统类型,您需要阅读部分 PE 标头。但是子系统数据的地址不是固定的,因为它是可选文件头的一部分,其位置由存储在 DOS 文件头(在成员 e_lfanew 中)中的地址确定。该地址实际上指向 _IMAGE_NT_HEADERS 记录,该记录又包含 IMAGE_OPTIONAL_HEADER32 结构。它有一个名为 Subsystem 的 int161) 成员。该成员的值为 Windows 应用程序的 2 和控制台应用程序的 3。存在其他子系统(特别是 POSIX 和内核)。我编写了一个小的 VB6 应用程序来更改应用程序的子系统,它可以作为源代码从 ActiveVB 下载。

来源: Windows 和控制台应用程序之间的区别