64,646
社区成员
发帖
与我相关
我的任务
分享
#pragma once
#include <windows.h>
#ifndef __DLL__
#define __DLL__ _declspec(dllimport)
#endif
void __DLL__ SetHook(DWORD dwThreadId);
#define __DLL__ _declspec(dllexport)
#include "hook.h"
HHOOK g_hook = NULL;
LRESULT CALLBACK MouseProc( int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
DWORD addr = (DWORD)GetModuleHandle(TEXT("minesweeper.exe"));//得到首地址
addr+=0xA8480;
addr = *((int*)addr);
addr+=0xaaa38;
addr = *((int*)addr);
DWORD addr1=addr+0x114;//难度,1是简单,2是中级,3是高级,4是自定义
DWORD addr2=addr+0x118;//自定义模式下 横向格子数
DWORD addr3=addr+0x11c;//自定义模式下 纵向格子数
DWORD addr4=addr+0x120;//自定义模式下 总雷数
addr1 = *((int*)addr1);
addr2 = *((int*)addr2);
addr3 = *((int*)addr3);
addr4 = *((int*)addr4);
addr+=0x18;
addr = *((int*)addr);
addr+=0x18;
addr = *((int*)addr);//已打开的格子数的地址,这是WIN7下扫雷判断胜利的条件,当值等于总格子数-总雷数时,游戏胜利
switch (*((int*)addr1))
{
case 1:
*((int*)addr)=71;
break;
case 2:
*((int*)addr) = 216;
break;
case 3:
*((int*)addr)=381;
break;
case 4:
*((int*)addr)=(*((int*)addr2))*(*((int*)addr3))-(*((int*)addr4));//自定义下,横向格子数*纵向格子数-总雷数
break;
}
return CallNextHookEx(g_hook, nCode, wParam, lParam);//传递消息到下一钩子,如无,则传递给窗口过程
}
void SetHook( DWORD dwThreadId )
{
g_hook = SetWindowsHookEx(WH_MOUSE, MouseProc,GetModuleHandle(TEXT("hook.dll")), dwThreadId);//安装钩子
}
#include <stdio.h>
#include "../hook/hook.h"
#pragma comment(lib,"../hook/hook.lib")
int main()
{
HWND hwnd=0;
int x;
while (!hwnd)
{
hwnd=FindWindow(TEXT("Minesweeper"),TEXT("扫雷"));
Sleep(500);
}
DWORD ThID=GetWindowThreadProcessId(hwnd,(LPDWORD)&x);
SetHook(ThID);
while(1)
{
Sleep(50000);
}
}