Windows 如何手动读取/写入.exe机器代码?
我对编译器的魔力不太熟悉。对我来说,将人类可读代码(或不是真正可读的汇编指令)转换为机器代码的行为是火箭科学与魔法的结合 我将把这个问题的主题缩小到Win32可执行文件(.exe)。当我在一个专门的查看器中打开这些文件时,我可以找到分散在不同位置的字符串(通常每个字符16b),但其余的都是垃圾。我想不可读的部分(大多数)是机器代码(或者可能是资源,比如图像等等) 有没有直接的方法来读取机器代码?将exe作为文件流打开并逐字节读取,如何将这些单独的字节转换为程序集?这些指令字节与汇编指令之间是否存在直接映射 .exe是如何编写的?每个指令四个字节?更多较少的我注意到一些应用程序可以像这样创建可执行文件:例如,在ACD See中,您可以将一系列图像导出到幻灯片中。但这不一定是SWF幻灯片,ACD See还能够生成可执行的演示文稿。这是怎么做到的Windows 如何手动读取/写入.exe机器代码?,windows,winapi,operating-system,exe,executable,Windows,Winapi,Operating System,Exe,Executable,我对编译器的魔力不太熟悉。对我来说,将人类可读代码(或不是真正可读的汇编指令)转换为机器代码的行为是火箭科学与魔法的结合 我将把这个问题的主题缩小到Win32可执行文件(.exe)。当我在一个专门的查看器中打开这些文件时,我可以找到分散在不同位置的字符串(通常每个字符16b),但其余的都是垃圾。我想不可读的部分(大多数)是机器代码(或者可能是资源,比如图像等等) 有没有直接的方法来读取机器代码?将exe作为文件流打开并逐字节读取,如何将这些单独的字节转换为程序集?这些指令字节与汇编指令之间是否存
我如何理解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++是如何生成的最简单的方法 有几本书可以帮助你理解:-
如果你读过像CD21这样的东西,你是如何记住不同的组合的 你的好奇心和你的理解力都与我当时的情况一模一样。我强烈推荐。这不会回答您在这里提出的所有问题,但它会