系统级开发利器——MASM32

编程爱好者

著名黑客Coolboy:很难想象,一个没有深厚的汇编语言功力的黑客会具有强大攻击力。尽管因特网使黑客的手段和兴趣日趋多元化,但在貌似密不透风的系统代码中用汇编工具找出漏洞仍然是黑客的乐趣所在。另外,要想更好地控制硬件,非汇编莫属。

在本系列的前几期,寇豆依次为大家介绍了C#、Python、JSP、ASP.Net等主流的开发工具,受到了很多大学生朋友的欢迎。他们来信都表示本系列文章拓宽了他们的视野,为他们的编程学习指明了方向。但前面我们介绍的工具采用的都是高级语言,因此,在执行效率和对系统的控制能力方面会有所欠缺。在本系列的最后一期,寇豆将为大家介绍新一代汇编语言MASM32,专门针对有志于系统级开发和工控开发的朋友!

MASM32简介

每个从DOS时代走过来的程序员,对汇编语言都不会陌生。程序员利用汇编工具几乎可以到达系统的任何角落,即便是最核心的部分。然而Windows时代的到来,终结了程序员的汇编梦。由于Windows工作在保护模式下,几乎所有系统资源都由Windows调度和掌控,级别较低的应用程序不仅不能直接访问操作系统核心,而且对硬件底层也不能轻易染指,非要动它,得借助VxD才行,因此使一向长于系统级编程的汇编语言没了用武之地。加之Windows的编程比DOS复杂得多,而作为一种低级语言,汇编语言在编程效率上远逊于高级语言,也是它失势的重要原因。尽管微软、Borland提供了MASM、TASM汇编工具,理论上也能用它们开发Windows程序,但由于没有准备相应的资源库,因此直接用MASM或TASM开发Windows程序将非常困难甚至无法进行。

针对MASM等开发Windows程序的困难之处,Steve Hutchesson等开源人士做了大量工作,为MASM建立了一个很全的Import库,几乎将Windows的API函数一网打尽,并随Windows版本的升级而升级。Import库、Include文件、辅助工具、集成环境和MASM组合在一起,就形成了MASM32汇编开发平台。有了MASM32,便彻底扫除了横亘在Windows和汇编语言间的主要障碍。

如何学习

1.了解MASM32的特色

汇编语言难学难用的名声早已有之,常被视为编程高手才能用到的独门兵器。MASM32已具备了许多高级语言的特性,并把大量原来必须要开发者了解的知识或者编程细节进行了很好的封装,还提供了功能强大的集成开发环境,再不是初学者的畏途。在调用Win32 API方面,MASM32甚至比VB更简单。而MASM32已具备了结构化设计的雏型,并有可能在不久的将来将面向对象技术融入其中,这些都能够极大地减轻初学者的学习难度,使他们可以像学习高级语言一样学习汇编语言。

2.合理选择开发领域

与高级语言相比,MASM32生成的程序具有最快的运行速度,以及最小巧的身材,因此,在系统底层开发、实时控制、数据采集、高强度计算、逆向工程、密码破译、网络攻击、黑客工具制作等方面,它具有很大优势,尤其是在电脑安全领域,它是对抗双方都必须掌握的利器。尽管如此,我们还是应该看到,在诸多方面特别是新兴的Web开发领域,MASM32尚无法与主流的开发工具相抗衡。

3.选择适合自己的工具

MASM32的最新版本为V8.2,可在它的主站http://www.masm32.com下载。MASM32内置的集成开发环境MASM32 Editor虽赶不上Visual Studio或Borland Studio的豪华,但功能非常强大,编辑器、编译器、优化工具、调试器、资源编辑器、逆向工具、库管理工具、模板工具、函数查询工具等,该有的一个不少。同时它还提供了丰富的示例程序,涵盖了常见的Windows程序类型。另一个有名的MASM32集成开发环境是RedASM,可在http://radasm.visualassembler.com下载,它提供了更多的程序模板和编程资源,并支持多种编译器。

程序示例

下面以一个Windows关机示例,简单介绍MASM32汇编程序的结构。

.386 ;用80386指令编译

.model flat, stdcall ;定义内存寻址模式和参数传输方式,这是Win32程序的缺省设置

option casemap:none ;不区分大小写

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

include \masm32\include\advapi32.inc

includelib \masm32\lib\advapi32.lib

.data ;数据段,定义已初始化变量

szMessage db "现在关闭计算机吗?",0

szTitle db "Shutdown",0

