在逆向分析Win32软件时,需要找到窗口过程函数,这样可以方便的找到目标应用程序段。以一个简单的win32程序为例,如下图所示:
X32dbg附加程序,点击添加文件,弹出对话框,如下图所示:
然后在X32dbg中暂停,选择追踪->步进直到条件满足,输入应用程序所在的代码段范围(EIP > 04000000 && EIP <04005000),如下图所示:
然后暂停在目标区域,但是有时会暂停不下,暂时不知道什么原因,多试几次。如下图所示:
然后查看调用堆栈,如下图所示:
逆向分析,添加文件应该是一个WM_COMMAND消息,它来自于窗口的消息函数调用,所以在调用堆栈下面应该有一个就是消息函数。消息函数原型如下所示:
LRESULT CALLBACK WindowProc(HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
所以调用之前,应该是在栈里压入了4个参数,逐步点击分析,如下所在位置就是MFC的窗口过程函数。如下图所示:
怀疑mfc42u.ordinal#1571这个函数就是窗口过程函数,这时需要验证猜想,这时在这个函数开始位置下断点,然后查看参数值,如下图所示:
这时需要介绍下基础知识,在刚进入函数的时候,栈顶指针esp指向的是返回地址,esp+4指向第一个参数的地址(从左向右,右边先入栈),依次类推。这时可以开始spy++来查看第一参数是不是有效的窗口句柄。结果是主窗口的句柄。然后再进行其它测试,确定就是窗口函数。
接下来针对窗口过程函数,就需要介绍条件断点。
基础知识,一个[]去地址内容,可以嵌套 && || ==等逻辑操作,数值是16进制。
[[esp+4]]==110F3A && [[esp+4]+4]==0x0110
[[esp+4]]==110F3A && [[esp+4]+4]==0x0111
APP代码区域返回
EIP > 00400000 && EIP <00405000
在Win32逆向分析中,需要频繁的查看窗口句柄,可以查看句柄窗口中的句柄列表,如下图所示:
如有疑问,敬请留言。