我正在学习装配,能够逆向工程的动力。我正在尝试找到我应该开始的汇编程序,以便我可以找到教程并开始编写一些程序集。
我开始知道MASM有很多内置结构,所以我将主要使用它们而不是编码它们,如果我选择NASM,我将不得不这样做。
我的问题是......这是真的吗?如果是,你建议从逆向工程师的角度学习装配的汇编程序以及一些好的教程。
另外,如果您有关于倒车的其他建议?替代方法或什么?
P.S:我在这里读了很多文章和问题,但我仍然感到困惑。答案 0 :(得分:9)
我的建议纯粹来自“逆向工程”的观点,就是要了解编译器如何将高级概念转换为汇编语言指令。理解如何在各种编译器中完成寄存器分配以及各种优化如何模糊嵌套循环的高级表示(et.al.)比能够编写一个特定的汇编输入方言更重要。
最好的办法是从您编写的源代码开始使用汇编语言中间文件(参见this question for more information)。然后,您可以更改源并查看它如何影响中间文件。另一个起点是使用交互式反汇编程序,如IDA Pro。
实际上编写汇编语言程序并学习NASM的语法,gas
的MASM as
是最简单的部分,你学习哪一个并不重要。它们非常相似,因为源语言的语法非常基本。如果你打算学习如何反汇编并理解程序正在做什么,那么我会完全忽略宏汇编程序,因为宏在转换过程中完全消失了,而在查看反汇编输出时你不会看到它们。
学习大会的诽谤
学习汇编语言与学习更高级别的编程语言不同。如果忽略宏汇编程序,则语法结构会更少。问题是每个编译器链的表示都略有不同,因此您必须专注于支持的地址模式,寄存器限制等概念。这些不是语言本身的一部分,因为它们由硬件决定。 / p>
我采取的方法(部分是因为大学强迫我),是探索和理解硬件本身(例如,寄存器的数量,寄存器的大小,支持的分支指令的类型等)以及更多的学术在开始编写汇编语言程序之前,诸如中断和使用按位操作进行整数匹配等概念。这是一个更长的路线,但会对组装以及如何编写高性能程序有深入的了解。
有趣的是,在我学习汇编和编译器构建(与内在相关)的时候,我实际上编写了很少的汇编程序。更常见的是,我需要在这里和那里编写内联汇编的小片段(例如,当运行时加载器没有时设置索引寄存器)。我花了大量时间从内存位置,加载程序映射文件和汇编程序输出列表中分析崩溃转储。我可以诚实地说,每个汇编程序的语法都是截然不同的,以及各种编译器将把意图混淆为快速或小代码的方法。
学习如何编写汇编程序是教育过程中最不值得的部分。有必要了解源如何被转换为计算机执行的位和字节,但实际上并不是我真正需要从原始二进制文件进行逆向工程(反汇编程序 - >汇编列表 - >最佳猜测高级别意图)或内存转储。我做了更多的后者,但工作的要求是一样的。
move
的参数顺序是什么if (a > 0)
到mov.b r0,d0 ... bnz $L
首先了解计算机体系结构(例如,从Andrew Tanenbaum读取内容),然后了解操作系统如何实际加载和运行程序(Levine的Linkers & Loaders),然后用C / C ++编译简单程序看一下汇编语言列表。