首页
社区
课程
招聘
[求助]postquitmessage错误!
发表于: 2010-3-2 17:13 5120

[求助]postquitmessage错误!

2010-3-2 17:13
5120
N久木有整ASM了,都快丢光了,现在想捡起来,结果杯具了:
				.386
				.model	flat,stdcall
				option	casemap:none
				
				
		include		windows.inc
		include		kernel32.inc
		include		user32.inc
		include		gdi32.inc
		
		includelib	kernel32.lib
		includelib	user32.lib
		includelib	gdi32.lib
		
		
				.data
				
		szFormat	db		'%d * %d',0
		szCaption	db		'Caption',0
		szClass		db		'MyClass',0
		
		szMenu1		db		'File',0
		szMenu11	db		'Open',0
		szMenu12	db		'Save',0
		szMenu13	db		'Exit',0
		
				.data?
		hInstance	dd		?
		hMenu		dd		?
		hSubMenu	dd		?
		
		
				.code
				
	MsgLoop:
			push	ebp
			mov	ebp,esp
			
			push	ebx
			push	edi
			push	esi
			
			sub	esp,sizeof PAINTSTRUCT + sizeof RECT + 4 + 16
			mov	edi,esp
			mov	ecx,sizeof PAINTSTRUCT + sizeof RECT + 4 + 16
			xor	eax,eax
			cld
			rep	stosb
			
			;buff:dword ptr [ebp - 12 - 16]
			;hdc:dword ptr [ebp - 12 - 16 - 4]
			;rect:dword ptr [ebp - 12 - 16 - 4 - sizeof RECT]
			;paintstruct:dword ptr [ebp - 12 - 16 - 4 - sizeof RECT - sizeof PAINTSTRUCT]
			;hWnd:dword ptr [ebp + 8]
			;uMsg:dword ptr [ebp + 12]
			;wParam:dword ptr [ebp + 16]
			;lParam:dword ptr [ebp + 20]
			
			mov	eax,dword ptr [ebp + 12]
			cmp	eax,WM_CLOSE
			jz	wmClose
			cmp	eax,WM_PAINT
			jz	wmPaint
			
		wmDefault:
			
			invoke	DefWindowProc,dword ptr [ebp + 8],dword ptr [ebp + 12],dword ptr [ebp + 16],dword ptr [ebp + 20]
			jmp	wmEnd
			
			
		wmPaint:
			
			lea	eax,dword ptr [ebp - 12 - 16 - 4 - sizeof RECT - sizeof PAINTSTRUCT]
			invoke	BeginPaint,dword ptr [ebp + 8],eax
			mov	dword ptr [ebp - 12 - 16 - 4],eax
			
			lea	eax,dword ptr [ebp - 12 - 16 - 4 - sizeof RECT]
			invoke	GetClientRect,dword ptr [ebp + 8],eax
			
			lea	ebx,dword ptr [ebp - 12 - 16]
			mov	ecx,dword ptr [ebp - 12 - 16 - 4 - 4 -4]
			mov	eax,dword ptr [ebp - 12 - 16 - 4 - 4]
			invoke	wsprintf,ebx,offset szFormat,ecx,eax
			
			lea	ebx,dword ptr [ebp - 12 - 16]
			lea	eax,dword ptr [ebp - 12 - 16 - 4 - sizeof RECT]
			invoke	DrawText,dword ptr [ebp - 12 - 16 - 4],ebx,-1,eax,DT_SINGLELINE or DT_CENTER or DT_VCENTER
			
			lea	eax,dword ptr [ebp - 12 - 16 - 4 -sizeof RECT - sizeof PAINTSTRUCT]
			invoke	EndPaint,dword ptr [ebp + 8],eax
			
			xor	eax,eax
			jmp	wmEnd
			
		wmClose:
			invoke	DestroyWindow,dword ptr [ebp + 8]
			invoke	PostQuitMessage,0
			xor	eax,eax

		wmEnd:
			mov	esp,ebp
			sub	esp,12
			pop	esi
			pop	edi
			pop	ebx
			
			mov	esp,ebp
			pop	ebp
			
			pop	ecx
			add	esp,16
			push	ecx
			
			ret
	main:
			push	ebp
			mov	ebp,esp
			
			sub	esp,sizeof WNDCLASSEX + sizeof MSG + 4
			mov	ecx,sizeof WNDCLASSEX + sizeof MSG + 4
			xor	eax,eax
			mov	edi,esp
			cld
			rep	stosb
			
			;wndclassex:dword ptr [ebp - 4 - sizeof MSG - sizeof WNDCLASSEX]
			;msg:dword ptr [ebp - 4 - sizeof MSG]
			;hWnd:dword ptr [ebp - 4]
			
			invoke	GetModuleHandle,NULL
			mov	hInstance,eax
			lea	ebx,dword ptr [ebp - 4 - sizeof MSG - sizeof WNDCLASSEX]
			assume	ebx:ptr WNDCLASSEX
			mov	[ebx].hInstance,eax
			invoke	LoadIcon,NULL,IDI_APPLICATION
			mov	[ebx].hIcon,eax
			invoke	LoadCursor,NULL,IDC_ARROW
			mov	[ebx].hCursor,eax
			mov	[ebx].cbSize,sizeof WNDCLASSEX
			mov	[ebx].lpfnWndProc,offset MsgLoop
			mov	[ebx].lpszClassName,offset szClass
			mov	[ebx].hbrBackground,COLOR_WINDOW + 1
			mov	[ebx].style,CS_HREDRAW or CS_VREDRAW
			
			invoke	RegisterClassEx,ebx
			invoke	GetSystemMetrics,SM_CXSCREEN
			sub	eax,400
			shr	eax,1
			push	eax
			invoke	GetSystemMetrics,SM_CYSCREEN
			sub	eax,300
			shr	eax,1
			pop	ecx
			
			invoke	CreateWindowEx,WS_EX_CLIENTEDGE,\
						offset szClass,\
						offset szCaption,\
						WS_VISIBLE or WS_OVERLAPPEDWINDOW,\
						ecx,eax,400,300,0,0,0,0
			mov	dword ptr [ebp - 4],eax
			
			invoke	UpdateWindow,eax
			;invoke	ShowWindow,dword ptr [ebp - 4],SW_SHOW
			add	ebx,sizeof WNDCLASSEX
			
		@@:
			invoke	GetMessage,ebx,dword ptr [ebp - 4],0,0
			test	eax,eax
			jz	@f
			invoke	TranslateMessage,ebx
			invoke	DispatchMessage,ebx
			jmp	@b
		@@:
			xor	eax,eax
			mov	esp,ebp
			pop	ebp
			ret
			
	start:	
			call	main
			invoke	ExitProcess,0
	end	start

