如何反汇编原始 16 位 x86 机器代码?

2024-10-22 08:29:00
admin
原创
299
摘要:问题描述:我想反汇编我拥有的可启动 x86 磁盘的 MBR(前 512 个字节)。我已使用以下命令将 MBR 复制到一个文件中dd if=/dev/my-device of=mbr bs=512 count=1 有没有什么可以反汇编该文件的 Linux 实用程序的建议mbr?解决方案 1:您可以使用 objd...

问题描述:

我想反汇编我拥有的可启动 x86 磁盘的 MBR(前 512 个字节)。我已使用以下命令将 MBR 复制到一个文件中

dd if=/dev/my-device of=mbr bs=512 count=1

有没有什么可以反汇编该文件的 Linux 实用程序的建议mbr


解决方案 1:

您可以使用 objdump。根据这篇文章,语法是:

objdump -D -b binary -mi386 -Maddr16,data16 mbr

解决方案 2:

GNU 工具名为objdump,例如:

objdump -D -b binary -m i8086 <file>

解决方案 3:

我喜欢ndisasm这个用途。它附带 NASM 汇编程序,它是免费的开源程序,包含在大多数 Linux 发行版的软件包存储库中。

解决方案 4:

ndisasm -b16 -o7c00h -a -s7c3eh mbr

解释- 来自 ndisasm 手册页

  • -b= 指定 16 位、32 位或 64 位模式。默认为 16 位模式。

  • -o= 指定文件的名义加载地址。此选项使 ndisasm 获取其在左侧边缘列出的地址,以及右侧 PC 相关跳转和调用的目标地址。

  • -a= 启用自动(或智能)同步模式,在该模式下,ndisasm 将尝试通过检查相对跳转的目标地址并调用其反汇编来猜测应该在何处执行同步。

  • -s= 手动指定同步地址,这样 ndisasm 就不会输出任何包含该地址两侧字节的机器指令。因此,从该地址开始的指令将被正确反汇编。

  • mbr= 要反汇编的文件。

解决方案 5:

starblue和hlovdal都包含部分规范答案。如果要反汇编原始 i8086 代码,通常需要 Intel 语法,而不是 AT&T 语法,因此请使用:

objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin    # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin  # for 64-bit code

如果您的代码是 ELF (或 a.out (或 (E)COFF)),您可以使用缩写形式:

objdump -D -Mintel,i8086 a.out  # disassembles the entire file
objdump -d -Mintel,i8086 a.out  # disassembles only code sections

对于 32 位或 64 位代码,省略,8086;ELF 标头已包含此信息。

ndisasm正如jameslin所建议的,也是一个不错的选择,但objdump通常随操作系统一起提供,并且可以处理 GNU binutils 支持的所有体系结构(GCC 支持的体系结构的超集),并且它的输出通常可以输入到 GNU (当然,asndisasm 通常可以输入到)。nasm

Peter Cordes表示,“ Agner Fog 的 objconv非常棒。它为分支目标添加标签,使人们更容易理解代码的作用。它可以反汇编为 NASM、YASM、MASM 或 AT&T (GNU) 语法。”

多媒体 Mike已经发现了--adjust-vmandisasm等效于-o选项。

例如,为了反汇编sh4代码(我使用了 Debian 的一个二进制文件进行测试),请将其与 GNU binutils 一起使用(几乎所有其他反汇编程序都仅限于一个平台,例如带有ndisasm和的x86 objconv):

objdump -D -b binary -m sh -EL x

-m机器,-EL意味着小端(代替sh4eb使用-EB),这与存在于任一字节序的体系结构相关。

解决方案 6:

尝试这个命令:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -

解决方案 7:

如果您只是想使用反汇编程序,那么 objdump 是一个选择。nasm 汇编程序附带的反汇编程序是 ndisasm。您也可以在 Linux 上的 DOS Box 中运行“debug.exe”,前提是您获得了该程序的副本。它还可以进行反汇编以及受控执行;即模拟 CPU 本身 - 这也很重要,即使在进行反汇编时也是如此,原因我将在下面描述。

