第四例:修改游戏内存

当然这个在书上已经有了很多的解释,今天也太晚了,所以不再赘述,直接贴代码了。

我的和书上的是不大一样的,这个是你可以输入你想要修改的程序名称,之后查找值,最后修改。

如下:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<windows.h>
  5 #include<tlhelp32.h>
  6
  7 //预定义区
  8 #define ONEPAGE 4096
  9 #define ONEGB 1024*1024*1024
 10
 11 //全局定义区
 12 HANDLE g_hProcess;
 13 DWORD g_arList[1024];
 14 DWORD g_nList;
 15 bool FindFirst(DWORD dwValue);
 16 bool FindNext(DWORD dwValue);
 17
 18 //一般函数区
 19 bool CompareAPage(DWORD dwAddrBase,DWORD dwValue)
 20 {
 21     BYTE arList[4096];
 22     bool bRet = false;
 23     if(g_hProcess == NULL)
 24     {
 25         return bRet;
 26     }
 27     if( !::ReadProcessMemory(g_hProcess,(LPCVOID)dwAddrBase,arList,4096,NULL) )
 28         return bRet;
 29     for(int i = 0;i<ONEPAGE-3;i++)
 30     {
 31         int temp = *((int*)(arList+i));
 32         if( temp == dwValue )
 33         {
 34             g_arList[g_nList++] = (DWORD)(dwAddrBase+i);
 35             bRet = true;
 36         }
 37     }
 38     return bRet;
 39 }
 40 bool FindFirst(DWORD dwValue)
 41 {
 42     const DWORD OnePage = 4*1024;
 43     const DWORD OneGb = 1024*1024*1024;
 44     OSVERSIONINFO vi = {sizeof(vi)};
 45     bool bRet = false;
 46     ::GetVersionEx(&vi);
 47     for(
 48         DWORD dwBase = (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS?4*1024*1024:64*1024);
 49         dwBase<2*OneGb;
 50         dwBase += OnePage
 51         )
 52         {
 53             if(CompareAPage(dwBase,dwValue))
 54             {
 55                 bRet = true;
 56             }
 57         }
 58
 59         return bRet;
 60 }
 61 bool FindNext(DWORD dwValue)
 62 {
 63     DWORD m_nList = g_nList;
 64     g_nList = 0;
 65     bool bRet = false;
 66     DWORD dwTemp;
 67     for(int i = 0;i<m_nList;i++)
 68     {
 69         if(::ReadProcessMemory(g_hProcess,(LPCVOID)g_arList[i],&dwTemp,sizeof(dwTemp),NULL))
 70         {
 71             if(dwTemp == dwValue)
 72             {
 73                 g_arList[g_nList++] = g_arList[i];
 74                 bRet = true;
 75             }
 76         }
 77     }
 78
 79     return bRet;
 80 }
 81 void ShowList()
 82 {
 83     for(int i = 0;i<g_nList;i++)
 84     {
 85         printf("%08X\n",g_arList[i]);
 86     }
 87 }
 88 bool WriteMemory(LPVOID lpvAddr,DWORD dwValue)
 89 {
 90     return ::WriteProcessMemory(g_hProcess,lpvAddr,(LPCVOID)&dwValue,sizeof(dwValue),NULL);
 91 }
 92 HANDLE SearchFromName(const char*cName)
 93 {
 94     PROCESSENTRY32 pe32;
 95     pe32.dwSize = sizeof(pe32);
 96     HANDLE hSnapshotProcess = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 97     if(hSnapshotProcess == INVALID_HANDLE_VALUE)
 98     {
 99         return NULL;
100     }
101     bool bMore = ::Process32First(hSnapshotProcess,&pe32);
102     printf("%s\n",pe32.szExeFile);
103     while(bMore)
104     {
105         printf("%s\n",pe32.szExeFile);
106         if(strcmp(pe32.szExeFile,cName) == 0)
107         {
108             return ::OpenProcess(PROCESS_ALL_ACCESS,false,pe32.th32ProcessID);
109         }
110         bMore = ::Process32Next(hSnapshotProcess,&pe32);
111     }
112     return NULL;
113 }
114 int main(int argc,char* argv[])
115 {
116     char szNameExeFile[30];
117     DWORD dwValue;
118     scanf("%s",szNameExeFile);
119     g_hProcess = SearchFromName(szNameExeFile);
120     if(g_hProcess == NULL)
121     {
122         printf("Not useful handle!\n");
123         system("pause");
124         return 0;
125     }
126     scanf("%d",&dwValue);
127     g_nList = 0;
128     FindFirst(dwValue);
129     ShowList();
130     while(g_nList > 2)
131     {
132         scanf("%d",&dwValue);
133         FindNext(dwValue);
134         ShowList();
135     }
136     printf("Success!\nAnd The Value you want to change is:");
137     scanf("%d",&dwValue);
138     WriteMemory((LPVOID)g_arList[0],dwValue);
139     return 0;
140 }