运行一切正常,只是关闭后窗口被销毁,process却不能退出。
请大大帮我see一see哪儿有毛病。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
2
这个是编译后的东东: abc.rar
上传的附件:
2010-3-2 17:22
0
雪    币: 393
活跃值: (100)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
消息处理有错呗
      invoke  GetMessage,ebx,dword ptr [ebp - 4],0,0
      test  eax,eax
      jz  @f    ---- 改成jb就好了,不过还是认真把消息处理好吧
2010-3-2 17:30
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
4
[QUOTE=iiii;769216]消息处理有错呗
      invoke  GetMessage,ebx,dword ptr [ebp - 4],0,0
      test  eax,eax
      jz  @f    ---- 改成jb就好了,不过还是认真把消息处理好吧[/QUOTE]

jz改jb一样报错。
而且CPU占用一下就100%了。


也许休息一晚明天看就好了吧。
希望今天有大大能替我解惑,谢大大了。
2010-3-2 17:34
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
5
自己测试了下,不是.打酱油
2010-3-2 17:47
0
雪    币: 393
活跃值: (100)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
我的电脑没有报错。
之前的修改确实蠢了,- -

改成下面这样就好了。
00401170 |> /6A 00 /push 0 ; /MsgFilterMax = 0
00401172 |. |6A 00 |push 0 ; |MsgFilterMin = 0
00401174 |. |FF75 FC |push dword ptr [ebp-4] ; |hWnd
00401177 |. |53 |push ebx ; |pMsg
00401178 |. |E8 67000000 |call <jmp.&user32.GetMessageA> ; \GetMessageA
0040117D |. |40 |inc eax ----------这里
0040117E |. |90 |nop -----------这里
0040117F |. |74 0E |je short 0040118F
2010-3-2 18:54
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
7
谢谢LS的大大,虽然可以结束process,但是getmessage返回-1应该是错误吧,用od看了一下,hWnd和pMsg都没有错误,但就是在消息循环里面出不来。
仔细看了一下getmessage的说明:
函数功能:该函数从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。

函数原型:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilteMax

参数:

lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。

hWnd:取得其消息的窗口的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。

wMsgFilterMin:指定被检索的最小消息值的整数。

wMsgFilterMax:指定被检索的最大消息值的整数。

返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是_1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。

娘的,原来hWnd应该使用NULL,修改成:
@@:
invoke GetMessage,ebx,NULL,0,0
test eax,eax
je @f
invoke TranslateMessage,ebx
invoke DispatchMessage,ebx
jmp @b
@@:

就OK了。
之前一直怕是msgloop中有问题,用od跟进postqiutmessage就杯具了,所以一直在msgloop中找原因,思路太狭隘了,谢谢LS的大大。
2010-3-3 09:12
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
编译好后用OD跟一下吧,下载附件好像要分的
2010-3-4 15:27
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我跟了一下,发现你在DESTROYWINDOW后就直接调用PostQueryMessage了
2010-3-4 15:45
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
PostQueryMessage必须放在WM_DESTROY事件中
2010-3-4 15:46
0
游客
登录 | 注册 方可回帖
返回
//