如何手动读取/写入.exe机器代码?
-
09-09-2019 - |
题
我不太熟悉编译器的魔法。转换人类可读代码(或非 真的 对我来说,将可读的汇编指令)转换成机器代码就是火箭科学与魔法的结合。
我将把这个问题的主题缩小到 Win32 可执行文件 (.exe)。当我在专门的查看器中打开这些文件时,我可以找到分散在各个地方的字符串(通常每个字符 16b),但其余的只是垃圾。我认为不可读的部分(大多数)是机器代码(或者可能是资源,例如图像等......)。
有没有直接读取机器码的方法?将 exe 作为文件流打开并逐字节读取它,如何将这些单独的字节转换为汇编语言?这些之间是否有直接的映射 指令字节 和装配说明?
.exe是怎么写的?每条指令四个字节?更多的?较少的?我注意到有些应用程序可以像这样创建可执行文件:例如,在 ACD See 中,您可以将一系列图像导出到幻灯片中。但这不一定是 SWF 幻灯片,ACD See 还能够生成可执行的演示文稿。这是怎么做到的?
我怎样才能理解 EXE 文件内部发生的事情?
解决方案
OllyDbg的是一个真棒工具,拆卸一个EXE成可读指令和允许你执行所述指令单接一个。它还告诉你什么API函数的程序使用,如果可能,它提供的参数(只要参数在栈上找到)。
一般而言,CPU指令是长度可变的,有些是一个字节,其它的是2,有三种,大约四等,这主要取决于数据的类型,所述指令的期望。某些指令一概而论,像“MOV”,它告诉CPU将数据从一个CPU寄存器在内存中移动到一个地方,或反之亦然。在现实中,有许多不同的“MOV”指令,那些用于处理8位,16位,32位的数据,那些用于移动从不同的寄存器数据等。
您可以拿起博士保罗·卡特的 PC汇编语言教程这是一个免费的入门级书谈到有关装配和如何在Intel 386 CPU运行。它的大部分是适用甚至现代消费者的Intel CPU。
在EXE格式是特定于Windows。入口点(即,第一可执行指令)通常在EXE文件内的相同地方找到。这都是一种很难一下子解释一切,但我所提供的资源将有助于治愈至少一些你的好奇心! :)
其他提示
您需要一个反汇编这将打开机器代码转换成汇编语言。这维基百科的链接描述的过程,并提供链接到免费的反汇编器。当然,你说你不懂汇编语言,这可能不是非常翔实 - 究竟是你想在这里做
你看到的可执行文件是微软的PE(可移植可执行)格式。它实质上是一个容器,它保存一些操作系统有关的程序,并且分成几个部分的节目数据本身的特定数据。例如代码,资源,静态数据被存储在单独的部分。
的部分的格式取决于它是什么。代码段根据所述可执行目标架构保持机器代码。在最常见的情况下,这是微软PE二进制文件英特尔x86或AMD-64(同EM64T)。机器代码的格式是CISC和起源回到8086和更早版本。 CISC的重要方面是,它的指令长度不是恒定的,你必须开始在正确的地方读书得到的东西出来的价值。英特尔发布在x86 / 64指令集良好手册。
可以使用一个反汇编直接查看机器代码。与说明书相结合可以猜测的源代码的大部分时间。
再有就是MSIL EXE:在.NET可执行持有微软的中间语言,这些不包含特定于机器的代码,但.NET CIL代码。该规范是可在ECMA在线。
这些可以用工具来查看诸如反射器。
EXE文件的内容在移植可执行的描述。它包含的代码,数据和指令,以OS上如何加载该文件。
有一个是1:机器代码和组件之间1映射。反汇编程序将执行反向操作。
没有在i386每指令字节的固定数。一些是单个字节,有些是更长的时间。
您可以使用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
要得到一个想法,设置一些有趣的代码中设置断点,然后去到CPU窗口。
如果您有兴趣了解更多,更容易使用-al参数编译短的片段与自由帕斯卡。
FPC允许输出在使用-A参数汇编格式(TASM,MASM,GAS)大量生成的汇编,并且可以具有在注释(和更多)以便于交叉参考交织的原始帕斯卡代码。
由于它被编译器生成的汇编程序,而不是从分解的.exe到汇编器,它更象征性和更容易理解。
我建议采取的Windows的C源代码的位和建立,并开始在Visual Studio调试它。切换到拆卸视图和步骤在命令。您可以看到的C代码被编译成机器代码 - 然后看着它运行一步一步
就有关这个问题,还有人读之类的东西 CD 21?
我想起桑德拉·布洛克在一个展会上,实际读取十六进制数的一屏,并找出该程序的功能。有点像读矩阵码当前版本。
如果你读的东西像CD 21,你是怎么记住不同的多种组合?
无论你的好奇心和你的理解水平也正是我在一个点上。 我高度 代码:计算机硬件和软件的隐藏语言。这不会回答你们在这里问的问题,但它会揭示一些计算机的完全黑魔法方面的光。这是一个厚的书,但高度的可读性。
ACD SEE是题干的事实.exe文件做没有错误校验,文件长度或任何超出该文件的预期部分的长度优势。正因为如此,你可以使一个.EXE文件,将打开其自身和加载一切超过一定点的数据。这是有用的,因为可以使然后通过只是套结上的适当写入.EXE
的端部的数据上给定数据集的工作的.EXE(我不知道究竟是什么ACD看到的是这样采取与盐大粒,但我的做的知道的一些的程序产生的方式。)
熟悉低电平组件(我的意思是低电平组件,而不是“宏”,而公牛)可能是必须的。如果你真的想直接读取原始机器代码本身,通常你会用一个十六进制编辑器。为了了解该指令执行,但是,大多数人会使用反汇编器将其转换成相应的汇编指令。如果你是谁想要了解机器语言本身的少数民族之一,我想你想的 64和IA-32架构软件开发人员手册。的第2卷强>特别涵盖的指令集,这涉及到您的有关如何读取机器代码本身以及如何装配涉及它的查询。
每个指令是保存在CPU内的特殊存储器区域的机器代码。早期INTEL书给机器代码的指令,因此应尽量获得这样的书籍,以便了解这一点。显然,今天的机器codeis不容易得到。什么是好的是可以逆转的十六进制机器代码的程序。或做手工_! 繁琐的