我可以将汇编语言命令和数据添加到现有的二进制文件中吗?

Can I add assembly language commands and data into an existing binary?

这个问题主要是关于我使用 Hopper - The OS X and Linux Disassembler although conceptually I think it would also apply to other Disassemblers like IDA 的经验。这些工具允许人们查看二进制文件中(十六进制)代码的汇编代码表示:

它还提供了一种修改汇编指令的方法,例如将 je 命令替换为 jne 命令。他们也有一个 hex view,所以很容易看出实际发生了什么变化 - 但据我所知,这些基本上只是十六进制编辑的一个很好的前端 - 这意味着我告诉它改变 JEJNE 并且 74 变成 75.

但是,Hopper 有一个选项显示 "Produce New Executable":

汇编编辑器对话框显示 "Assemble and Go Next":

我认为这个问题的答案是 "No" - 但据我所知 - 没有办法将 添加 代码到汇编/编译的二进制文件文件,对吗?保存到已编译程序中的其余命令引用了其他部分的文件偏移量 - 因此无法将 add 其他命令添加到过程中,因为它们会弄乱偏移量之后出现的命令 - 导致早于 jmp 的代码出现在错误的位置,以及诸如正确之类的各种坏事 - 对吗?编辑现有命令、NOOPs、更改字符串以及任何不更改程序 "footprint" 的内容都可以 - 但不能 添加 代码 - 正确吗?似乎可以添加代码的唯一方法是在文件的最后,但即便如此我还是有点怀疑它是否会起作用。

我是否正确理解反汇编器的功能,因为:它们可以显示代码,甚至(有时)给出用于创建它们的函数的表示,但它们本身并不是真正的编译器?或者,它们是否足够好以实际跟上所有偏移量/引用并实际重写它们并真正生成一个新的可执行文件,并在中间注入额外的代码和字符串?

ps:如果我问的听起来是恶意的(我不认为是恶意的),我提前道歉,我的目标不是盗版软件,只是想了解程序是如何编写、编译的, 并进行了解释。我希望最终能够直接为 ATMega chips 编写汇编程序,作为汇编的初学者,浏览现有程序比在线阅读教程有趣得多(尽管我都在做) .

像IDA这样的disassembler可以生成可执行文件的源文件。然而,根据我的经验,这并不是真正的开箱即用,所以你不能简单地 disassemble 一个文件然后重新生成可执行文件,而不需要做大量的手动工作。对于复杂的程序,也不能保证有完整的 dissassemble,因为 disassembler 可能无法正确识别所有代码和数据部分。 所以在你可以 assemble 输出之前,你必须做很多逆向工程才能让它工作。当然,一旦你成功了,你可以根据需要添加代码。

IDA很高级,我觉得Hopper也做不到。

根据您需要的更改类型,使用单独的应用程序将代码注入内存或用您自己的版本替换库可能更容易。