首页
社区
课程
招聘
[旧帖] [求助]windows 32 汇编程序一个很奇怪的错误 0.00雪花
发表于: 2009-10-11 23:22 1113

[旧帖] [求助]windows 32 汇编程序一个很奇怪的错误 0.00雪花

2009-10-11 23:22
1113
include         windows.inc
include         kernel32.inc
includelib         kernel32.lib
include         gdi32.inc
includelib         gdi32.lib
include         user32.inc
includelib         user32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RGB macro red,green,blue
        mov eax,0
        mov eax,blue
        shl eax,8
        mov ah,green
        mov al,red
endm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
szClassName        db        "rgbclass",0
szAppName        db        "绘制文本",0
TestString          db         "Win32 assembly is great and easy!",0
FontName         db         "script",0

        .data?
hInstance        HINSTANCE        ?

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
WinMain proc
       
        LOCAL wc:WNDCLASSEX
        LOCAL hwnd:HWND
        LOCAL msg:MSG
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;获取句柄
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        invoke GetModuleHandle,NULL
        mov hInstance,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
        mov wc.cbSize,sizeof WNDCLASSEX
        mov wc.style,CS_VREDRAW or CS_HREDRAW
        mov wc.lpfnWndProc,offset WndProc
        mov wc.cbClsExtra,0
        mov wc.cbWndExtra,0
        push hInstance
        pop wc.hInstance
        invoke        LoadIcon,NULL,IDI_APPLICATION
        mov wc.hIcon,eax
        mov wc.hIconSm,eax
        invoke LoadCursor,NULL,IDC_ARROW
        mov wc.hCursor,eax
        mov wc.hbrBackground,COLOR_WINDOW+1
        mov wc.lpszMenuName,NULL
        mov wc.lpszClassName,offset szClassName
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;注册窗口类
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
        invoke RegisterClassEx,addr wc
       
                invoke CreateWindowEx,NULL,ADDR szClassName,ADDR szAppName,\
                      WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
                    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
                        hInstance,NULL

        mov hwnd,eax
        invoke ShowWindow,hwnd,SW_SHOWNORMAL
        invoke UpdateWindow,hwnd
       
        .while TRUE
                       invoke GetMessage, ADDR msg,NULL,0,0
                      .BREAK .IF (!eax)
                       invoke TranslateMessage, ADDR msg
                       invoke DispatchMessage, ADDR msg
                .endw
        mov eax,msg.wParam
        ret
WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc uses esi ebx edi,hwnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
       
        LOCAL hdc:HDC
        LOCAL ps:PAINTSTRUCT
        LOCAL hfont:HFONT
       
        .if  uMsg==WM_PAINT
                invoke BeginPaint,hwnd,addr ps
                mov hdc,eax
                 invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
                                       OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
                                       DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
                                       ADDR FontName

                              invoke SelectObject, hdc, eax
                                 mov    hfont,eax
                               RGB    200,200,50
                                 invoke SetTextColor,hdc,eax
                               RGB    0,0,255
                               invoke SetBkColor,hdc,eax
                               invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString
                               invoke SelectObject,hdc, hfont
                               invoke EndPaint,hwnd, ADDR ps
        
        .elseif uMsg==WM_DESTROY
            invoke PostQuitMessage,NULL
       
                 .ELSE
                            invoke DefWindowProc,hwnd,uMsg,wParam,lParam
                ret
        .endif
        xor eax,eax
        ret
WndProc endp
end start
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
修改为:将start移程序后面  加一句call    WinMain  如下:

        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
include         windows.inc

include         kernel32.inc
includelib         kernel32.lib

include         gdi32.inc
includelib         gdi32.lib

include         user32.inc
includelib         user32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RGB macro red,green,blue
        mov eax,0
        mov eax,blue
        shl eax,8
        mov ah,green
        mov al,red
endm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
szClassName        db        "rgbclass",0
szAppName        db        "绘制文本",0
TestString          db         "Win32 assembly is great and easy!",0
FontName         db         "script",0

        .data?
hInstance        HINSTANCE        ?

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code

WinMain proc
       
        LOCAL wc:WNDCLASSEX
        LOCAL hwnd:HWND
        LOCAL msg:MSG
        invoke GetModuleHandle,NULL
        mov hInstance,eax
       
       
       
        mov wc.cbSize,sizeof WNDCLASSEX
        mov wc.style,CS_VREDRAW or CS_HREDRAW
        mov wc.lpfnWndProc,offset WndProc
        mov wc.cbClsExtra,0
        mov wc.cbWndExtra,0
        push hInstance
        pop wc.hInstance
        invoke        LoadIcon,NULL,IDI_APPLICATION
        mov wc.hIcon,eax
        mov wc.hIconSm,eax
        invoke LoadCursor,NULL,IDC_ARROW
        mov wc.hCursor,eax
        mov wc.hbrBackground,COLOR_WINDOW+1
        mov wc.lpszMenuName,NULL
        mov wc.lpszClassName,offset szClassName
       
        invoke RegisterClassEx,addr wc
         invoke CreateWindowEx,NULL,ADDR szClassName,ADDR szAppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInstance,NULL

        mov hwnd,eax
        invoke ShowWindow,hwnd,SW_SHOWNORMAL
        invoke UpdateWindow,hwnd
       
        .while TRUE
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg

               
        .endw
        mov eax,msg.wParam
        ret

WinMain endp

WndProc proc uses esi ebx edi,hwnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
       
        LOCAL hdc:HDC
        LOCAL ps:PAINTSTRUCT
        LOCAL hfont:HFONT
       
        .if  uMsg==WM_PAINT
                invoke BeginPaint,hwnd,addr ps
                mov hdc,eax
                 invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
                                       OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
                                       DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
                                       ADDR FontName

                invoke SelectObject, hdc, eax
                mov    hfont,eax
                        RGB    200,200,50
                invoke SetTextColor,hdc,eax
                RGB    0,0,255
                invoke SetBkColor,hdc,eax
                invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString
                invoke SelectObject,hdc, hfont
                invoke EndPaint,hwnd, ADDR ps
        
        .elseif uMsg==WM_DESTROY
                   invoke PostQuitMessage,NULL
       
            .ELSE
                invoke DefWindowProc,hwnd,uMsg,wParam,lParam
                ret
        .endif
        xor eax,eax
        ret

WndProc endp
start:  
        call WinMain
        
end start
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
可以结束进程  但还有错
》》》》》》》》》》》》》》》》》》》
继续修改为:
在start:  
        call WinMain

后加 invoke ExitProcess,NULL
即可

这是为什么??????????!!!!!!!!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
2
这个不奇怪 用汇编很多操作(像堆栈平衡)就得自己来完成,不像高级语言编译器
还好现在的masm加了不少高级语法
start:  
  call WinMain
end start
这样写 call执行完返回后系统就不知道干什么了
加个ret 或exitprocess 来告诉操作系统要退出了
自己可以OD里面跟下就很清楚了
2009-10-12 19:08
0
游客
登录 | 注册 方可回帖
返回
//