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

大概流程

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

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

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

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

打开游戏进程

1 直接通过进程ID

2 通过窗口名来找到进程

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

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

FindWindow

  1. HWND FindWindowA(
    LPCSTR lpClassName,
    LPCSTR lpWindowName
    );

参数

第一个参数表示类名

第二个参数表示窗口名

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

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

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

返回值

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

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

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

GetWindowThreadProcessId

  1. DWORD GetWindowThreadProcessId(
    HWND   hWnd,
    LPDWORD lpdwProcessId
    );

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

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

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

OpenProcess

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

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

第二个参数 其实没啥用

第三个参数是进程的ID

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

2 申请内存保存硬编码

VirtualAllocEx

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

第一个参数是进程的句柄

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

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

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

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

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

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

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

virtualProtectEx

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

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

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

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

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

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

WriteProcessMemory

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

给进程的内存写内容

第一个参数表示进程句柄

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

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

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

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

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

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

总结

1 首先拿到进程的ID

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

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

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

需要注意的是一些偏移

完整代码

  1. //利用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来处理的更多相关文章

  1. 昆仑游戏[JS加密修改]

    昆仑游戏:http://www.kunlun.com/index.html JS加密修改 BigTools=window.BigTools;//重点 RSAKeyPair=window.RSAKeyP ...

  2. UWP游戏防内存修改器的方法

    最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性.于是我把自己见过的三种反修改器的方法给网友们介绍一下. 首先说明一 ...

  3. oracle 中文乱码---查看和修改客户端字符集

    客户端NLS_LANG的设置方法 Windows: # 常用中文字符集set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK # 常用unicode字符集 set ...

  4. 一个3D的多人在线游戏, 服务端 + 客户端 【转】

    最近学院组织了一个实训,要求是利用Socket通信和D3D的知识, 写一个多人在线的游戏, 服务端是在linux下, 客户是在Windows下: 写这个的目的是想让大家给我找错, 欢迎大家的意见.我的 ...

  5. 修改客户端Webbrowser对应IE版本步骤

    制作注册表文件的过程 1,” HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\MAIN\ FeatureControl\FEATURE_B ...

  6. HDU - 1698 Just a Hook (线段树区间修改)

    https://cn.vjudge.net/problem/HDU-1698 题意 大小为n的数组,数组元素初始值为1,有q次操作,x,y,z表示从第x到第y所有的元素的值变为z,最后问1到n的和. ...

  7. Just a Hook:线段树+区间修改

    E - Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most ...

  8. hdu 1698 Just a Hook(线段树区间修改)

    传送门:Just a Hook Problem Description In the game of DotA, Pudge’s meat hook is actually the most horr ...

  9. 题解报告: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 ...

随机推荐

  1. 图解 git stash

    图解 git stash # 暂存本地 变化 $ git stash # 复原 $ git stash pop The "git stash" command can help y ...

  2. Flutter 避免阻塞ui线程

    import 'dart:async'; import 'dart:isolate'; import 'package:flutter/material.dart'; import 'package: ...

  3. CSS 阴影效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 「NGK每日快讯」12.14日NGK公链第41期官方快讯!

  5. JavaScript高级-类的使用

    1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 1.2面向对象 面向对象是把事务分解成为一个 ...

  6. 算法图解:Python笔记代码

    二分查找 选择排序 递归 快速排序 广度优先搜索 狄克斯特拉算法 贪婪算法 二分查找 def binary_search(lst,item): low = 0 high = len(lst)-1 wh ...

  7. 高性能环形队列框架 Disruptor 核心概念

    高性能环形队列框架 Disruptor Disruptor 是英国外汇交易公司LMAX开发的一款高吞吐低延迟内存队列框架,其充分考虑了底层CPU等运行模式来进行数据结构设计 (mechanical s ...

  8. 关于string【】 数组 进行 toString() 之后无法将数组的内容连接起来组合成 string 字符串 的问题

    string[] to string 如果直接对一个string[] 数组进行 tostring()的操作,得到的值都是 system.string[] 如果想要将 string[] 数组内容转换为一 ...

  9. 前端与后端之间参数的传递与接收和@RequestBody,@Requestparam,@Param三个注解的使用

    参数在前台通过对象的形式传递到后台,在后台,可以用@RequestBody注解通过Map或JSONObject接收(太麻烦,既要从Map中取值,取完值后又要封装到Map),也可以用@RequestPa ...

  10. vue中将分号去掉,将双引号变为单引号的配置

    在项目根目录下创建.prettierrc文件,文件内容如下: { "semi": false, "singleQuote": true } 实现vs code中 ...