一道逆向的课后作业题
作业要求
附件中的 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 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。