NASM是纯粹的装配,但MASM是高级装配?

que*_*ons 10 x86 assembly reverse-engineering masm nasm

我正在学习装配,能够进行逆向工程的动力.我正在尝试找到我应该开始的汇编程序,以便我可以找到教程并开始编写一些程序集.

我开始知道MASM有很多内置结构,因此我将主要使用它们而不是编码它们,如果我选择NASM,我将不得不这样做.

我的问题是......是真的吗?如果是的话,你建议从逆向工程师的角度学习装配的汇编程序和一些好的教程.

另外,如果您有关于倒车的其他建议?替代方法还是什么?

PS:我在这里看过很多文章和问题,但我仍然感到困惑.

D.S*_*ley 9

我的建议纯粹来自"逆向工程"的观点,就是要了解编译器如何将高级概念转换为汇编语言指令.理解如何在各种编译器中完成寄存器分配以及各种优化如何模糊嵌套循环的高级表示(et.al.)比能够编写一种特定的汇编输入方言更重要.

您最好的选择是从您编写的源代码开始使用汇编语言中间文件(有关详细信息,请参阅此问题).然后,您可以更改源并查看它如何影响中间文件.另一个起点是使用像IDA Pro这样的交互式反汇编程序.

其实写汇编语言程序和学习NASM,MASM语法,gas中,as是最简单的一部分,它并不真正的问题,你知道哪一个.它们非常相似,因为源语言的语法非常基本.如果你打算学习如何反汇编并理解程序正在做什么,那么我会完全忽略宏汇编程序,因为宏在转换过程中完全消失,而在查看反汇编输出时你不会看到它们.

学习集会的诽谤

学习汇编语言与学习更高级别的编程语言不同.如果忽略宏汇编程序,则语法结构会更少.问题是每个编译器链的表示都略有不同,因此您必须专注于支持的地址模式,寄存器限制等概念.这些不是语言本身的一部分,因为它们由硬件决定.

我采取的方法(部分是因为大学强迫我),是探索和理解硬件本身(例如,寄存器的数量,寄存器的大小,支持的分支指令的类型等)以及稍微更多的学术概念,例如在开始编写汇编语言程序之前,中断并使用按位操作进行整数匹配.这是一个更长的路线,但会导致对汇编以及如何编写高性能程序的丰富理解.

有趣的是,在我学习汇编和编译器构建(这本质上是相关的)时,我实际上编写了很少的汇编程序.更常见的是,我需要在这里和那里编写内联汇编的小片段(例如,当运行时加载器没有时设置索引寄存器).我花了大量时间从内存位置,加载程序映射文件和汇编程序输出列表中分析崩溃转储.我可以诚实地说,每个汇编程序的语法都是截然不同的,以及各种编译器将把意图混淆为快速或小代码的方法.

学习如何编写汇编程序是教育过程中最不值得的部分.有必要了解源如何被转换为计算机执行的位和字节,但实际上并不是我真正需要从原始二进制文件进行逆向工程(反汇编程序 - >汇编列表 - >最佳猜测高级意图)或内存转储.我做了更多的后者,但工作的要求是一样的.

  1. 您真的必须了解架构的约束条件.
  2. 您必须知道有问题的汇编程序的基本语法 - 如何指示地址模式,如何指示寄存器,参数的顺序是什么? move
  3. 什么转换的编译器从去if (a > 0)mov.b r0,d0 ... bnz $L

首先了解计算机体系结构(例如,从Andrew Tanenbaum读取内容),然后是OS如何实际加载和运行程序(Levine的链接器和加载器),然后使用C/C++编译简单程序并查看汇编语言列表.

  • 但是为了解拆卸...我不需要学习装配吗? (3认同)
  • @questions:我认为学习汇编的最好方法是查看反汇编代码并弄清楚它的作用.但那是我个人的看法. (2认同)