当前位置:   article > 正文

零基础逆向工程29_Win32_03_ESP寻址_定位回调函数_子窗口_消息处理函数

esp寻址 游戏逆向

1 Win32应用程序入口识别

思路:根据WinMain的四个参数,由调用顺序,知道最后压栈的是hInstance句柄(也就是WinMain函数的第一个参数,其值等于ImageBase),根据反汇编,则判断压栈参数是GetModuleHandle函数的返回值,即可找到Win32应用入口。

  1. 004011AC |> \50 push eax
  2. 004011AD |. FF75 9C push [local.25]
  3. 004011B0 |. 56 push esi
  4. 004011B1 |. 56 push esi ; /pModule
  5. 004011B2 |. FF15 18504000 call dword ptr ds:[<&KERNEL32.GetModuleH> ; \GetModuleHandleA
  6. 004011B8 |. 50 push eax
  7. 004011B9 |. E8 12FFFFFF call Win32_Re.004010D0 ;即:这是Win32程序入口

2 ESP寻址的特点

程序入口处,esp+4一般是函数的第一个参数。
ESP寻址会受到push和pop的影响。

3 窗口回调函数的定位

思路:根据RegisterClass()函数的参数,找到WNDCLASS结构体的lpfnWndProc参数,从而找到了回调函数WindowProc。

4 具体事件的处理的定位

思路:在OD的设置断点中,右键设置条件断点,可根据相应的条件断下来。

5 按钮是什么

按钮的本质是窗口

  1. void CreateButton(HWND hwnd)
  2. {
  3. HWND hwndPushButton;
  4. HWND hwndCheckBox;
  5. HWND hwndRadio;
  6. hwndPushButton = CreateWindow (
  7. TEXT("button"),
  8. TEXT("普通按钮"),
  9. //WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,
  10. WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,
  11. 10, 10,
  12. 80, 20,
  13. hwnd,
  14. (HMENU)1001, //子窗口ID
  15. hAppInstance,
  16. NULL);
  17. hwndCheckBox = CreateWindow (
  18. TEXT("button"),
  19. TEXT("复选框"),
  20. //WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_AUTOCHECKBOX,
  21. WS_CHILD | WS_VISIBLE | BS_CHECKBOX |BS_AUTOCHECKBOX ,
  22. 10, 40,
  23. 80, 20,
  24. hwnd,
  25. (HMENU)1002, //子窗口ID
  26. hAppInstance,
  27. NULL);
  28. hwndRadio = CreateWindow (
  29. TEXT("button"),
  30. TEXT("单选按钮"),
  31. //WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON | BS_AUTORADIOBUTTON,
  32. WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON ,
  33. 10, 70,
  34. 80, 20,
  35. hwnd,
  36. (HMENU)1003, //子窗口ID
  37. hAppInstance,
  38. NULL);
  39. }

6 按钮事件的处理

  1. 1、按钮是一种特殊的窗体,并不需要提供单独的窗口回调函数.
  2. 2、当按钮有事件产生时,会给父窗口消息处理程序发送一个WM_COMMAND消息
  3. 按钮--------------->系统提供WinProc---------------------->父窗口的WinProc
  4. 单击按钮 转换WM_COMMAND
  5. //代码:
  6. case WM_COMMAND:
  7. {
  8. switch(LOWORD(wParam))
  9. {
  10. case 1001:
  11. MessageBox(hwnd,"Hello Button 1","Demo",MB_OK);
  12. return 0;
  13. case 1002:
  14. MessageBox(hwnd,"Hello Button 2","Demo",MB_OK);
  15. return 0;
  16. case 1003:
  17. MessageBox(hwnd,"Hello Button 3","Demo",MB_OK);
  18. return 0;
  19. }
  20. return DefWindowProc(hwnd,uMsg,wParam,lParam);
  21. }

7 消息堆栈

7.1 回调函数的结构

  1. LRESULT CALLBACK WindowProc(
  2. IN HWND hwnd,
  3. IN UINT uMsg,
  4. IN WPARAM wParam,
  5. IN LPARAM lParam
  6. );

7.2 回调函数的堆栈

1135275-20171019185645396-319544639.png

8 按钮事件处理逻辑定位

  1. 在OD中设置条件断点
  2. [ESP+8]==WM_COMMAND && [ESP+0xC]==0x3EB

转载于:https://www.cnblogs.com/flatcc/p/7694208.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/875969
推荐阅读
相关标签
  

闽ICP备14008679号