游戏外挂--外挂窗口编写

窗口实现方式

1 编写MFC.exe程序,所有外挂功能都通过VirtualAllocEx WriteProcesMemory 写入到目标进程

2 编写MFCdll注入到游戏进程,MFCdll也就是带界面的动态链接库,可以理解为MFC和DLL的结合体

为什么要使用dll注入?

每一个功能读需要VirtualAllocEx的方式申请内存,并且将代码写入到目标进程,对资源造成极大的浪费,而且代码不容易管理。DLL注入的方式就简单的多,因为模块本身就运行在游戏进程当中了,对游戏的数据读写很方便,关闭外挂后的清理工作也很方便

注入dll方式:

1 SetWindowsHookEx

通过HOOK的形式

2 OpenProcess()、CreateRemoteThread()

通过给进程创建线程的方式来处理

通过写MFCDLL来实现游戏辅助

MFCDLL是专门用来写图形化DLL的,相当于dll+mfc,流程的话和写MFC差不多,只是生成的是dll文件

写DLL注入来吧MFCDLL注入进去

#include<Windows.h>
#include<iostream>
using namespace std;

int main()
{
HWND hWnd = FindWindowA(NULL,"Sword2 Window");
if (hWnd == NULL)
{
MessageBoxA(NULL, "没有找到游戏窗口", "报错",MB_OK);
return 0;
}
DWORD pid;
GetWindowThreadProcessId(hWnd,&pid);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcess == NULL)
{
MessageBoxA(NULL, "没有找到游戏进程", "报错", MB_OK);
return 0;
}
CHAR lpBuff[200] = "xxxx ";
CHAR* HappenAddr;
HappenAddr = (char*)VirtualAllocEx(hProcess, 0, 200, MEM_COMMIT, PAGE_READWRITE);//给缓冲区申请进程的虚拟内存
if (HappenAddr == NULL)
{
MessageBoxA(NULL, "申请内存失败", "报错", MB_OK);
return 0;
}
DWORD RealWrite = 0;
WriteProcessMemory(hProcess, HappenAddr, lpBuff, 200, &RealWrite);
HANDLE retCT = CreateRemoteThread(hProcess, NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibraryA,HappenAddr, NULL, NULL);
if (retCT == NULL)
{
MessageBoxA(NULL, "创建线程失败", "报错", MB_OK);
return 0;
}
WaitForSingleObject(retCT, -1);
//最后进行资源的释放
VirtualFreeEx(hProcess, HappenAddr, 0, MEM_RELEASE);
CloseHandle(hProcess);
CloseHandle(retCT);
return 0;
}