一道逆向的课后作业题
作业要求
附件中的 ReverseTraining_1.exe 程序是一个简单的窗口程序。在按下键盘上的按键后会弹出消息框。如果按到不正确的按键,便会弹出一个 error code 错误窗口

只有3个特定的按键按下后可以弹出预期的正确窗口

需要通过OD找到这3个特定的按键分别是什么。
1.找窗口的消息回调函数
- 为了找到特定的三个按键,我们首先要找到该窗口的回调函数。拖入OD后首先要寻找
RegisterClass(注册窗口类函数)。在MSDN中可以知道RegisterClass函数的参数只有一个,且是一个指向一个WNDCLASS结构体的指针

而 WNDCLASS 结构中的 WNDPROC lpfnWndProc 元素便是一个 指向回调函数的指针 。
-
在程序入口点往下翻一点,成功找到调用
RegisterClass函数的地方。可以看到在调用函数之前有一条PUSH EAX语句。可判断其为 将参数压栈 的操作,即PUSH EAX执行后 EAX 中存储的便是指向我们要找的WNDCLASS结构体的指针。于是右键Follow in stack跟进去查看这块地址里面存储的东西。
-
在堆栈窗口中找到这块内存地址后要选择
lock stack将堆栈窗口固定在这个视图
-
因为从MSDN中可以知道这个结构的第二个元素
WNDPROC lpfnWndProc中存储的便是该窗口的回调函数的地址,所以到此我们已经找到了回调函数,即为004010F0地址中的函数。右键选择follow in disassmbler跳转到这个函数的位置。
-
跳转进去之后先
F2下一个断点。本阶段结束
2.通过条件断点找到键盘按下后触发的事件
-
由于消息是不断产生的,我们必须将普通的断点换成条件断点。因此我们将断点的条件设置为
[esp+8]==WM_KEYDOWN,在产生 键盘按下 消息的时候断下来。
断下来之后往后翻一下,便可以找到不会弹出
error code的三个特定的按键,为0x67,0x46,0x41,对应大写的F、A和小键盘上的7。本题结束。(不知道为什么在本机按小键盘上的7的时候并不会弹出103,只有在虚拟机中才能成功。)
- 原文作者:小钟
- 原文链接:https://smallzhong.github.io/post/%E4%B8%80%E9%81%93%E9%80%86%E5%90%91%E7%9A%84%E8%AF%BE%E5%90%8E%E4%BD%9C%E4%B8%9A%E9%A2%98/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。