szShut db "SeShutdownPrivilege",0

.data? ;数据段,定义未初始化变量

ovi OSVERSIONINFO <>

tkp TOKEN_PRIVILEGES <>

hToken dd ?

.code ;代码段

start:

invoke MessageBox,NULL,ADDR szMe

ssage,ADDR szTitle,MB_ICONINFORMATI

ON+MB_YESNO;调用API的MessageBox函数

.IF eax==IDYES

mov ovi.dwOSVersionInfoSize, sizeof ovi

invoke GetVersionEx,ADDR ovi ;调用GetVersionEx函数获取操作系统版本

.if ovi.dwPlatformId == VER_PLATFO

RM_WIN32_NT ;如果是NT核心的操作系统,做如下处理

invoke GetCurrentProcess

invoke OpenProcessToken,eax,TOKEN

_ADJUST_PRIVILEGES+TOKEN_QUERY,ADDR hToken

invoke LookupPrivilegeValue,NULL,A

DDR szShut,addr tkp.Privileges[0].Luid

mov tkp.PrivilegeCount,1

mov tkp.Privileges[0].Attributes,SE_PR

IVILEGE_ENABLED

invoke AdjustTokenPrivileges,hToken,F

ALSE, ADDR tkp, 0, NULL, 0

invoke ExitWindowsEx,EWX_POWER

OFF,NULL ;调用ExitWindowsEx函数关机

.else

invoke ExitWindowsEx,EWX_SHUTDO

WN,NULL

.endif

.if ovi.dwPlatformId == VER_PLATFO

RM_WIN32_NT

mov tkp.Privileges[0].Attributes,0

invoke AdjustTokenPrivileges,hToken,FALSE,ADDR tkp,0,NULL,0

invoke CloseHandle,hToken

.endif

.ENDIF

invoke ExitProcess,NULL

ret

end start

可以看出,MASM32汇编程序的结构并不复杂,它主要由说明部分、数据段、堆栈段、代码段四部分组成。

说明部分包括一些指示编译器如何编译的伪指令,以及引入头文件和库文件。“.386”伪指令告诉编译器使用80386的指令集,并使用32位的寄存器。“.model flat, stdcall”伪指令则定义了程序的内存寻址模式为flat,而参数的传输方式为stdcall,即参数从从右到左压入堆栈。对Windows的汇编程序来说,这两条伪指令必不可少,而且也基本固定。“include”和“includelib”用来引入头文件和库文件的,而MASM32对MASM的扩展主要就包含在windows.inc、kernel32.inc、user32.inc等头文件和 user32.lib、kernel32.lib等库文件中。

从“.data”和“.data?”开始的是数据段。.data中定义已初始化的变量,.data?定义未初始化的变量。

.code后面就是代码段,所有程序代码都在这个段中。

微软为MASM增加了许多伪指令,如.IF、.WHILE等,大大降低了汇编程序的复杂程度,使汇编语言的编程方式逐渐向高级语言靠拢。尤其是增加了invoke伪指令,解决了调用Win32 API函数的麻烦。如果不用invoke,那么参数必须用push指令逐个压栈,而Win32 API函数的参数一般较多,因此容易出错。若用invoke,则只须按“invoke 函数名[,参数1][,参数2]……”格式填入即可。示例就是利用invoke调用系统的ExitWindowsEx函数实现关机的。

启动MASM32 Editor,将示例代码输入,然后选择“Project→Builde All”菜单对代码进行编译和连接,然后选择“Project→Run Program”菜单运行示例,结果如图所示。

30-g15-1-1.jpg

学习资源推荐

MASM32的学习资料较少,大多零散地分布在MASM32帮助文件和网站资料中。比较容易找到的参考书是下面这一本。

《Windows环境下32位汇编语言程序设计》:电子工业出版社出版,定价78元。该书作者是一名资深的汇编程序员,在Windows汇编程序开发上积累了丰富的经验,因此这本书的内容基本上都从实践中来,非常实用,许多例子甚至可以直接用在实际的开发中。另外,它的编排体例也很适合初学者。

网上MASM32资源很多,但成系统的比较少,下面几个站点值得看看:

http://www.movsd.com MASM32官方站点。

http://radasm.visualassembler.com RedASM的主站。

http://www.chinacode.cn/codeChannel/ChannelCatalog.php 中国编程网。

http://www.japheth.de/index.html MASM32资源网站,有许多示例和工具。

http://www.madwizard.org 研究汇编语言面向对象技术的网站,它的一些成果值得利用。