首页
社区
课程
招聘
[原创]Win32ASM可视化编程(初学者必看,高手勿进!已更新)
发表于: 2007-4-6 09:41 38231

[原创]Win32ASM可视化编程(初学者必看,高手勿进!已更新)

2007-4-6 09:41
38231

【文章作者】hacker0058
【作者主页】nohacks.ys168.com
【文章出处】bbs.pediy.com

1.前言:

      Win32ASM的编译器最常用的有两种:Borland公司的Tasm5.0和Microsoft的Masm6.11以上版本,两种编译器各有自己的优缺点
      
      
   但Masm在代码的优化上面好象比Tasm做得好,Masm和Tasm的宏语法有很多的不同,我的这个教程是以Masm格式写的。

2. Masm32的环境架设

  <1>下载与安装

      现在Masm32的最新版本是9.0的,我们可以在这里下载: http://www.pediy.com/tools/Compilers/masm32/m32v9r.zip
  
  要说明的是Masm32必须安装在磁盘分区跟目录,最好不要放在系统盘,以免重装系统时数据丢失!具体安装我就不多说了.

   <2>可视化编程
   
        Masm32是命令行的程序,每次写程序都要在命令行里输入这些重复的命令确实很累,能不能像VC那样可视化编程呢?
      
    答案是肯定的, RadASM就是这样的一个一个汇编集成开发工具,虽然名字是这么叫,其实它也是个通用的IDE,不但能做为常用的
   
    Masm,,Nasm,Tasm等编译器的IDE,还能做为VC,BC,LCC,html等的IDE,  下载地址: http://www.pediy.com/tools/Compilers/RadASM/HA_RadASM_2.2.0.9.rar

       下载会来是个压缩包,直接解要到与Masm32相同的磁盘分区,如: "D:\" ,解压完后打开所在文件夹,找到名为"masm.ini"的配

     置文件,搜索"Paths"找到下面的内容:
      
       [Paths]
       $A=C:\Masm32
       $B=$A\Bin
       $D=$R\AddIns
       $H=$A\Help
       $I=$A\Include
       $L=$A\Lib
       $P=$R\Masm\Projects
       $S=$R\Masm\Sniplets
       $T=$R\Masm\Templates
       $M=$R\Masm\Macro
       $E=C:\OllyDbg

     把上面$A后面的改为Masm32的实际安装文件夹,这里改为\Masm32,如果你装了OD调试器把最后一行改为OD所在文件夹,这样以后的编
     
译的程序就可以直接在调试器中运行,保存文件,OK,一切就序,现在可以开始用汇遍实现可视化编程!

    另外还有一点,如果装有VC的话,Masm32可能会把库文件或头文件放到VC的文件夹里(可以用Windows自带的搜索功能找到这些文

件)这一点要注意!如果出现这种情况,自己把库文件(*.LIB)或(*.INI)头文件分别COPY到Masm32下的的lib和include目录即可!

3.基本框架

   我发现Iczelion的Win32汇编教程的说的非常详细,我就直接引用了:

   下面的程序段是一个框架, 若您现在还不知道这些指令的确切意义的话,没关系, 随后我就会给大家详细解释。

.386
.MODEL Flat, STDCALL
.DATA
    <Your initialized data>
    ......
.DATA?
   <Your uninitialized data>
   ......
.CONST
   <Your constants>
   ......
.CODE
   <label>
    <Your code>
   .....
    end <label>

框架就这么简单,好,我现在就给您解释:

.386

这是一个汇编语言伪指令,他告诉编译器我们的程序是使用80386指令集编写的。您还可以使用 .486、.586, 但最安全的还是使用.386。对

于每一种CPU有两套几乎功能相同伪指令: .386/.386P、 486/.486P、 586/.586P。 带P的指令标明您的程序中可以用特权级指令。特权级

指令是保留给操作系统的,如虚拟设备驱动程序。在大多数时间,您的程序都无须运行在RING0层,故用不带后缀P的伪指令已足够了。

.MODEL FLAT,STDCALL

.MODEL 是用来指定内存模式的伪指令,在Win32下,只有一种内存模型,那就是FLAT。 STDCALL 告诉编译器参数的传递约定。参数的传递约

定是指参数传达时的顺序(从左到右或从右到左)和由谁恢复堆栈指针(调用者或被调用者)。在Win16下有两种约定:C 和 PASCAL。C 约定规

定参数传递顺序是从右到左,即最右边的参数最先压栈,由调用者恢复堆栈指针。

例如:为调用函数 foo ( int first_param, int second_param, int third_param ); 按C约定的汇编代码应该是这样的:

push [third_param]
push [second_param]
push [first_param]
call foo
add esp, 3 * 4 ;调用者自己恢复堆栈指针

PASCAL约定和C约定正好相反,它规定参数是从左向右传递,由被调用者恢复堆栈。Win16采用了PASCAL约定, 因为PASCAL约定产生的代码量

要小。当不知道参数的个数时,C约定特别有用。如在函数wsprintf () 中, wsprintf预先并不知道要传递几个参数,所以它不知道如何恢

