zoukankan      html  css  js  c++  java
  • 零基础逆向工程29_Win32_03_ESP寻址_定位回调函数_子窗口_消息处理函数

    1 Win32应用程序入口识别

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

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

    2 ESP寻址的特点

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

    3 窗口回调函数的定位

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

    4 具体事件的处理的定位

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

    5 按钮是什么

    按钮的本质是窗口

    void CreateButton(HWND hwnd)
    {
    	HWND hwndPushButton;
    	HWND hwndCheckBox;
    	HWND hwndRadio;
    
    	hwndPushButton = CreateWindow (
    		TEXT("button"),
    		TEXT("普通按钮"),
    		//WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,
    		WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_DEFPUSHBUTTON,
    		10, 10,
    		80, 20,
    		hwnd,
    		(HMENU)1001,		//子窗口ID
    		hAppInstance,
    		NULL);
    
    	hwndCheckBox = CreateWindow (
    		TEXT("button"),
    		TEXT("复选框"),
    		//WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_AUTOCHECKBOX,
    		WS_CHILD | WS_VISIBLE | BS_CHECKBOX |BS_AUTOCHECKBOX ,
    		10, 40,
    		80, 20,
    		hwnd,
    		(HMENU)1002,		//子窗口ID
    		hAppInstance,
    		NULL);
    
    	hwndRadio = CreateWindow (
    		TEXT("button"),
    		TEXT("单选按钮"),
    		//WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON | BS_AUTORADIOBUTTON,
    		WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON  ,
    		10, 70,
    		80, 20,
    		hwnd,
    		(HMENU)1003,		//子窗口ID
    		hAppInstance,
    		NULL);
    }
    

    6 按钮事件的处理

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

    7 消息堆栈

    7.1 回调函数的结构

    LRESULT CALLBACK WindowProc(  	
    	IN  HWND hwnd,  
    	IN  UINT uMsg,  
    	IN  WPARAM wParam,  
    	IN  LPARAM lParam  
    	);  
    
    

    7.2 回调函数的堆栈

    8 按钮事件处理逻辑定位

    在OD中设置条件断点
    [ESP+8]==WM_COMMAND && [ESP+0xC]==0x3EB
    
  • 相关阅读:
    hdu 2141 二分搜索
    什么是你的核心竞争力之一?
    Ubuntu系统开机后显示器提示“不能显示此视频模式,请将电脑显示输入设置为1920×1080@60Hz”
    [置顶] java高级工程师struts的内部运行机制详解
    一步步理解Linux进程(3)内核中进程的实现
    2013年4月19日佳都新太笔试题+解答
    Android 通过Service单独进程模仿离线推送 Server Push
    缓存研究
    解决MDK4以上版本没法对STM32软件仿真
    windows调试器之Visual C++
  • 原文地址:https://www.cnblogs.com/flatcc/p/7694208.html
Copyright © 2011-2022 走看看