附件:ReverseTraining_1.exe

作业要求

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

image-20200724224627483

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

image-20200724224722790

需要通过OD找到这3个特定的按键分别是什么。

1.找窗口的消息回调函数

  • 为了找到特定的三个按键,我们首先要找到该窗口的回调函数。拖入OD后首先要寻找 RegisterClass (注册窗口类函数)。在MSDN中可以知道 RegisterClass 函数的参数只有一个,且是一个指向一个 WNDCLASS 结构体的指针

image-20200724220725672

WNDCLASS 结构中的 WNDPROC lpfnWndProc 元素便是一个 指向回调函数的指针

  • 在程序入口点往下翻一点,成功找到调用 RegisterClass 函数的地方。可以看到在调用函数之前有一条 PUSH EAX 语句。可判断其为 将参数压栈 的操作,即 PUSH EAX 执行后 EAX 中存储的便是指向我们要找的 WNDCLASS 结构体的指针。于是右键 Follow in stack 跟进去查看这块地址里面存储的东西。

  • 在堆栈窗口中找到这块内存地址后要选择 lock stack 将堆栈窗口固定在这个视图

    image-20200724221717793

  • 因为从MSDN中可以知道这个结构的第二个元素 WNDPROC lpfnWndProc 中存储的便是该窗口的回调函数的地址,所以到此我们已经找到了回调函数,即为 004010F0 地址中的函数。右键选择 follow in disassmbler 跳转到这个函数的位置。

    image-20200724222345602

  • 跳转进去之后先 F2 下一个断点。本阶段结束

    image-20200724222608485

2.通过条件断点找到键盘按下后触发的事件

  • 由于消息是不断产生的,我们必须将普通的断点换成条件断点。因此我们将断点的条件设置为 [esp+8]==WM_KEYDOWN ,在产生 键盘按下 消息的时候断下来。

    image-20200724223716739

    断下来之后往后翻一下,便可以找到不会弹出 error code 的三个特定的按键,为 0x670x460x41 ,对应大写的 F、A 和小键盘上的 7 。本题结束。(不知道为什么在本机按小键盘上的7的时候并不会弹出103,只有在虚拟机中才能成功。)

    image-20200724223642313