刚学完x86汇编语言.我该怎么办?

cla*_*aws 25 assembly

我刚学完汇编语言.但我无法理解我能实施什么(对于练习/像小项目).如果它对任何人有用的话会很棒.

mmc*_*ole 55

我最喜欢的爱好之一是逆向工程.

它需要扎实的汇编知识和使用反汇编程序/调试程序来完成编译代码.这允许您更改,理解和反转已编译的程序.每个新程序就像一个等待解决的难题!

例如,很多人在第一次出发时会像Minesweeper这样的游戏进行逆转.

以下是Minesweeper中代码的关键部分的屏幕截图,我反过来了一段时间(右侧评论): 替代文字

通过在rand()函数调用上放置断点并在callstack中向后退步来定位.经过一番挖掘后,很明显:

  1. Minefield Height位于0x1005338
  2. Minefield Width位于0x1005334
  3. Minefield Baseaddress位于0x1005340

有了这些知识,通过以下方式可以很容易地确定雷区中任何给定矿井的位置:

cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1);
Run Code Online (Sandbox Code Playgroud)

然后,通过一个简单的循环和一些调用ReadProcessMemory()你有最终的扫雷黑客!

阅读手写组件比阅读机器生成的组件容易得多.现代编译器为代码做了一些神奇而疯狂的事情,有时很难遵循.所以,这肯定会推动你的装配知识!

有很多活动可以从中分支出来:

  1. 反转库中的隐藏API
  2. 使用DLL注入,代码洞穴,功能挂钩等编写高级游戏黑客!
  3. 了解软件使用的各种保护方案的局限性
  4. 反转未发布或已知的文件格式,并编写代码以读取此格式以实现互操作性目的.
  5. 为各种系统(包括旧游戏系统)编写仿真器!
  6. 了解知名程序如何完成特定任务.
  7. 反转恶意软件和病毒以查看它们的工作方式和内容.

和更多!

如果你有兴趣,我强烈推荐这本书:逆转:逆向工程的秘密


Bas*_*ard 15

您可以了解操作系统如何在低级别工作(中断,虚拟内存等).首先编写一个可以完全访问硬件的引导加载程序,然后就可以开始使用保护模式,VGA编程等等.

两个很好的资源:
http://wiki.osdev.org/Main_Page
http://www.osdever.net/FreeVGA/home.htm

[编辑]

如果您想了解优化,请访问Agner Fog的网站:http://agner.org/optimize/ .

[编辑]

复制自Simucal的评论:

您可能还想添加一个指向MikeOS的链接.它是一个用Assembly编写的小型操作系统,它被设计为一种学习工具,用于查看操作系统的简单工作方式.它有很好的评论代码和文档:http://mikeos.berlios.de


chu*_*tar 5

根据您对汇编的学习程度,您可以尝试为小型微处理器甚至连接到计算机的小型设备编写固件。您还可以尝试用汇编语言编写完整的软件应用程序,并为它们提供一个漂亮的 GUI。

一般来说,根据我的经验,汇编在编写大型软件项目时并不那么有用,因为对于很多应用程序来说,速度并不重要(至少在多核处理器的时代不是),所以你可以做什么是有一定限制的。

  • 另外,如果您不太擅长优化代码,那么编译器无论如何都会生成更快的代码。 (2认同)

Jon*_*FTW 5

这可能看起来很陈词滥调,但您可以尝试使用汇编在projectueler处回答一些问题.


Aar*_*lla 5

今天,汇编程序用于以下领域:

  • 内核/ OS开发.询问Linux人员或查看其他操作系统项目.
  • 编译器开发(有人必须将更高级别的语言翻译成CPU)
  • 司机发展
  • 嵌入式设备(但是这里也越来越多地转向更高级语言......我的机顶盒运行Python)
  • 特殊效果的游戏开发(但这主要是针对显卡的特定汇编语言)


kin*_*ris 5

优化.如果您在Windows上编程,请了解如何使用英特尔的VTune.在这里,您可以看到瓶颈所在.然后在汇编程序中重写这些例程.

由于大多数现代软件一直在变化,这更像是一种智力锻炼和自我满足感,使得在现实世界中获得更快的运行速度.

有一两个人在为运行时CPU定制的汇编程序中重写了许多核心C原型,memcpy,memset等.所以代码更大,因为它有额外的例程来利用CPU扩展,SSE等但速度更快.这些C原型通常最终出现在许多软件包中.因为大多数程序一直在做内存.