经过两天来的充电,一番奋战,终于对老大所讲的“如何利用消息环定位相关MENU或者BUTTON的WM_COMMAND(即点击)处理代码的过程”有了一些认识,把第一题的的第三种方法找出来了,敬请大家指正
第一题
3、
先用资源工具reshacker把菜单栏中暂停?的ID看出来,为2202(其实也可不必的):
POPUP "调试(&D)"
{
MENUITEM "运行(&R)\tF9", 2201
MENUITEM "暂停(&P)\tF12", 2202
MENUITEM "重新开始(&S)\tCtrl+F2", 2203
MENUITEM "关闭(&C)\tAlt+F2", 2204
MENUITEM SEPARATOR
MENUITEM "单步步入(&I)\tF7", 2205
……
然后用命令bpx enablemenuitem下断点,按alt+B可以看到Breakpoints表有二十来多处用到这个断点的
先全部禁用,然后按F9运行被调试的OD,用这个被调试的OD打开一个程序,按F9运行,然后回到第一个OD,把这些禁用的断点全部激活→切换到第二个OD中,点主菜单“调试”,即断下,来到004335C4 :
004335BD |> \52 push edx ; /Flags
004335BE |. 68 3B080000 push 83B ; |ItemID = 83B (2107.)
004335C3 |. 53 push ebx ; |hMenu
004335C4 |. E8 15BE0700 call <jmp.&USER32.EnableMenuItem> ; \EnableMenuItem
004335C9 |. B9 01000000 mov ecx, 1
……
0043362C |> \52 push edx ; /Flags
0043362D |. 68 9A080000 push 89A ; |ItemID = 89A (2202.)
00433632 |. 53 push ebx ; |hMenu
00433633 |. E8 A6BD0700 call <jmp.&USER32.EnableMenuItem> ; \EnableMenuItem
……
00433808 |. 68 C8090000 push 9C8 ; |ItemID = 9C8 (2504.)
0043380D |. 53 push ebx ; |hMenu
0043380E |. E8 CBBB0700 call <jmp.&USER32.EnableMenuItem> ; \EnableMenuItem
00433813 |. E9 2F0A0000 jmp 00434247
00433818 |> 8BCB mov ecx, ebx ; Case 111 (WM_COMMAND) of switch 004323ED
可以看到,主菜单上的多个键ID都在这里,它们由Case 111 (WM_COMMAND) of switch 004323ED进行处理,(还有一些由系统默认处理了,如打开、关闭、放大等,所以说是多个键,而不是全部键在这里)
因此,我们在00433818处下断,而把其它断点禁用,按F9运行,切换第二个OD,在“调试”中点暂停,即断在433818处,按F8,一直前进,来到00433CB3处:
00433C9C |> \6A 00 push 0 ; /Arg1 = 00000000; Case 89A of switch 0043382F
00433C9E |. E8 35DEFFFF call _Animate ; \_Animate
00433CA3 |. 59 pop ecx
00433CA4 |. 833D 5C5A4D00>cmp dword ptr [4D5A5C], 3
00433CAB |. 0F85 61050000 jnz 00434212
00433CB1 |. 6A 01 push 1 ; /Arg1 = 00000001
00433CB3 |. E8 D8050000 call _Suspendprocess ; \_Suspendprocess
在00433CB3 中按F7进入,即来到_Runsinglethread
00434290 >/$ 55 push ebp
00434291 |. 8BEC mov ebp, esp
00434293 |. 83C4 F8 add esp, -8
00434296 |. 53 push ebx
00434297 |. 56 push esi
00434298 |. 57 push edi
00434299 |. BB FC564D00 mov ebx, 004D56FC
0043429E |. 6A 00 push 0 ; /Arg1 = 00000000
004342A0 |. E8 E3440400 call _Runsinglethread ; \_Runsinglethread
004342A5 |. 59 pop ecx
哎,其实现在想起来,也挺简单的啊
头有点晕了,休息下先