首页
社区
课程
招聘
[求助]第二章消息断点的例子中讲“反复这个过程,在几次中断后到达处理按钮的事件代码,很快就能发现check按钮时间的代码了”。。。
发表于: 2008-7-28 16:06 10520

[求助]第二章消息断点的例子中讲“反复这个过程,在几次中断后到达处理按钮的事件代码,很快就能发现check按钮时间的代码了”。。。

2008-7-28 16:06
10520
第二章消息断点的例子中讲“反复这个过程,在几次中断后到达处理按钮的事件代码,很快就能发现check按钮时间的代码了”。

请问 反复这个过程 指的是什么过程? 是指 按alt+m 对.text下set break on access断点,然后按F9运行 这个过程吗?为什么这样做却没有停在书上显示的代码处??

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
这里描述需要改进。

“ 反复这个过程”是指Alt+M回到程序代码后,再按F8单步走,会再次回到系统代码里,你再Alt+M,下断点,回到程序代码里。这里好像重复一次,就能来到按钮事件的代码了
2008-7-28 20:55
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
对check按钮下wm_lbuttonup断点并点击check按钮后,会停在
77D3AFFE >  8BFF            mov     edi, edi
77D3B000    55              push    ebp
77D3B001    8BEC            mov     ebp, esp

Alt+M 对.text区块下内存访问断点set break on access

F9运行程序 停在程序的消息循环处
004010D0   .  81EC F4000000 sub     esp, 0F4
004010D6   .  56            push    esi
004010D7   .  57            push    edi
004010D8   .  B9 05000000   mov     ecx, 5

后面就不太会了。书上前面讲的对内存下断点也还没看。明天吧
2008-7-28 21:12
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
4
kanxue老大,按照你的方法操作,结果代码又返回到004010D0这里拉,根本不知道哪里是按钮的代码
2008-7-29 16:16
0
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
本例主要是与大家探讨思路。
这段代码是一个消息循环,不停地处理TraceMe主界面的各类消息,此时可能不是直接处理按钮事件,如果单步跟踪,会跟进系统代码里去。在系统代码里,再次按“Alt+M”键打开内存窗口,对.text区块下内存访问断点,F9运行后,会再次来到代码里。可以重复这个过程,在1、2次中断后,就能到达处理按钮的事件代码。大概1,2次后,就能来到“Check”按钮事件的代码:

004010D0   sub     esp, 0F4 //Alt+M会中断在这
……
00401169   je      short 0040119C //不跳
……
0040119C   mov     esi, dword ptr [esp+100] 	;  Case 3F5 of switch 0040115E
004011A3   mov     edi, dword ptr [<&USER32. GetDlgItemTextA >
004011A9   push    ebx
004011AA   lea     eax, dword ptr [esp+4C]
004011AE   push    51                         		; /Count = 51 (81.)
004011B0   push    eax                        		; |Buffer
004011B1   push    6E                          	; |ControlID = 6E (110.)
004011B3   push    esi                         	; |hWnd
004011B4   call    edi                        		; \GetDlgItemTextA
2008-7-29 16:26
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
请问 到 004010D0   sub     esp, 0F4 //Alt+M会中断在这
之后怎么操作呢?接着按“Alt+M”键打开内存窗口,对.text区块下内存访问断点,F9运行?
可是都是回到 004010D0   .  81EC F4000000    sub     esp, 0F4 没到 00401169   je      short 0040119C //不跳 呀??
刚开始学 完全照着书打例子

===============
另外 alt+s没实现快速回复呀 能不能改成ctrl+enter呢??
var ie = (document.all)?true:false
        if(ie){
                function ctrlent(eventobject){
                        if(event.ctrlKey && window.event.keyCode == 13){
                                this.document.form1.submit();
                        }
                }
        }

        <form action="www.iceworld.com" method="post" name="form1">
                <textarea cols=80 name=Content rows=12 wrap=virtual onkeydown=ctrlent()>
                </textarea><br>
                <input type="submit" value="submit"/>
        </form>
2008-7-29 19:54
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
书前面说set break on access是一次性断点,那能不能设set memory breakpoint on access??这个不是一次性的。我设了这个断点,然后按了91次F9就到书上的代码了

8BB424 000100>mov     esi, dword ptr [esp+100]        
8B3D A0404000 mov     edi, dword ptr [<&USER32.GetDlgItemTextA>]   

老大对吗?怎么按那么多次?
还想问一下 202 wm_lbuttonup 这样的消息列表哪里可以查到呢?wm_command是多少?
2008-7-29 20:43
0
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
8
你是用firefox?这个快捷键不支持。只支持IE。



Alt+M,在.text区块一行F2设断,F9再运行。来到代码处,按F8单步运行,会再次回到系统代码里。重复刚才的操作。

[QUOTE=iceworld;488743]书前面说set break on access是一次性断点,那能不能设set memory breakpoint on access??这个不是一次性的。我设了这个断点,然后按了91次F9就到书上的代码了

8BB424 000100>mov     esi, dword ptr [esp...[/QUOTE]

那太累了。每走一行都会中断。
2008-7-29 20:51
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我用的是the world
请问wm_command的序号是多少?在哪里可以查到这些消息的序号?
2008-7-29 21:27
0
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
10
如果你安装了Microsoft Visual C++ ,在头文件所在目录找WinUser.h
光盘的\document\Library 收集了VC 2008的WinUser.h文件。

2008-7-30 09:45
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
找找了 #define WM_COMMAND 273
2008-7-30 12:43
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
老大还在吗?
为啥 我到 004010D0 sub esp, 0F4后 一路F8就能到 0040119C,不会跳到系统代码,而是再往后一段继续F8才会跑到系统代码去?是不是如果F8跟到0040119C就可以了,不需要再重复ALT+M了吧?
还是说按老大的做法,重复几次后会直接中断到0040119C这里,不需要F8了?
2008-7-30 18:05
0
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
13
第一次就到达目的地更好了。这是一个消息循环,系统随时处理各类消息,有其不定性。
2008-7-30 22:05
0
雪    币: 277
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
我也是遇到这个问题了,后来自己想了想,"可以重复这个过程“是明白了。但是如果在系统代码里按了Alt+F9(本意是想返回到用户代码)发现不能返回用户代码后,打开内存窗口对.text区块下断,然后F9运行,此时返回的代码不是004010D0 sub esp,0F4    而是 00401060   . 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8],这时”重复这个过程”也不能到达事件代码可能是重复的次数不够多吧
2009-7-4 20:01
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我试了下,这个方法确实好用.这里有个心得,不知道对不对,说出来大家指正一下:
这里之所以要"反复这个过程",是因为我们是对程序段下的访问断点,那么有两种情况:
   第一种情况,是系统调用用户断中的程序(有可能是事件响应程序,也有可能不是,但是我觉得这里如果是对LBUTTON_UP下断的话,如果调用的是程序,基本上也就是事件响应函数了)
   第二种情况,是访问程序段中的数据,比如去查表,查什么表呢,就是查控件itemId与事件响应函数地址对应的表.通常来讲查表的过程会在调用函数之前.

   根据以上分析,第一次或者前几次断下的地方一般是访问代码段中的数据,之后才是真正跳到某个地址执行事件响应函数.所以这个过程有几次.
2009-7-6 18:34
0
游客
登录 | 注册 方可回帖
返回
//