【新手教程】如何用C语言写游戏修改器!

时间:2024-05-21 07:20:09

本节教大家如何用基础编程语言C语言写简单的游戏修改器。

用到的工具:

1.VC++6.0(上机通常都会用的)

2.CE 5.4(任何版本都行)

3.当然要一款游戏这里我就用我临时写的C语言小游戏来作为实验对象。


教程开始:

首先我们肯定要设计一个界面:

【新手教程】如何用C语言写游戏修改器!

这里我用while循环,方便后面程序执行完指令后不会退出。

在介绍重点部分时,我首先得介绍下涉及的专有名词

句柄、PID

句柄:这个嘛,是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄 。我就引用百度词条的解释。

PID:不管什么程序被运行后都会被操作系统分配一个唯一标识这个程序的ID。如果想看具体每个程序的PID(任务管理器,随便选定一个进程右击,选择转到详细信息,就可以查看了。(这里我是居于win10操作系统下))。


如果实在不理解就把他们当作现实生活中的学生证和身份证,有了这两个就能证明你的身份。程序一样。

介绍完句柄、PID的概念后我们正式开始教程:

先定义个全局变量:

HWND hwnd; //这就是句柄的变量定义

DWORD Pid; //这就是PID的定义

【新手教程】如何用C语言写游戏修改器!

定义完变量后,就要获取要修改的游戏的进程句柄

这里我们用到FindWindow(NULL,“模拟的贪吃蛇游戏”)“”这里面就填写你要获取的窗口(这里我就填写我的游戏窗口名)

当然这个函数是有返回值的

hwndFindWindow(NULL,“模拟的贪吃蛇游戏”)  就用刚刚的句柄变量接收

获取完句柄后其次就是获取PID:

这里PID的获取就利用我们前面获取的窗口句柄获取:

 GetWindowThreadProcessId(hwnd,&Pid);    //形参一:从什么地方获取(句柄),形参二:获取到的PID存放处

【新手教程】如何用C语言写游戏修改器!

前期工作都做完后:

定义个新的类型变量

HANDLE hprocess =0;

这个变量的作用就是接受进程访问的许可

hprocess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);  //PROCESS_ALL_ACCESS意思是获取全部访问权限

讲完前面的现在 我们需要获取要修改的游戏分数存放的地址

地址获取方式就用ce

1.打开游戏进程 如图

2.搜索分数信息,让信息改变,再次搜索

【新手教程】如何用C语言写游戏修改器!

这里我们就找到游戏分数的地址 0x00328400

后面回到我的编程界面定义新的变量

DWORD score;  //要修改的分数
DWORD ADDR =0x00328400;  //游戏分数的地址

令score = 999;

利用函数WriteProcessMemory(hprocess,(LPVOID)ADDR,&score,4,0);将修改后的地址注入到原来的地址中

到处就大功告成!!

最后附上源码:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#define Fail 0
#define Succeed 1

int GetHwnd();
void Fixprocess();
HWND hwnd;
DWORD Pid;
HANDLE hprocess = 0;
void main()
{
 int command;
 int ch;
 while(1)
 {
  system("cls");
  printf("-------------------------\n");
  printf("      1.获取窗口句柄     \n");
  printf("      2.注入指令         \n");
  printf("      3.结束程序         \n");
  printf("-------------------------\n");
  scanf("%d",&command);
  getchar();
  if(command == 3)
  {
   break;
   exit(0);
  }
  else
  {
   switch(command)
   {
     case  1:
    //获取程序的窗口句柄  int GetHwnd()
    ch = GetHwnd();
    if(ch == Succeed)
      printf("打开进程成功,并且成功获取窗口进程!");
    Sleep(2000);
    break;
     case 2:
      //注入指令
      Fixprocess();
    break;
   
   }
  }
 }

}
int GetHwnd()
{
 hwnd = FindWindow(NULL,"模仿的贪吃蛇游戏");
 if(hwnd!=0)
 {
     GetWindowThreadProcessId(hwnd,&Pid);
  hprocess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
  if(hprocess == 0)
  {
   return Fail;
  }
  else
  {
   return Succeed;
  }
 }
 else
 {
      return Fail;
 }
}
void Fixprocess()
{
 //char Add[20];
 DWORD score;
 DWORD ADDR =0x00898730;
 //printf("输入游戏分数的地址:");
 //gets(Add);
 //getchar();
 //ADDR = *Add;
 printf("输入你想要的分数:");
 scanf("%ld",&score);
 DWORD res = WriteProcessMemory(hprocess,(LPVOID)ADDR,&score,4,0);
 if(res == 0)
 {
  printf("指令注入失败!");
 }
 else
 {
  printf("指令注入成功!");
 }


}