前言
本文章所逆向的Win32程序:https://files.cnblogs.com/files/02SWD/ReverseTraining_1.rar?t=1663236309
该程序是经 release版本 进行编译的。
打开该程序之后,使用 鼠标左键 点击窗口,会弹出标题和内容均为 1 的窗口;使用 鼠标右键 点击窗口,会弹出标题和内容均为 2 的窗口。
打开该程序之后,选中窗口,当我们按下正确的键盘按键时,会弹出该按键的键盘码,否则便会弹出Error窗口。正确的键盘码有3个。下图以其中一个按键“A”为例,请找出剩余的2个(当然你要是一个个试那就没意思了)
先将待逆向程序拖入OD,此时要注意:
首先我们要清楚 WinMain()函数的必要特点:
这就意味着,hInstance参数是最后一个被压栈的,即 在call WinMain指令位置的上方一定会有一个instance参数的压栈。
并且 由于WinMain()函数的参数有4个,那么在 内平栈 时,应该使用指令:retn 0x10。
定位过程如下图:
该函数比较好定位:当我们进入WinMain函数后,向下寻找,根据OD给我们提供的注释,可以轻松的找到:WinMain函数 在0x401055位置处执行了call指令,调用了RegisterClass()函数
在步骤3我们成功定位了WinMain函数调用RegisterClass函数的位置,由此我们便可以轻松的找到 RegisterClass函数的参数:
0x401050位置处的指令 便为RegisterClass()函数的 传参指令,而 eax寄存器 中存储的便是 WNDCLASS结构体的地址。
由步骤3我们已经知道 WNDCLASS结构体的数据。根据该结构体的定义,我们可以得知 WNDCLASS结构体的第二个属性 存储的便是 “窗口回调函数”的函数地址,跟进该地址,我们便可以找到回调函数的代码。(WNDCLASS结构体的定义可以通过MSDN查询得知)
定位程序对于鼠标左键的处理代码,过程如下图:
定位程序对于鼠标右键的处理代码,过程如下图:
分析过程如下图:
对于回调函数WindowProc的参数做一个简单说明,详情可在MSDN中查询:
LRESULT CALLBACK WindowProc(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
){...}
对于 0x4010F0位置处 的汇编指令:mov eax,dword ptr ss:[esp+0x8],ss:[esp+0x8]中存储的是什么?或者说它指的是什么?
对于 0x401120位置处 的汇编指令:mov eax,dword ptr ss:[esp+0x30],ss:[esp+0x30]中存储的是什么?或者说它指的是什么?
答:首先我们要知道,本次分析的程序是 release版 的,也就是说此时 对于参数和局部变量 所采用的 寻址方式 不再是 ebp寻址,而是 __esp寻址__了。相比于ebp寻址,esp寻址分析起来会比较的麻烦,因为 esp的值是会不断发生变化的。
0x4010F0位置处的汇编指令:mov eax,dword ptr ss:[esp+0x8] 汇编指令分析
0x401120位置处的汇编指令:mov eax,dword ptr ss:[esp+0x30]汇编指令分析
手机扫一扫
移动阅读更方便
你可能感兴趣的文章