复堆栈。STDCALL是C约定和PASCAL约定的混合体,它规定参数的传递是从右到左,恢复堆栈的工作交由被调用者。Win32只用STDCALL约定,

但除了一个特例,即:wsprintf。

.DATA .DATA? .CONST .CODE

上面的四个伪指令是"分段"(SECTION)伪指令。我们上面刚讲过Win32下没有"段"(SEGMENT)的概念,但是您可以把您的程序分成不同的"分段

", 一个"分段"的开始即是上一个"分段"的结束。WIN32中只有两种性质的"分段":DATA和CODE

其中DATA"分段"又分为三种:

.DATA 其中包括已初始化的数据。

.DATA? 其中包括未初始化的数据。比如有时您仅想预先分配一些内存但并不想指定初始值。使用未初始化的数据的优点是它不占据可执行文

件的大小,如:若您要在 .DATA? 段中分配10,000字节的空间,您的可执行文件的大小无须增加10,000字节,而仅仅是要告诉编译器在装

载可执行文件时分配所需字节。

.CONST 其中包括常量定义。这些常量在程序运行过程中是不能更改的。 应用程序并不需要以上所有的三个"分段", 可以根据需要进行定义

.CODE 这是代码"分段"。

<译者注:实际上,分段并不是象在 Dos 下一样,为不同的段分别指出不同的段寄存器,因为 Windows 下只有一个 4GB 的段,Windows 程

序中的分段表现在当程序装载时,赋予不同的分段不同的属性,比如说当你的程序加载时,对于 Ring3 程序来说,.code 段是不可写的,而

.data 段是可写的,如果你尝试象在 Dos 下一样写自己的代码部分,你会得到一个蓝屏错误>

<label>
end <label>
是用来唯一标识您的代码范围的标签, 两个标签必须相同,应用程序的所有可执行代码必修在两个标签之间。

4.第一个程序

  打开RadASM,文件→新建工程,调出工程向导,如下图所示:



  在工程名称里输入一个名称,比如"MyBox",在工程说明输入一段描述,如:"我的第一个程序",然后点击下一步

随后出现一个"模版"向导,这里选择"无",下一步出现"文件及目录",如果你不想有备份就把"BAK"的勾去掉,然后

再下一步点完成.

   再随后出现的右栏中双击*.Asm,这里是MyBox.Asm,然后把下面的代码COPY到里面


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (43)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
太好了。。。
2007-4-6 16:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很很很好!谢谢
2007-4-6 20:49
0
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这东西要顶的 ,支持你继续下去
2007-4-6 23:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还可视化的ASM用RadAsm不就好了??用那个汉化的2.2.09版本,天空软件站就有下载,里面带API参考和多种编译器附带OllyDBG和资源脚本编辑器
2007-4-7 07:09
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
6
和楼主说的是一样的。天空是转载我在汉化新世纪发的汉化增强版本。我在论坛上发的那个2.2.0.9的压缩包同样是汉化版本,只是没带其他的工具而已。目前最新的版本是2.2.1.1,早汉化完了,只是自己用,还没空整理发布。
2007-4-7 10:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很好,对新手确实有帮助
2007-4-7 10:35
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
EasyCode不是更可视化吗
2007-4-7 13:23
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
顶啊!无论如何都要写下去,就算世界上只有我一个支持者楼主也要坚持写下去!
最好是把重点放在可视化,毕竟RADASM是这么好 的ide!
2007-4-8 00:18
0
雪    币: 14958
活跃值: (4738)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
除了RadASM以外WINASM也是个不错的选择.不过那个EASYCode(是不是学VB的那个IDE?)如果是那个...个人感觉不如用以上的两个好.MASMPLUS也不错.
2007-4-8 00:32
0
雪    币: 14958
活跃值: (4738)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
CC大哥什么时候有时间重新整理以下吧.期待着呢~
2007-4-8 00:33
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
12
呵呵,原来是CC大哥汉化的啊,真的非常好用,代表广大的爱好者谢谢你了,还有哪个最新的版本能快点放出来吗?
2007-4-8 01:58
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
13
呵呵,有了你们的大力支持,我会坚持写下去的!
2007-4-8 02:02
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
真的是非常的适合我这种新手啊,太感谢了
2007-4-8 10:33
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
15
EasyCode也是个不错的汇编集成开发环境,原来是用VC6写的,现在好像也改成直接自己来继续开发了。用它创建工程时提供两种方式,一种是可视化方式,一种是传统方式。如果是传统方式,则类似于RadASM的工程,不过可定制性不如RadASM。而可视化方式则类似于在VC中使用MFC,可以双击控件来编辑相应代码。不过可视化方式编译出来的程序都比较大,因为里面加了EasyCode的一些控制代码。一般我们用汇编都希望能生成比较精炼短小的程序,从这点上来说使用EasyCode的可视化方式可能有违我们的初衷。EasyCode可以从这里下载,目前的最新版本是1.01.0002:

