之前学过一点汇编,今天心血来潮看了一下user32.dll调用窗口过程函数的汇编,突然就懵了。
76A27590 push ebp
76A27591 mov ebp,esp
76A27593 push esi
76A27594 push edi
76A27595 push ebx
76A27596 push 0DCBAABCDh
76A2759B push esi
76A2759C push dword ptr [ebp+18h] // ebp+18h = 0x006BF164
76A2759F push dword ptr [ebp+14h] // 0x006BF160
76A275A2 push dword ptr [ebp+10h] // 0x006BF15C
76A275A5 push dword ptr [ebp+0Ch] // 0x006BF158
76A275A8 or byte ptr fs:[0FCAh],1
76A275B0 call dword ptr [ebp+8]
上面一段是user32.dll调用窗口过程函数的汇编代码,其中EBP=0x006bf14c
顺序看下来就是
lParam、wParam、message、hWnd参数顺序入栈
76A275A8 那段代码是什么意思?
然后调用窗口过程函数
这原本也没什么,但我看了一下内存数据后就不明白了
0x006BF150 76a277b8
0x006BF154 009a1170 // 此处是hWnd值
0x006BF158 00330604
0x006BF15C 00000094
0x006BF160 00000000
0x006BF164 006bf278
实际上0x006BF154处才是窗口过程函数的第一个参数hWnd的值,而上面的汇编代码却把地址0x006BF158的值入栈,而且每个入栈参数地址都+4,这里我就不明白了,忘谁能指导一下。
------解决思路----------------------
还是你看错了吧,第一图里你所表示的 hWnd实际值 00D41170,这个不是 hWnd 啊,是窗口回调函数的入口地址哎,你看第三图的起始地址是什么(就是那个 LRESULT CALLBACKWndProc(... 下面的那行标示的地址。该图下半部分的局部变量解释是错误的,或者说是暂时错误,运行过前面的几个函数入口框架指令后应该就对了;这个软件看来有 bug。
------解决思路----------------------
栈里的参数,汇编状态下刚进入函数要从 esp 处看吧,依次是返回地址,hWnd, uMsg,wParam,lParam;从上面的第一图将要压栈参数时 esp=003CF538,那作为参数在栈里,就是从 003CF528 开始了,你上面的图中数据显示都不够,还在前面。