有人告诉我,在十六进制编辑器中查看程序的二进制文件或类似文件会暴露程序的全部数据/指令。例如,就像游戏黑客/老式复古游戏(如 Sonic The Hedgehog)的模组制作者一样,二进制可执行文件大约有半兆字节。
这意味着该文件只有超过 520,000 个字节,并且按照编译器/汇编器用于获取 Sega Genesis(摩托罗拉 68000 二进制操作码)的编码,您可以在十六进制文件中逐字节编辑游戏中使用的数据/指令编码的值(例如校验和、魔术数字数据、JUMP/MOVE 指令和偏移量、数据条目(如生命)等)?
这是 100% 正确的吗,还是存在一些错误?
答案1
你的硬盘只是一个可以容纳字节。在硬件层面上,没有文件甚至分区的概念,只有字节[1]。
现在我们引入一个概念分区(查看介绍 这里如果你想知道为什么)。分区表也是一堆字节。除非你知道如何解释它们,否则它们是没有意义的。所有现代操作系统都使用与 MS-DOS 兼容的分区表[2],因此它们可以识别彼此的分区。不过,你可以假装没有分区,只有字节。这就是硬盘所拥有的。
每个分区必须格式化为一些文件系统描述文件如何保存。现代版本的 Windows 使用 NTFS 文件系统,旧版本基于 FAT 系列(FAT12、FAT16、FAT32),而消费级 Linux 设置通常使用 ext 系列(ext2、ext3、ext4)。文件系统决定文件在分区上的布局方式以及“目录”的位置(以及如何解释它)。同样,除非您知道如何解释它们,否则它们都只是字节。
文件可以有额外的元数据(名称、路径、创建日期、上次访问日期等)。文件系统说明了元数据应该如何存储以及如何找到文件边界,但没有说明如何解释文件内容。你必须找出什么是文件格式(提示:查看文件扩展名或神奇数字!)。除非您了解其格式,否则它只是一堆字节。
我的观点是,文件存储背后没有更深层次的魔法。这里涉及许多抽象层次,但如果计算机可以访问其中任何一个层次的驱动器,那么它也可以让您查看或编辑该抽象层次上的数据!
像 Paint 或 Word 这样的程序在最高抽象级别上运行,它们根据以下方式解释文件数据:格式。但十六进制编辑器根本不解释数据,它们停在文件级别并以十六进制格式向您呈现原始字节(这是您在此级别可以获得的最用户友好的格式)。解释任何文件 = 解释其字节。这就是执行可执行文件、读取文本文件或显示图片的方式。当 CPU 执行应用程序时,它看到的数据与十六进制编辑器向您呈现的数据完全相同。当您打开 JPEG 时,图片查看器正在读取十六进制编辑器显示的相同数据!
听起来你对逆向工程很感兴趣。有一些工具(调试器、反编译器、反汇编器)可以让这个过程不那么痛苦。使用字节码很难,尤其是当你处理使用可变长度指令的 CPU 时(我正在看你,英特尔!)
[1]不是这样的,但为了简单起见,我们假设是这样。如果你对细节感兴趣,那么旧的驱动器已经使用了中枢性高血压该计划后来被左心室射血分数。
[2] ...或现代通用技术适合UEFI,但同样,这并不重要,我们就跳过它们吧。哦,MS-DOS 表通常被称为MBR 分区表。