http://easycoder.org/English/Download.htm

实在不好意思,上次硬盘挂了,很多东西都丢了。要再重新整理比较困难。我上次传过2.2.1.1的汉化更新文件,刚才搜了一下,在这里:

http://bbs.pediy.com/showthread.php?t=39123

这个更新是基于我放在破解工具大礼包里的2.2.1.0c汉化版的。如果没有破解工具大礼包,也可以到我的网络U盘上下载基于2.2.0.9的其它汉化更新,再更新到2.2.1.1。我的网络U盘:

http://CCDebuger.ys168.com
2007-4-8 11:40
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我又来一次看楼主更新没有。。。
2007-4-9 00:56
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
哈.哈.顶楼上.我用的就是MASMPLUS..付合中国人习惯.越用越强大.不过资源编辑器还要用VC的.
2007-4-9 01:32
0
雪    币: 314
活跃值: (15)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
18
我也去http://CCDebuger.ys168.com看看有什么好东西没有
2007-4-16 13:38
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
我来交作业!!!很简单,楼主已经帮我们写好了
直接复制粘帖就可以了。不过直接粘帖会出现很多窗口,要加个.if判断按钮是否按下去。
好像论坛的帖子用了code框firefox不是显示的很好。。。

最后希望楼主下一个教程能解释下面问题:
1。定义temp里面的是怎样找到的呢?
2.想到再问。



;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;QQ任我聊 by BoXer
;http://boxer.yo2.cn
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386 
.model flat,stdcall 
option casemap:none 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;        Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc 
include kernel32.inc 
include shell32.inc
includelib kernel32.lib 
include user32.inc 
includelib user32.lib 
includelib shell32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;        Equ 数据 RC资源
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


DLG_MAIN        equ             1000
IDC_EDT         equ             1001         ;编辑框
IDC_IDOK        equ             1002         ;按纽
QQ_N            equ             12           ;设置QQ号的最大位数

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data 

temp 		db 	"tencent://message/?uin=",'%s',"&Site=im.qq.com&Menu=yes",0
Err		db 	"请输入你想聊天好友的号码。",0
szCaption	db	"注意!",0

.data?
posBuffer  	db 		50+QQ_N dup (?)
qqtemp 		db 		QQ_N dup (?)

hInstance 	HINSTANCE 	?   

.code 

;********************************************************************
_ProcDlgMain        proc        uses ebx edi esi, \
                hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

            mov eax,wMsg
                
        cmp eax,WM_CLOSE         ;对话框关闭时
        je  boxClose
        cmp eax,WM_INITDIALOG    ;对话框初始化时
        je  boxStart
        cmp eax,WM_COMMAND       ;按下对话框上的按钮时
        je commoand
        
        
   
   retFalse:
           mov        eax,FALSE
           ret    
                  
   boxClose:
          invoke EndDialog,hWnd,NULL
          jmp retTrue
          
   boxStart:       
            
           jmp retTrue
                   
   commoand:
           mov eax,wParam
           
           .if ax == IDC_IDOK
           	
           invoke GetDlgItemText,hWnd,IDC_EDT,addr qqtemp,QQ_N  ;取用户输入到文本
           
           	.if eax == 0
           		invoke MessageBox,hWnd,addr Err,addr szCaption,MB_OK
           	.elseif
           
                             
  	   	invoke wsprintf,addr posBuffer,addr temp,addr qqtemp ;连接文本串
                                
           	invoke ShellExecute,NULL,NULL,addr posBuffer,NULL,NULL,SW_HIDE  ;执行IE命令
           	
           	.endif
           
           .endif
            
     retTrue:
        
           mov        eax,TRUE
           ret        

_ProcDlgMain        endp

;********************************************************************

start:
  invoke GetModuleHandle,NULL
  mov hInstance,eax
  invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0   ;显示对话框
  invoke ExitProcess,NULL

;********************************************************************

end start


上传的附件:
2007-4-18 00:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
支持一下!我是一只只小鸟,学习中...
2007-4-18 01:13
0
雪    币: 224
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
gooooood
2007-4-18 12:49
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
22
虽然会了``
不过支持非安全兄``

还有谢了你“一条信息搞定星号密码”那文的EM_SETPASSWORDCHAR消息``

呵1`
2007-4-18 15:45
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
23
你说的是这个吗?

"tencent://message/?uin=",'%s',"&Site=im.qq.com&Menu=yes",

很多网站上有QQ在线状态,它的链接地址就是像这样的!
2007-4-19 16:32
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
也要好好看看。。。
2007-4-19 16:41
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
原来如此。我现在学win32汇编感觉有点吃力
有人说最好先学c的windows编程
这样win32asm就容易多了
真的是这样吗?
现在感觉自己就是应该没接触过windows的api
所以根本就不知道win32asm怎么入手
到自己想写程序的时候一片的空白,只好找人家公开的代码来一句一句的拼凑
唉。。。
2007-4-20 00:23
0
游客
登录 | 注册 方可回帖
返回
//