HOOK实现游戏无敌-直接修改客户端-2-使用VS来处理
发布日期:2021-05-09 00:17:46 浏览次数:13 分类:博客文章

本文共 3365 字,大约阅读时间需要 11 分钟。

HOOK实现游戏无敌-直接修改客户端-2-使用VS来处理

大概流程

1 首先找到游戏进程,打开进程

2 申请一段内存空间来保存我们的硬编码(virtualAllocEx)

3 找到攻击函数,修改函数的硬编码来跳转

4 在开辟的内存空间中,硬编码实现汇编代码来实现无敌

打开游戏进程

1 直接通过进程ID

2 通过窗口名来找到进程

1 通过窗口名来找到游戏进程

先找到游戏窗口对应的句柄,然后通过句柄来得到进程的ID,然后来打开进程得到进程的句柄

FindWindow

HWND FindWindowA(   LPCSTR lpClassName,   LPCSTR lpWindowName );

参数

第一个参数表示类名

第二个参数表示窗口名

如果要用类名来查找,窗口名就可以直接置为NULL,

如果要用窗口名来查找,类名就可以直接置为NULL,

置为NULL后会查找所有相关的来匹配

返回值

如果成功就返回窗口句柄,失败就返回NULL

 

 

 

 

这个游戏呢,窗口名很明显叫 Sword2 Window

HWND hWnd = FindWindowA(NULL,"Sword2 Window");

GetWindowThreadProcessId

DWORD GetWindowThreadProcessId(   HWND    hWnd,   LPDWORD lpdwProcessId );

第一个参数表示窗口的句柄

第二个参数表示接受进程标识符的变量的指针,

 

返回值是创建窗口的线程的标识符

OpenProcess

HANDLE OpenProcess(   DWORD dwDesiredAccess,   BOOL  bInheritHandle,   DWORD dwProcessId );

第一个参数表示获取的权限

第二个参数 其实没啥用

第三个参数是进程的ID

成功返回进程的句柄,失败返回NULL

 

 

2 申请内存保存硬编码

VirtualAllocEx

LPVOID VirtualAllocEx(   HANDLE hProcess,   LPVOID lpAddress,   SIZE_T dwSize,   DWORD  flAllocationType, DWORD flProtect );

第一个参数是进程的句柄

第二个参数是要分配的地址的起始地址,如果为NULL也就是0就是函数会自己找一个可分配的地址

第三个参数表示要分配的内存的大小

第四个参数表示要分配的内存的状态

第五个参数表示内存的属性

 

返回值:如果成功则返回分配区域的首地址,如果失败就返回NULL

3 找到攻击函数修改,HOOK处理

因为要添加的是一个JUMP,然后还有对齐,会往下面填充nop,所以直接修改前8个字节的内容好了,还需要注意的是内存的属性是否是可修改的,需要注意的是用硬编码的JMP的偏移值是内存地址相减后再-5

virtualProtectEx

BOOL VirtualProtectEx(   HANDLE hProcess,   LPVOID lpAddress,   SIZE_T dwSize,   DWORD  flNewProtect, PDWORD lpflOldProtect );

第一个参数表示进程的句柄

第二个参数表示要修改的内存的首地址

第三个参数表示要修改的内存的大小

第四个参数表示要修改的属性

第五个参数是原来的属性的指针,如果填了值就会保存到该内容里

WriteProcessMemory

BOOL WriteProcessMemory(   HANDLE  hProcess,   LPVOID  lpBaseAddress,   LPCVOID lpBuffer,   SIZE_T  nSize, SIZE_T *lpNumberOfBytesWritten );

给进程的内存写内容

第一个参数表示进程句柄

第二个参数表示要写的内存的首地址

第三个参数表示缓冲区的指针

第四个参数表示要写入的内存大小

第五个参数表示实际内存接受的字节数

给申请的内存空间填写代码逻辑

 

 

直接把对应的硬编码写进去就好

 

总结

1 首先拿到进程的ID

2 然后申请一块内存地址来填写我们的硬编码

3 HOOK要修改的函数的代码逻辑来跳转到我们申请的内存里面

4 修改申请内存的硬编码来实现我们的代码

需要注意的是一些偏移

 

完整代码

//利用vs的C/C++代码来实现HOOK #include
#include
using namespace std; int main() { //1 通过窗口名来打开游戏进程 HWND hWnd = FindWindowA(NULL,"Sword2 Window"); if (hWnd == NULL) { MessageBoxA(NULL,"未找到游戏窗口","打开游戏窗口报错",MB_OK); return 0; } DWORD pid = 0; GetWindowThreadProcessId(hWnd,&pid); if (pid == 0) { MessageBoxA(NULL, "获取进程ID失败", "获取进程ID报错", MB_OK); return 0; } HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); if (hProcess == NULL) { MessageBoxA(NULL, "获取进程句柄失败", "获取进程句柄报错", MB_OK); return 0; } //2 申请内存保存代码 char *HookAddr = (char*)VirtualAllocEx(hProcess,NULL,0x100, MEM_COMMIT,PAGE_EXECUTE_READWRITE); //3 找到攻击函数,hook前八个字节,来跳转到我们自己的代码里面 DWORD AtackFunAddr = 0x41FD40;//函数的首地址 char HookCode[8] = { 0xE9,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//要改变的硬编码 DWORD OffSet = (DWORD)HookAddr - AtackFunAddr - 5;//内存到地址的偏移地址 memcpy(&HookCode[1],&OffSet,4);//拷贝硬编码给HookCode DWORD OldProtect = 0; DWORD RealInputNum = 0; VirtualProtectEx(hProcess,(char*)AtackFunAddr,0x8,PAGE_READWRITE,&OldProtect); WriteProcessMemory(hProcess, (char*)0x41FD40, HookCode, 0x8, &RealInputNum); VirtualProtectEx(hProcess,(char*)AtackFunAddr, 0x8, OldProtect, &OldProtect); //4 在新开辟的空间中写入无敌的函数代码逻辑 char MyCode[] = { 0x56,0x8B,0xF1,0x57,0x81,0x7E,0x04,0x02,0x00,0x00,0x00,0x75,0x08,0xC7,0x44 ,0x24,0x0c,0x00,0x00,0x00,0x00,0xE9,0x00,0x00,0x00,0x00}; DWORD OffSet2 = (0x41FD40 + 8) - (DWORD)HookAddr - 21 - 5;//得到偏移值 memcpy(&MyCode[22], &OffSet2, 4); WriteProcessMemory(hProcess, (char*)HookAddr, MyCode, sizeof(MyCode), &RealInputNum); system("pause"); }

 

上一篇:算法-查找-有序线性查找-折半查找
下一篇:HOOK实现游戏无敌-直接修改客户端

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月13日 07时44分13秒