首页
社区
课程
招聘
[旧帖] [求助] 第一天学习WIN32汇编有个疑问不知道有没人能帮下我? 0.00雪花
发表于: 2009-5-23 21:18 1474

[旧帖] [求助] 第一天学习WIN32汇编有个疑问不知道有没人能帮下我? 0.00雪花

2009-5-23 21:18
1474
我照书上写了个很简单的只调用了两个API的程序.但是程序虽小但是问题多多(不是编译连接问题)

代码如下:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none

include E:\masm32\include\windows.inc
include E:\masm32\include\user32.inc
includelib E:\masm32\lib\user32.lib
include E:\masm32\include\kernel32.inc
includelib E:\masm32\lib\kernel32.lib

.data

sz1   db   '第一个汇编程序',0
sz2   db   'Hello world',0

.code

start:

invoke MessageBox,NULL,offset sz2,offset sz1,MB_OK
invoke ExitProcess,NULL

end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
对这段代码问题有1个:
我试了下当我不调用ExitProcess这个函数时编译成EXE后虽然仍能执行但是当我关闭对话框后
就会报错.而加上ExitProcess后却不报错...这是为什么呢???

然后我又用OD打开了这个程序,因为我想看看反汇编后是些什么代码
代码如下
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
00401000 >/$  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401002  |.  68 00304000   PUSH first.00403000                      ; |Title = "第一个汇编程序"
00401007  |.  68 0F304000   PUSH first.0040300F                      ; |Text = "Hello world"
0040100C  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
0040100E  |.  E8 0D000000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
00401013  |.  6A 00         PUSH 0                                   ; /ExitCode = 0
00401015  \.  E8 0C000000   CALL <JMP.&kernel32.ExitProcess>         ; \ExitProcess
0040101A   .- FF25 0C204000 JMP DWORD PTR DS:[<&user32.wsprintfA>]   ;  user32.wsprintfA
00401020   $- FF25 08204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>] ;  user32.MessageBoxA
00401026   .- FF25 00204000 JMP DWORD PTR DS:[<&kernel32.ExitProcess>;  kernel32.ExitProcess
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
这个问题就有点多了....一个一个来
1.第一句00401000 >/$  6A 00         PUSH 0                                   ; /Style =
这里的>/$是什么意思呢??为什么要PUSH 0 呢
2.第二句00401002  |.  68 00304000   PUSH first.00403000
PUSH first.00403000是将什么压栈呢?first.00403000中的'.'是什么含义?
3.0040100E  |.  E8 0D000000   CALL <JMP.&user32.MessageBoxA>  
这里调用API了CALL <JMP.&user32.MessageBoxA>  里面的&是什么意思还有为什么要加<>

请高手帮帮我这个迷途的菜鸟吧!!!!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 14
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
1、ExitProcess是退出进程呀
2、push 0  是因为你的参数是MB_OK和NULL,这在头文件里面定义好了,它们的数值就是0
     PUSH first.00403000是将什么压栈呢?你查看一下00403000,是不是指向'第一个汇编程序'字符串?

    first.00403000中的'.'是什么含义?这里调用API了CALL <JMP.&user32.MessageBoxA>  里面的&是什么意思还有为什么要加<>

点和单括号是OD里面的一种表示方法而已吧,应该不用太在意。点后面的first应该是你的程序名吧;&符号不晓得是不是取地址的意思呢。
2009-5-24 13:45
0
游客
登录 | 注册 方可回帖
返回
//