照着《Windows环境下32位汇编语言设计程序》上的例子,写了个HelloWorld的程序。就是让它弹出来一个窗口,中间写着“HelloWorld”,但生成的exe文件运行后会一下出来38个叠在一起的窗口。不知道是哪里写错了,望指点,谢谢!
代码如下:
.386
.model flat, stdcall
option casemap:none
;------------------include----------------------------------
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;-------------------data---------------------------------
.data?
hInstance dd ?
hWinMain dd ?
.const
szClassName db 'MyClass', 0
szCaptionMain db 'Hello World in Win32 ASM', 0
szText db 'Hello World!', 0
;-------------------code------------------------------
.code
;----------Window callback function--------
_ProcWinMain proc uses ebx edi esi, hwnd, uMsg, wParam, lParam
local @stPs: PAINTSTRUCT
local @stRect: RECT
local @hdc
mov eax, uMsg
;-------------------
.if eax == WM_PAINT
invoke BeginPaint, hwnd, addr @stPs
mov @hdc, eax
invoke GetClientRect, hwnd, addr @stRect
invoke DrawText, @hdc, addr szText, -1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint, hwnd, addr @stPs
;-------------------
.elseif eax == WM_CLOSE
invoke DestroyWindow, hWinMain
invoke PostQuitMessage, NULL
;---------------------
.else
invoke DefWindowProc, hwnd, uMsg, wParam, lParam
ret
.endif
;---------------------
_ProcWinMain endp
;--------------------------_WinMain--------------------
_WinMain proc
local @stWndClass: WNDCLASSEX
local @stMsg: MSG
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke RtlZeroMemory, addr @stWndClass, sizeof @stWndClass
;--------------Register Window Class-----------
invoke LoadCursor, 0, IDC_ARROW
mov @stWndClass.hCursor, eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize, sizeof WNDCLASSEX
mov @stWndClass.style, CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc, offset _ProcWinMain
mov @stWndClass.hbrBackground, COLOR_WINDOW+1
mov @stWndClass.lpszClassName, offset szClassName
invoke RegisterClassEx, addr @stWndClass
;--------------Create Window-------------------
invoke CreateWindowEx, WS_EX_CLIENTEDGE,\
offset szClassName, offset szCaptionMain, \
WS_OVERLAPPEDWINDOW,\
100, 100, 600, 400,\
NULL, NULL, hInstance, NULL
mov hWinMain, eax
invoke ShowWindow, hWinMain, SW_SHOWNORMAL
invoke UpdateWindow, hWinMain
;-----------------Message loop-------------------
.while TRUE
invoke GetMessage, addr @stMsg, NULL, 0, 0
.break .if eax == 0
invoke TranslateMessage, addr @stMsg
invoke DispatchMessage, addr @stMsg
.endw
ret
_WinMain endp
;-------------------------------------
start:
call _WinMain
invoke ExitProcess, NULL
;------------------------------------
end start
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法