我照书上写了个很简单的只调用了两个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 探索篇!