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

时间:2015-01-25 03:58:41

标签: assembly hex disassembly ida

这个问题主要是关于我对Hopper - The OS X and Linux Disassembler的体验,虽然从概念上来说我认为它也适用于像IDA这样的其他反汇编程序。这些工具允许人们查看二进制文件中(十六进制)代码的汇编代码表示:

assembly code representation

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

然而,Hopper有一个选项,说"生成新的可执行文件":

enter image description here

组装编辑器对话框显示"组装和下一步":

enter image description here

我认为这个问题的答案是"否" - 但我理解 - 没有办法添加代码到汇编/编译的二进制文件,对吧?保存到已编译程序中的其余命令将文件偏移引用到其他部分 - 因此无法将添加其他命令添加到过程中,因为它们会破坏来自命令的偏移量之后 - 导致jmp之前的代码到错误的地方和各种坏事如右 - 对吗?编辑现有命令,NOOP,更改字符串,任何内容,而无需更改"足迹"该程序是好的 - 但不是添加代码 - 对吗?看起来可能添加代码的唯一方法是在文件的最后,但即便如此,我仍然有点怀疑它会起作用。

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

ps:如果我提出的问题听起来很恶意(我不认为这样做),我会事先道歉。我的目标不是盗版软件,而只是了解程序的编写,编译和解释。我希望最终能够直接在汇编中为ATMega芯片编写程序,而作为初学者,通过现有程序查看组件比在线阅读教程要有趣得多(尽管我同时做这两件事)。

1 个答案:

答案 0 :(得分:1)

像IDA这样的反汇编程序可以生成可执行文件的源文件。但是,根据我的经验,这并不是真的开箱即用,所以你不能简单地反汇编文件然后重现可执行文件,而不需要做大量的手工操作。对于复杂程序,也不能保证完全反汇编,因为反汇编程序可能无法正确识别所有代码和数据部分。 因此,在组装输出之前,您必须进行大量逆向工程才能使其正常工作。当然,一旦你使它工作,你可以根据需要添加代码。

由于IDA非常先进,我不认为Hopper可以做到这一点。

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