HOOK实现游戏无敌-直接修改客户端-2-使用VS来处理
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<Windows.h>
#include<iostream>
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实现游戏无敌-直接修改客户端-2-使用VS来处理的更多相关文章
- 昆仑游戏[JS加密修改]
昆仑游戏:http://www.kunlun.com/index.html JS加密修改 BigTools=window.BigTools;//重点 RSAKeyPair=window.RSAKeyP ...
- UWP游戏防内存修改器的方法
最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性.于是我把自己见过的三种反修改器的方法给网友们介绍一下. 首先说明一 ...
- oracle 中文乱码---查看和修改客户端字符集
客户端NLS_LANG的设置方法 Windows: # 常用中文字符集set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK # 常用unicode字符集 set ...
- 一个3D的多人在线游戏, 服务端 + 客户端 【转】
最近学院组织了一个实训,要求是利用Socket通信和D3D的知识, 写一个多人在线的游戏, 服务端是在linux下, 客户是在Windows下: 写这个的目的是想让大家给我找错, 欢迎大家的意见.我的 ...
- 修改客户端Webbrowser对应IE版本步骤
制作注册表文件的过程 1,” HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\MAIN\ FeatureControl\FEATURE_B ...
- HDU - 1698 Just a Hook (线段树区间修改)
https://cn.vjudge.net/problem/HDU-1698 题意 大小为n的数组,数组元素初始值为1,有q次操作,x,y,z表示从第x到第y所有的元素的值变为z,最后问1到n的和. ...
- Just a Hook:线段树+区间修改
E - Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most ...
- hdu 1698 Just a Hook(线段树区间修改)
传送门:Just a Hook Problem Description In the game of DotA, Pudge’s meat hook is actually the most horr ...
- 题解报告:hdu 1698 Just a Hook(线段树区间修改+lazy懒标记的运用)
Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for m ...
随机推荐
- 新三板 & 挂牌费用
新三板 & 挂牌费用 关于拟申请公司股票在全国中小企业股份转让系统终止挂牌的提示性公告 https://pilu.tianyancha.com/announcement/ef51e981910 ...
- copyright@xgqfrms
copyright@xgqfrms copyright & seo ## refs *** <div> <a href="https://info.flagcoun ...
- Renice INC:不同颜色的酒帽所代表的意义
酒帽就是酒瓶上方的热缩胶帽/锡帽/蜡封,也就是开瓶前要割掉的那一层保护物,所有的法国酒在酒帽上,都会有一个圆形贴纸,除了有不同颜色外,上面还有一串号码,有可能很多人在喝酒时都不会对这个酒帽有更多的在意 ...
- 教你吃透CSS的盒子模型(Box Model)
CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封装周围的H ...
- java中this和super的用法及区别
this 用法1:代表当前对象本身 用法2:方法形参和类成员变量重名,用this进行区别 class demo{ private int age = 10; public int getAge(int ...
- 创建时间和更新时间两个选一个的情况和select case when ... then ... else ... end from 表 的使用
1.查询时间,如果更新时间update_time为空就查创建时间create_time,否则查更新时间update_time select update_time,create_time, case ...
- Mysql通过binlog恢复误update的数据
事件: 在生产库执行update时只添加了STATUS(状态)条件,将所有状态为'E'的数据全部改为了'D' 思路: 操作步骤主要参考自文章:https://blog.csdn.net/weixin_ ...
- docker仓库之harbor高可用 (三)
基于上一篇部署完成了企业级仓库harbor的部署,今天我们来聊聊什么是harbor的高可用 Harbor 支持基于策略的 Docker 镜像复制功能,这类似于 MySQL 的主从同步,其可以实现不同的 ...
- 【python3.x】发送自动化测试报告邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.python的smtplib提供了 ...
- Mac忘记密码
1.启动电脑的时候,按住 Command+R,直到苹果的图标出现,松开,等待进入... 2.直接点击菜单栏上有个功能里面有 "终端" 功能,点击打开. 3.在终端页面里输入---& ...