当前位置: 代码迷 >> 汇编语言 >> 没法理解参数压栈地址
  详细解决方案

没法理解参数压栈地址

热度:153   发布时间:2016-05-02 04:28:49.0
无法理解参数压栈地址
之前学过一点汇编,今天心血来潮看了一下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 开始了,你上面的图中数据显示都不够,还在前面。
  相关解决方案