一、相关API介绍
WindowProc 是 Windows 应用程序编程接口(API)中一个非常重要的回调函数,用于处理由操作系统发送给窗口的各种消息。它的全名通常是 Window Procedure,简称为 WndProc,是所有窗口消息的核心处理函数。定义如下:
LRESULT CALLBACK WindowProc(
HWND hwnd, // 指向窗口的句柄。
UINT uMsg, //指定消息类型。
WPARAM wParam, // 指定其余的、消息特定的信息。该参数的内容与UMsg参数值有关。
LPARAM lParam //指定其余的、消息特定的信息。该参数的内容与uMsg参数值有关。
)
二、直接上手
首先用OD进行调试选中查看-->窗口
跳转到这个界面后找到消息处理函数
然后右击选中跟随ClassProc
跳转到消息处理函数后,找到第二个参数(ebp+0xc)
然后在第二个参数下一行选中断点-->条件
对当行下一个WM_COMMAND的消息断点,然后运行对菜单栏进行操作看是否断下了
断下了后找到堆栈窗口左击在右击选中转到EBP
然后找到消息处理函数四个参数的值
代码实现:
HWND hwnd = ::FindWindow(NULL,_T("扫雷")); //寻找进程句柄
::SendMessage(hwnd,WM_COMMAND,0x209,0); //向进程发送消息
通过cheatengine.exe软件不断的通过首地址的改变与不改变不断的判断来找出基址
找出基址后就选中地址右击找到"Browse this memory region"左击
跳转到了内存处,然后在通过多次实验查看基址是否找对,如果基址对头就可以查看当是点击到雷时内存的变化
通过Spy++软件查找到窗口后
对消息下断
点击开始
然后就能得到消息类型与点击的坐标,在扫雷中就可以找到第一个位置与最后一个位置的坐标就可以得到每个位置的坐标
辅助器:
DWORD pid;
HWND hwnd = ::FindWindow(NULL,_T("扫雷")); //获取窗口句柄
GetWindowThreadProcessId(hwnd,&pid); //通过窗口句柄获取进程ID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); //通过进程ID获取进程句柄
//通过for循环逐个去遍历
for (int i =0;i < dwLine;++i)
{
for (int j = 0;j < 32;++j)
{
if (0x10 == gamedata[i][j])
{
break;
}
//第一个位置的坐标
xypos2[0] = gamex + j*20;//
xypos2[1] = gamey + i*20;
if ((char)0x8F != (char)gamedata[i][j])
{
//向窗口发送消息
::PostMessage(hwnd, WM_LBUTTONDOWN,MK_LBUTTON,*(int *)(xypos2));
::PostMessage(hwnd, WM_LBUTTONUP,0,*(int *)(xypos2));
}
}
}
//刷新
UpdateData(FALSE);