【问题标题】:NASM is pure assembly, but MASM is high level Assembly? [closed]NASM 是纯组装,但 MASM 是高级组装? [关闭]
【发布时间】:2012-04-14 05:00:24
【问题描述】:

我正在学习汇编,能够逆向工程。我正在尝试找到我应该开始使用的汇编程序,这样我就可以找到教程并开始编写一些汇编程序。

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

我的问题是..这是真的吗?如果是,您建议从逆向工程师的角度学习汇编的汇编程序以及一些很好的教程。

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

P.S:我在这里阅读了很多文章和问题,但仍然感到困惑。

【问题讨论】:

  • 倒车时主要看汇编。因此,您不会从高级构造中受益。
  • 有点题外话,但由于您对逆向工程感兴趣,请在此处提交逆向工程站点提案:area51.stackexchange.com/proposals/26607/reverse-engineering
  • 错误的工具。你想要一个反汇编器,而不是汇编器。好东西要花钱,花的时间越多,浪费的时间就越少。逆向工程机器代码是相当浪费时间的。几千字节大约是实际上限。
  • OllyDbg 是一个免费的调试器/反汇编器。要学习汇编,请使用您的教程推荐的任何工具。
  • @HeathHunnicutt- 谢谢你...但问题是 NASM 还是 MASM?

标签: assembly x86 reverse-engineering nasm masm


【解决方案1】:

纯粹从“逆向工程”的角度来看,我的建议是首先了解编译器如何将高级概念转换为汇编语言指令。了解各种编译器中寄存器分配的方式以及各种优化如何掩盖嵌套循环(等)的高级表示比能够编写一种特定的汇编输入方言更重要。

最好的办法是从您编写的源代码中的汇编语言中间文件开始(请参阅this question for more information)。然后您可以更改源并查看它如何影响中间文件。另一个起点是使用交互式反汇编器,例如IDA Pro

实际上编写汇编语言程序和学习 NASM、MASM、gasas 的语法是最简单的部分,学哪一个并不重要。它们非常相似,因为源语言的语法非常基本。如果您打算学习如何反汇编并了解程序在做什么,那么我会完全忽略宏汇编器,因为宏在翻译过程中会完全消失,并且在查看反汇编器输出时您不会看到它们。

关于学习大会的谩骂

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

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

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

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

  1. 您确实必须了解架构的限制条件。
  2. 您必须了解相关汇编程序的基本语法 - 如何指示地址模式、如何指示寄存器、move 的参数顺序是什么?
  3. 编译器从if (a > 0)mov.b r0,d0 ... bnz $L 所做的转换

首先学习计算机体系结构(例如,从Andrew Tanenbaum 中阅读一些内容),然后是操作系统如何实际加载和运行程序(Levine 的Linkers & Loaders),然后用 C/C++ 编译简单的程序并查看程序集语言列表。

【讨论】:

  • 但是为了理解反汇编...我不需要学习汇编吗?
  • @questions:我认为学习汇编的最好方法是查看反汇编代码并弄清楚它的作用。但这是我个人的看法。
  • 链接器和加载器这本书是否仍然足够新以具有相关性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
相关资源
最近更新 更多