Fake86 有一个 CPU 模拟器。您可以通过以下方式破解它,使其执行反汇编:(a) 让它显示指令而不是模拟指令;(b) 让它不进行条件跳转或调用,而是将地址堆叠为执行反汇编的新入口点(即,实际上同时进行分支和封装子例程);(c) 让它在无条件跳转或返回时停止当前反汇编;(d) 让它接受一个、两个或更多入口点,最好 (e) 让它也接受数据段的基址;(f) 让它对所有未处理为数据或代码段的区域进行十六进制转储(因为这些区域通常是间接跳转或调用或间接访问的数据段进入的地方)。

这涉及到您的查询的另一种含义:“我想制作一个反汇编程序”。ndisasm 的源代码是可用的,它可以处理 8086 的许多后代,而不仅仅是 8086 本身(如果您想要的只是 8086 甚至 80386 反汇编程序,这会严重混乱),但它不是独立的,并且严重依赖于发行版的其余部分。

它的主要论点是它使用八进制数字作为操作码 - 这更适合 80x86 - 正如我在 1995 年的 USENET 上的 comp.lang.asm 中指出的那样... 并且(事实上)nasm 的创建是对此的直接回应。因此,它可能更加透明,如果您正在制作自己的反汇编程序,您可能希望将源代码放在手边以备检查和比较。

您也可以自行运行 debug.exe 程序。

您还可以尝试在 debug.exe 上运行 ndisasm;在删除 0x200 字节的 .EXE 文件头后,使其成为原始二进制文件,然后从中提取入口点地址 CS:IP 和堆栈指针地址 SS:SP(80x86 堆栈向下增长,因此堆栈段名义上是 SS:0 到 SS:(SP-1))。debug.exe 的 EXE 没有重定位,因此您可以将代码视为原始二进制文件。

但是你不会得到任何清晰可辨的东西,因为该程序是自我修改的 - 更准确地说:自我提取。你将得到一个(勉强)压缩的代码映像(压缩率约为 5/6),后面跟着一个加载程序例程。

您必须对其进行模拟,例如通过在 debug.exe 上运行 debug.exe 来模拟其解包例程,使其自行提取,然后转储解包后的程序映像并对其进行反汇编。加载程序例程末尾有一个“重定位表”,因此它确实包含重定位 - 只是它们是在程序自行解包时应用的,而不是在加载 EXE 文件时由操作系统应用的。

然后,您就反汇编了一个反汇编程序,它恰好也能进行 CPU 模拟,就像 Fake86 一样 - 但只适用于 8086。您必须将绝对地址设为相对地址(使用原始重定位表作为指导),才能使其可重新组装。完成此操作后,您就可以处理源代码了。操作码表清晰可见(如果您将其显示为文本)- 无论是在打包版本还是解包版本的 debug.exe 中都可以看到。

GitHub 上还有 DosDebug。它可以处理“80586”(或 Pentium)和“80686”以下的所有内容:它会将某些指令标记为“6”代;例如,它可以处理条件“cmov”操作以及它们的“fcmov”浮点版本。DosDebug 是 8086 汇编语言,最适合用 jwasm 进行编译。您可能可以在其上运行 nasm,我不知道。我从未尝试过。

我可能会将 DAS 反汇编程序移植到 x86,因为项目 (a)-(f) 已经融入 DAS 的设计中。到目前为止,我只将它移植到 8051、6800、6809 和 8080/8085(和 Z80);但从 8085 到 8086 的转变相对较小。为此,我可能会从 Fake86 中破解一些东西。现在,这主要是废弃软件,因为作者用 XTulator 替换了它,因为 Fake86 是在程序员对 C 语言还比较陌生时编写的。您还可以直接从 DosDebug 的操作码表(它们的“instr.*”文件)中破解一些东西。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用