测试程序是这个:

 1 #include<stdio.h>
 2 int g_nNum;
 3 int main(int argc,char* argv[])
 4 {
 5     int i = 198;
 6     g_nNum = 1003;
 7
 8     while(1)
 9     {
10         printf("i = %d,addr = %08X;  g_nNum = %d,addr = %08X\n",++i,&i,--g_nNum,&g_nNum);
11         getchar();
12     }
13     return 0;
14 }
时间: 2024-12-12 20:40:31

第四例:修改游戏内存的相关文章

只需要一点点C++基础,新手也可以制作单机游戏内存修改器

声明:本文只是为了初学C++的,能够做出一些实用的东西,跳出管理系统的束缚,提升学习的兴趣,在这里选取了单机游戏,请不要尝试在线游戏,违发而已未必可行.序:首先我们需要一个Qt+VS环境Qt从http://download.qt.io/archive/中下载,第一个和第三个,在里面选择对应版本.然后就是配环境了,这里提供2013+Qt5.5.1的环境配置,如果环境不同,请自行百度.这点解决问题能力都没有,就别学C++了...我的环境是2013+Qt5.5.1,不同版本可能略有差异,不过大同小异.

如何使用纯 CSS 制作四子连珠游戏

序言:你有没有想过单纯使用 CSS 也可以制作一款游戏?甚至可以双人对决?这是一篇非常有趣的文章,作者详细讲解了使用纯 CSS 制作四子连珠游戏的思路以及使用奇淫巧技解决困难问题的方法.因为案例本身比较复杂,而本人水平有限,翻译必有不恰当之处,望指正. 原文:How the Roman Empire Made Pure CSS Connect 4 Possible 翻译:nzbin 实验是学习新技巧.思考新想法.并突破自身极限的有趣的方式."纯 CSS"演示很早就有了,但是随着浏览器和

Unity游戏内存回收的优化(译)

原文Optimizing garbage collection in Unity games.这里是对这篇文章的粗略翻译,当作自己的笔记. Garbage Collector在这里被翻译成名词GC.对于Garbage Collection这里翻译成动词内存回收. 内存垃圾: 代码中销毁了(disposed)但是GC还没有清理的内存. Unity的托管内存的简单介绍 为了理解GC(本文GC指代Garbage Collector)在内存分配和回收时是怎样工作的,我们必须首先了解Unity的引擎代码和

以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简单分析动态二维数组,若有不足或错误之处,还请指出! 在讲这之前,以一维数组为例,先重新认识一下数组: int array[5] = {1, 2, 3, 4, 5}; 首先数组名称是该数组的首地址常量,即数组名称就是指针,就有&array[0] == array! 那么我们可以推出*array ==

JAVA安卓植物大战僵尸主题四子棋游戏

@前言 这里使用安卓最基本的API实现双人四子棋游戏(无AI),开发语言为java,开发环境为Android Studio 2.1.2,目标SDK版本为24,最低为15: 界面采用植物大战僵尸主题,图片资源来源于网络,进行了PS加工,非原创: 游戏界面基本可以适配所有安卓手机分辨率,不过在分辨率太大或太小的手机上整体效果会有影响: Github源码: https://github.com/jiangxh1992/FourInRowGame 视频演示: https://vimeo.com/1875

CCNP实验四:修改OSPF的本地管理距离

一:基本配置 r1(config)#router ospf 1 r1(config-router)#net 1.1.0.0 0.0.255.255 area 1 r1(config-router)#net 12.1.1.1 0.0.0.0 area 0 r1(config-router)#redistribute connected subnets r2(config)#router ospf 1 r2(config-router)#net 12.1.1.2 0.0.0.0 area 0 r2(

C程序设计百例之第四例

题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天. 2.程序源代码: #include <stdio.h> int main(void){  int day, month, year, countDay, leap; printf("\nPlease input year, month and day\n"); scanf("%

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e

玖游论坛VIP教程之游戏内存数据分析和基本算法

课程目录:[第二部分 游戏内存数据分析和基本算法] 第1集 介绍存储器与设置CheatEngine第2集 CheatEngine基本应用.通关训练教程第3集 分析<传世si服>角色基址及遍历角色属性第4集 用内存插件读取<传世si服>角色属性第5集 分析<狼烟Online>角色基址第6集 分析<传奇si服>角色基址及遍历角色属性第7集 分析<传奇si服>寻路CALL第8集 分析<传奇si服>停止寻路CALL第9集 按键精灵调用<