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

时间:2009-11-27 17:02:45

标签: assembly

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

12 个答案:

答案 0 :(得分:55)

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

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

例如,很多人在首次开始时会像Minesweeper这样的游戏进行逆转。

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

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

  1. Minefield Height位于0x1005338
  2. Minefield Width位于0x1005334
  3. Minefield Baseaddress位于0x1005340
  4. 有了这些知识,就可以很容易地确定雷区内任何一个矿井的位置:

    cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1);
    

    然后,通过一个简单的循环和对ReadProcessMemory()的一些调用,你得到了终极的扫雷黑客!

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

    有很多活动可以从中脱颖而出:

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

      如果您有兴趣,我强烈推荐这本书:Reversing: Secrets of Reverse Engineering

答案 1 :(得分: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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:3)

您可以查看liboil项目:

http://liboil.freedesktop.org/wiki/

它是一个高度优化的内环的库。

大多数循环已经有了x86汇编程序实现,但仍有一些循环需要重写。

答案 7 :(得分:2)

您可以查找可以与并行端口连接的机器人或控制器,并编写一些很酷的键处理程序来控制它们。您还可以截取BIOS调用,如Int13 for Disk,并编写一些磁盘镜像工具,RAID驱动程序等。您可以连接一些传感器,如温度/振动/压力等,并进行一些数据采集。

答案 8 :(得分:1)

我想你可以试试code-golf

至少还有一个O.S.在汇编中为PC编写:MenuetOS。 (我不知道为什么。)他们可能想要贡献。

据我所知,在20世纪70年代早期发明C之前,大多数操作系统实际上是用直接组装编写的。我不建议这样做,但你可以写一个独立的程序,只是为了好玩。请注意,CPU将以16位模式启动,并且很难将其切换到32位。最好只用16位x86编写独立程序。您可以使用模拟器进行开发。

答案 9 :(得分:0)

至少你现在可以从gcc输出汇编程序:

gcc -c -S test.c -o test.asm

然后,您可以检查生成的C代码的输出以用于教育目的。

答案 10 :(得分:0)

如果您已经是高级编程语言的开发人员,汇编语言允许您创建优化的例程/函数。我不了解其他的,但Delphi,例如,允许您将汇编代码完美地集成到任何单元中,并处理函数参数等。

答案 11 :(得分:0)

  

如果它对任何人都有用,那就太棒了。

您已经熟悉了计算机的低级操作。能够读取程序集可以帮助您了解编译器的行为方式。

其他人可能会批评一些,因为它反映了一种两极化的观点。在一个糟糕的嵌入式项目之后的一天,我的导师告诉我:“如果有人为你工作,请在集会中写作,解雇他以保住自己的工作。”我同意他的看法。从程序化的角度来看,在汇编中编写太麻烦了。