Dio*_*ogo 11 windows assembly binary-files
据我所知,每个程序都由一组处理器指令组成,其中包含一些特定的数据变量(float、int、char...),用于处理处理器寄存器。
因此,我(很久以前)想到的第一件事是,如果您知道%¨#$¨#(只是一个随机示例)的 ASCII 值可以解释为x86的堆栈指针寄存器(只是示例)的地址处理器。如果这是真的,每次在读取二进制文件的内容时发现这个“不可读”的值,您就可以解释堆栈指针寄存器正在用于管理某些数据变量。
不幸的是,这不会发生。下面是一个ping.exe从 Windows 中打开的程序内容示例notepad.exe:

它是一个二进制文件,其数据对于我们人类来说是不可理解的(对于机器来说是可以理解的。)即使他们知道汇编代码(机器语言的最低级别),对任何人来说也没有任何意义。
所以,如果我正确理解了一切,有人可以解释一下吗
Law*_*ceC 13
首先,寄存器没有地址。任何汇编语言中的每条指令都会转换为一个操作码。x86 中的操作码可以是一个、两个、三个甚至更多字节(在某些其他处理器中它们是“固定宽度”)。通常操作码标识所涉及的指令、寻址模式和寄存器。“寻址模式”确定 CPU 需要的操作码是否超过操作码,即“立即”寻址模式意味着在该指令的指令之后(或“立即”之后)有额外的数据 - “绝对”寻址模式意味着内存地址跟在指令后面并被该指令使用。
您可以找出类似MOV AL,SP或类似的操作码,然后进行搜索。x86 有很多操作栈指针的指令。
但是,请停止使用记事本并改用十六进制编辑器。我会推荐 HxD,尽管还有很多其他的。
@David Schwartz 是正确的。反汇编器将遍历文件,并将操作码转换回可读文本。你想做的事完全有可能。
但是,您需要知道指令在文件中的何处开始,因为如果您从错误的地址开始,一些应该是操作码的“操作数”的数据(例如为操作数或“参数”获取地址的指令)可能被误解为操作码。知道这一点需要了解可执行文件的格式,对于 Windows,这是“便携式可执行文件”或 PE 格式(对于 Linux 系统通常是 ELF)。我敢肯定有了解 PE 等的反汇编程序,但我不知道任何临时的。
saw*_*ust 12
所以,如果我正确理解了一切
不完全的。
它是一个二进制文件,它的数据对我们人类来说是不可理解的
通常,二进制文件是人和机器无法理解的,尤其是当文件的用途未知时。请注意,并非所有二进制文件都是可执行文件。许多二进制文件是不包含任何机器指令的数据文件。这就是命名文件时使用文件扩展名的原因(在某些操作系统中)。这 。CP/M 使用com扩展名来表示可执行文件。这 。exe扩展名是由 MS-DOS 添加的,以表示另一种可执行文件格式。*nixes 使用 execute 属性来表示可以执行哪些文件,尽管它可以是脚本也可以是代码。
正如其他人已经提到的,包含数字的二进制文件应该由十六进制转储程序或十六进制编辑器查看,而不是由文本查看器查看。
有一个ping.exe程序内容的例子
该文件实际上是一个可重定位程序,并非该文件中的所有数据都代表机器代码。有关于程序的信息,例如它需要哪些动态库、必须链接哪些例程、对堆栈和程序和数据存储器的要求以及程序的入口点。文件中的地址操作数可以是需要计算为绝对值的相对值,也可以是需要解析的引用。
您可能想到的“程序文件”称为二进制映像文件或程序内存转储。这样的文件将只包含机器代码和数据,所有地址引用都正确设置为执行。
即使他们知道汇编代码(机器语言的最低级别。)
汇编语言与机器语言不同。典型的(不包括高级语言计算机)CPU 接受机器代码作为输入,一次一条指令。操作数是寄存器或数字内存地址。汇编语言是一种高级语言,可以为指令位置和变量使用符号标签,以及用助记符替换数字操作码。汇编语言程序在实际执行之前必须转换为机器语言/代码(通常由称为汇编程序、链接程序和加载程序的实用程序)。
可以对程序文件执行反向操作,反汇编,但会成功并丢失一些符号信息。内存转储或程序映像文件的反汇编更多的是反复试验,因为需要手动识别代码和数据位置。
顺便说一句,有些人可以阅读和编码(数字)机器代码。当然,这在 8 位 CPU 或微控制器上比在具有十几种内存地址模式的 32 位 CISC 处理器上容易得多。
| 归档时间: |
|
| 查看次数: |
6604 次 |
| 最近记录: |