能力值:
(RANK:350 )
|
-
-
2 楼
这里描述需要改进。
“ 反复这个过程”是指Alt+M回到程序代码后,再按F8单步走,会再次回到系统代码里,你再Alt+M,下断点,回到程序代码里。这里好像重复一次,就能来到按钮事件的代码了
|
能力值:
( 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
后面就不太会了。书上前面讲的对内存下断点也还没看。明天吧
|
能力值:
( LV13,RANK:420 )
|
-
-
4 楼
kanxue老大,按照你的方法操作,结果代码又返回到004010D0这里拉,根本不知道哪里是按钮的代码
|
能力值:
(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
|
能力值:
( 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>
|
能力值:
( 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是多少?
|
能力值:
(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]
那太累了。每走一行都会中断。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我用的是the world
请问wm_command的序号是多少?在哪里可以查到这些消息的序号?
|
能力值:
(RANK:350 )
|
-
-
10 楼
如果你安装了Microsoft Visual C++ ,在头文件所在目录找WinUser.h
光盘的\document\Library 收集了VC 2008的WinUser.h文件。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
找找了 #define WM_COMMAND 273
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
老大还在吗?
为啥 我到 004010D0 sub esp, 0F4后 一路F8就能到 0040119C,不会跳到系统代码,而是再往后一段继续F8才会跑到系统代码去?是不是如果F8跟到0040119C就可以了,不需要再重复ALT+M了吧?
还是说按老大的做法,重复几次后会直接中断到0040119C这里,不需要F8了?
|
能力值:
(RANK:350 )
|
-
-
13 楼
第一次就到达目的地更好了。这是一个消息循环,系统随时处理各类消息,有其不定性。
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
我也是遇到这个问题了,后来自己想了想,"可以重复这个过程“是明白了。但是如果在系统代码里按了Alt+F9(本意是想返回到用户代码)发现不能返回用户代码后,打开内存窗口对.text区块下断,然后F9运行,此时返回的代码不是004010D0 sub esp,0F4 而是 00401060 . 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8],这时”重复这个过程”也不能到达事件代码 可能是重复的次数不够多吧
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
我试了下,这个方法确实好用.这里有个心得,不知道对不对,说出来大家指正一下:
这里之所以要"反复这个过程",是因为我们是对程序段下的访问断点,那么有两种情况:
第一种情况,是系统调用用户断中的程序(有可能是事件响应程序,也有可能不是,但是我觉得这里如果是对LBUTTON_UP下断的话,如果调用的是程序,基本上也就是事件响应函数了)
第二种情况,是访问程序段中的数据,比如去查表,查什么表呢,就是查控件itemId与事件响应函数地址对应的表.通常来讲查表的过程会在调用函数之前.
根据以上分析,第一次或者前几次断下的地方一般是访问代码段中的数据,之后才是真正跳到某个地址执行事件响应函数.所以这个过程有几次.
|
|
|