Windows 如何手动读取/写入.exe机器代码?

Windows 如何手动读取/写入.exe机器代码?,windows,winapi,operating-system,exe,executable,Windows,Winapi,Operating System,Exe,Executable,我对编译器的魔力不太熟悉。对我来说,将人类可读代码(或不是真正可读的汇编指令)转换为机器代码的行为是火箭科学与魔法的结合 我将把这个问题的主题缩小到Win32可执行文件(.exe)。当我在一个专门的查看器中打开这些文件时,我可以找到分散在不同位置的字符串(通常每个字符16b),但其余的都是垃圾。我想不可读的部分(大多数)是机器代码(或者可能是资源,比如图像等等) 有没有直接的方法来读取机器代码?将exe作为文件流打开并逐字节读取,如何将这些单独的字节转换为程序集?这些指令字节与汇编指令之间是否存

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

我将把这个问题的主题缩小到Win32可执行文件(.exe)。当我在一个专门的查看器中打开这些文件时,我可以找到分散在不同位置的字符串(通常每个字符16b),但其余的都是垃圾。我想不可读的部分(大多数)是机器代码(或者可能是资源,比如图像等等)

有没有直接的方法来读取机器代码?将exe作为文件流打开并逐字节读取,如何将这些单独的字节转换为程序集?这些指令字节与汇编指令之间是否存在直接映射

.exe是如何编写的?每个指令四个字节?更多较少的我注意到一些应用程序可以像这样创建可执行文件:例如,在ACD See中,您可以将一系列图像导出到幻灯片中。但这不一定是SWF幻灯片,ACD See还能够生成可执行的演示文稿。这是怎么做到的


我如何理解EXE文件中的内容?

您可以从命令行使用debug,但这很难

C:\WINDOWS>debug taskman.exe
-u
0D69:0000 0E            PUSH    CS
0D69:0001 1F            POP     DS
0D69:0002 BA0E00        MOV     DX,000E
0D69:0005 B409          MOV     AH,09
0D69:0007 CD21          INT     21
0D69:0009 B8014C        MOV     AX,4C01
0D69:000C CD21          INT     21
0D69:000E 54            PUSH    SP
0D69:000F 68            DB      68
0D69:0010 69            DB      69
0D69:0011 7320          JNB     0033
0D69:0013 7072          JO      0087
0D69:0015 6F            DB      6F
0D69:0016 67            DB      67
0D69:0017 7261          JB      007A
0D69:0019 6D            DB      6D
0D69:001A 206361        AND     [BP+DI+61],AH
0D69:001D 6E            DB      6E
0D69:001E 6E            DB      6E
0D69:001F 6F            DB      6F

你需要一个反汇编程序,它可以把机器代码转换成汇编语言。本文描述了该过程,并提供了指向免费反汇编程序的链接。当然,正如您所说,您不了解汇编语言,这可能不是很有用-您到底想在这里做什么?

是一个很棒的工具,它可以将EXE分解为可读的指令,并允许您逐个执行指令。它还告诉您程序使用什么API函数,如果可能,还告诉您程序提供的参数(只要在堆栈上找到参数)

一般来说,CPU指令的长度是可变的,有些是一个字节,有些是两个字节,有些是三个字节,有些是四个字节等等。这主要取决于指令所期望的数据类型。有些指令是通用的,比如“mov”,它告诉CPU将数据从CPU寄存器移动到内存中的某个位置,反之亦然。实际上,有许多不同的“mov”指令,用于处理8位、16位、32位数据的指令,用于从不同寄存器移动数据的指令等等

你可以读一下Paul Carter博士的书,这是一本免费入门级的书,讲述了汇编和Intel 386 CPU的运行方式。它的大部分甚至适用于现代消费型英特尔CPU

EXE格式特定于Windows。入口点(即第一条可执行指令)通常位于EXE文件中的同一位置。一下子解释起来有点困难,但我提供的资源至少可以帮助你解决一些好奇心!)

MSDN上的


我建议使用一点WindowsC源代码,在VisualStudio中构建并开始调试它。切换到“反汇编”视图并单步执行命令。您可以看到C代码是如何编译成机器代码的,并可以看到它一步一步地运行。

您看到的可执行文件是Microsofts PE(可移植可执行文件)格式。它本质上是一个容器,它保存有关程序的一些操作系统特定数据,程序数据本身分为几个部分。例如,代码、资源和静态数据存储在单独的部分中

节的格式取决于节中的内容。代码部分根据可执行目标体系结构保存机器代码。在最常见的情况下,这是针对Microsoft PE二进制文件的英特尔x86或AMD-64(与EM64T相同)。机器代码的格式为CISC,可追溯到8086及更早版本。CISC的重要方面是它的指令大小不是恒定的,你必须从正确的地方开始阅读,才能从中获得有价值的东西。英特尔发布了关于x86/x64指令集的优秀手册

您可以使用反汇编程序直接查看机器代码。结合这些手册,您可以在大多数情况下猜测源代码

还有MSIL EXE:Microsofts中间语言的.NET可执行文件,它们不包含特定于机器的代码,而是.NET CIL代码。可在ECMA上在线获取其规格


可以使用Reflector等工具查看这些文件。

中介绍了EXE文件的内容。它包含有关如何加载文件的代码、数据和操作系统说明

机器代码和程序集之间存在1:1映射。反汇编程序将执行反向操作


i386上的每条指令没有固定的字节数。有些是单字节,有些则长得多。

如果它对您来说像它看起来一样陌生,我认为调试器或反汇编程序不会有帮助-您需要先学习汇编程序编程;研究处理器的体系结构(可从英特尔下载大量文档)。然后,由于大多数机器代码都是由编译器生成的,因此您需要了解编译器是如何生成代码的——这是编写大量小程序并将其反汇编以查看C/C++是如何生成的最简单的方法

有几本书可以帮助你理解:-


关于这个问题,还有人读过这样的东西吗 CD 21

我记得桑德拉·布洛克在一个节目中,读了一整屏的十六进制数,并弄清楚了程序的功能。有点像当前版本的读取矩阵代码


如果你读过像CD21这样的东西,你是如何记住不同的组合的

你的好奇心和你的理解力都与我当时的情况一模一样。我强烈推荐。这不会回答您在这里提出的所有问题,但它会