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

Pet*_*háč 12 windows winapi executable operating-system exe

我对编译魔术并不熟悉.改造人类可读的代码(或不行为真正可读大会指令)转换成机器代码,对我来说,火箭科学与巫术相结合.

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

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

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

我怎样才能理解EXE文件中的内容?

dre*_*lax 15

OllyDbg是一个很棒的工具,可以将EXE反汇编成可读指令,并允许您逐个执行指令.它还告诉您程序使用哪些API函数,如果可能,还告诉它它提供的参数(只要参数在堆栈中找到).

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

您可以选择Paul Carter博士的PC汇编语言教程,这是一本免费的入门级书籍,介绍了汇编以及Intel 386 CPU的运行方式.其中大部分甚至适用于现代消费者的英特尔CPU.

EXE格式特定于Windows.入口点(即第一个可执行指令)通常位于EXE文件中的相同位置.一次解释所有这一切都很困难,但我提供的资源应该有助于至少治愈你的一些好奇心!:)

  • 这是非常好的答案。你对我的好奇心的看法是对的。这并不是说我需要反汇编可执行文件,我只是非常感兴趣,并且想玩一下可执行文件。当我理解一些超出我当前视野的东西时,会有那种哇的感觉:) (2认同)

小智 6

您需要一个反汇编程序,它将机器代码转换为汇编语言.此Wikipedia链接描述了该过程并提供了免费反汇编程序的链接.当然,正如你所说,你不懂汇编语言,这可能不是很有用 - 你到底想要做什么?


Dea*_*unt 5

您可以从命令行使用调试,但这很难。

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
Run Code Online (Sandbox Code Playgroud)


gro*_*ver 5

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

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

您可以使用反汇编程序直接查看机器代码.结合手册,您可以在大多数时间猜测源代码.

然后是MSIL EXE:.NET可执行文件持有微软中间语言,这些不包含特定于机器的代码,而是包含.NET CIL代码.其规格可在ECMA网站上获得.

可以使用Reflector等工具查看这些内容.


Max*_*xVT 5

可移植可执行文件中描述了EXE文件的内容.它包含有关如何加载文件的操作系统的代码,数据和说明.

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

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