如何制作游戏修改器

合集下载

使用Cheat Engine制作自己的游戏专用修改器

使用Cheat Engine制作自己的游戏专用修改器

简单修改器制作教程 - 用Cheat Engine制作&生成修改器本帖最后由圣风云淡于2011-5-10 14:14 编辑首先,这只是个简单教程,即使没有编程经验甚至完全不懂任何编程语言的人都能制作自己的修改器!迟些我会写一篇用C#来编写修改器的教程,其实过程也大同小异,只是编译用C#而不是用Cheat Engine 自动生成而已。

这就需要一些更高级的知识了...所需工具:Cheat Engine 6.0 & Cheat Engine 5.6.1所需知识:懂得怎么搜索数据地址,只要知道懂得怎么找地址就行了。

虽然每次开始游戏那个地址都会改变,但下面要教的正是怎么通过修改汇编代码来间接修改那个总会改变的地址。

而我们要找的代码地址总是固定在游戏某个模块的特定地址里的,只要有模块的地址和那个代码的偏移值,那么我们就一定可以找到那个代码的地址,对其进行修改,就能间接修改具体数据的地址(例如金钱、生命、子弹...etc)这里用《刺客信条:兄弟会》来当例子,这个教程还适用于任何游戏!当然,如果游戏有数据加密,反调试的话,那么过程将会更加坎坷...教程正文:1. 找到数据地址这个我就不教了,太基础,如果这个都不懂的话可以不用往下看了...2. 找出写入这个地址的代码右键找到的数据地址(图里是金钱的地址),点击Find out what writes to this address ,找出写入这个地址的代码有些时候你可能需要点Find out what accesses this address,不过一般情况下我们用不着点这个,因为可能会找出很多不需要的代码。

第一次点击的时候会弹出提示,问你要不要用调试器调试当前程序(游戏程序),当然选Y es然后你会看到弹出一个调试界面,不用管,先回到游戏由于这里用的是金钱做例子,那么回到游戏后去改变一下金钱数量,例如买东西,扔钱,偷钱...我进游戏扔了一次钱,偷了一次钱(以防万一增加和减少金钱是用两个不同的代码来写入的) 事实果然不出我所料,回到调试界面,我看到了两个地址,而且各自写入了一次金钱数据。

CE游戏修改器制作游戏修改器傻瓜教程[图文]

CE游戏修改器制作游戏修改器傻瓜教程[图文]

CE游戏修改器制作游戏修改器傻⽠教程[图⽂]傻⽠教程⽬标是:注重操作,不求深⼊,主要是为了培养各位的兴趣和带你迅速⼊门。

先简单介绍下什么叫CE,CE的全称是Cheat Engine,最新的版本是5.6.1(作者是 Dark Byte)忘记⾦⼭游侠,GM8,FPE之类的修改⼯具的吧,CE会让你爱不释⼿。

⼀、先下载CE 6.2,这个汉化版相当不错哦(不需要安装),推荐各位下载使⽤。

ce修改器(Cheat Engine) v7.3 中⽂版(附使⽤⽅法)类型:内存管理⼤⼩:22MB语⾔:简体中⽂时间:2021-10-02查看详情⼆、打开CE⽬录下的2个⽂件:三、附加进程(图⽰):操作到此就结束了。

这个教程就是如此简单,下⼀关同样如此。

(就像玩游戏⼀样,完全是闯关试的操作,请各位按照顺序,⼀关⼀关的⾛)按下⼀步进⼊教程第⼆关,需要扫描的精确数值是100现在开始搜索精确数值 100 数值中输⼊⼀般游戏就是4字节,这⾥不需要改动,默认就好。

这次扫描我们得到 59 个结果,⾥⾯肯定有我们要找的那个⾎值,不过好像太多了。

关键⼀步:回到 Tutorial 点击我们再输⼊ 96 点击只有1个结果了,这个就是我们要找的内存地址,双击将其加⼊到地址栏图⽰操作:把 95 改成 1000 点击确定按钮此时教程的下⼀步按钮变成可⽤闯关成功。

操作虽然简单,但是⼤家需要明⽩这其实是⼀个筛选的过程,这样操作就能把地址找出来。

1、双击下图对应位置可快速更改数值。

2、双击地址可快速将其加⼊到地址栏第3关的密码是 419482这⼀关很重要,因为某些游戏中⾎显⽰的不是数字⽽是⾎条,这样的话教程2中的⽅法就失效了。

本关就你要教会你如何修改这些讨厌的未知数此时点击新扫描然后选择未知初始数值点击⾸次扫描然后出现了肯定是N多的结果,因为太多了,CE没有显⽰出来。

⽼办法,回到 Tutorial ,点击打我,CE会告诉你⾎量减了多少,⽐如-1这⾥⾯我们换个思路,假设CE没告诉我减少了多少或者我根本没看清,这时应该怎么办呢?注意看下⾯的操作⼀、扫描减少的数值下拉框,选择减少了的数值,按再次扫描(此时⾎量减少了)⼆、扫描不变的数值然后选择没变动的数值(此时⾎量没有变化)再回到Tutorial ,点击打我 => 扫描减少了的数值 => 扫描没变动的数值反复操作,最后就会只剩14个地址简单判断下(Tutorial中告诉你了这个数值是⼩于500的),很容易就找到了最终的地址。

C# 实现游戏修改器

C# 实现游戏修改器

前不久玩植物大战僵尸,不停地玩啊玩,也通关了,准备开始享受一下IMBA的感觉。

“玩玩小游戏”模式中有关“谁笑到最后”,一来就有5000的阳光,随你布置,布置完后开始攻击,过关挺容易。

但是毕竟5000的阳光可布置的植物有限,总觉得不过瘾,于是找来《金山游侠》改阳光数量。

好好享受了几次imba的感觉。

不用说,我当然不甘心用别人的工具,我要自己来。

我选择.NET Framework 3.5作为该程序的实现平台。

整个过程总结如下:一.获取具有窗体的进程集合二.在所选进程的私有地址空间内查找数据三.跟踪所选进程的数据修改情况,获得所要修改的数据的唯一地址四.修改该地址中的数据内容这就好办了,思路有了,我们就根据思路来搜集和整理相关知识:进程进程只是个被动容器,其中包含了很多资源。

System.Diagnostics命名空间中的Process类表示进程。

Process类中的GetProcesses() 方法可以获取系统中所有进程。

判断MainWindowHandle 是否为空可以确定进程是否包含主窗体。

我当前的宿主OS是X P,在32位的Windwos NT/2000/X P 中,进程地址空间有4GB,但却只能访问其地址空间底部的2GB,另外2GB留给内核模式相关的一些东西用。

在这部分可访问的2GB空间中,最低和最高的64KB不能访问,于是可访问的地址范围是:0x00010000 到0x7ffeffff。

我们还需要读和写进程的内存,System.Diagnostics.Process 提供的方法不能做到。

还好,Windows 的kernel32库中的进程相关API可以帮到:ReadProcessMemory和WriteProcessMemory,可以将他们表达为如下C#语句:[DllImport("kernel32.dll", SetLastError = true)]static extern bool ReadProcessMemory(IntPtr hProcess,IntPtr lpBaseAddress,[Out] byte[] lpBuffer,int dwSize,out int lpNumberOfBytesRead);[DllImport("kernel32.dll", SetLastError = true)]static extern bool WriteProcessMemory(IntPtr hProcess,IntPtr lpBaseAddress,byte[] lpBuffer,uint nSize,out int lpNumberOfBytesWritten);名字很直观:读/写进程内存。

用VB6与VBNET制作游戏修改器-外挂与获取模块基址

用VB6与VBNET制作游戏修改器-外挂与获取模块基址

这篇说说VB6/怎么快速制作游戏修改器并获得模块基址。

由于VB6不支持做64位游戏的修改器,而现在的游戏内容和容量越来越大,电脑硬件配置越来越高端。

32位游戏已经满足不了现在的游戏的开发环境要求而会慢慢向64位过渡。

所以用支持64位的比用VB6要方便得多。

首先是的游戏修改器制作方法。

先运行,新建一个项目,,再选中新建一个窗体,再在右边的资源管理器中双击“MY Project”,进入左边选项的第二项点击进入,再点左边最下方的选项,找到并改目标程序为支持任何位数的游戏的CPU类型即可完成配置。

考虑到让小白新手和看代码如看天书的朋友方便阅读,我把定义名都改了一下,老手莫喷。

以下是Windows Media Player 程序修改全代码举例,大家可以直接复制粘贴即可使用以下为做的修改器代码,请各位自己进行更改或操作。

form上7个控件,2个textbox和3个commandbutton 和2个listbox和1个timer,以下为代码:Public Class Form1Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal A As String, ByVal B As String) As LongPublic Declare Function GetWindowThreadProcessId Lib "user32" (ByVal A As Long, ByRef B As Long) As LongPublic Declare Function OpenProcess Lib "kernel32" (ByVal A As Long, ByVal B As Long, ByVal C As Long) As LongPublic Declare Function ReadProcessMemory Lib "kernel32" (ByVal A As Long, ByVal B As Long, ByRef C As Long, ByVal D As Long, ByVal E As IntPtr) As LongPublic Declare Function WriteProcessMemory Lib "kernel32" (ByVal A As Long, ByVal B As Long, ByRef C As Long, ByVal D As Long, ByRef E As IntPtr) As LongPublic myProcesses() As ProcessPublic myProcess As ProcessDim fw As StringDim pid As LongDim hp As LongPublic Sub W(ByVal B As Long, ByVal C As Long, ByVal D As Long) '定义写入WriteProcessMemory(hp, B, C, D, IntPtr.Zero)End SubPublic Function R(ByVal B As Long, ByVal D As Long) As Long '定义读取Dim Value As IntPtrReadProcessMemory(hp, B, Value, D, IntPtr.Zero)R = ValueEnd Function'以上为定义内容,不要变动。

手机游戏辅助制作教程

手机游戏辅助制作教程

手机游戏辅助制作教程手机游戏辅助制作教程手机游戏辅助是现在很多玩家都感兴趣的技术,它能够帮助玩家更轻松地通关游戏、获取更多的资源和道具。

下面就来为大家介绍一下手机游戏辅助的制作方法。

首先,我们需要准备一台电脑和一个手机。

接下来,我们需要下载并安装一款名为游戏辅助器的软件,这是一个常用的辅助制作工具。

然后,我们需要在电脑上安装该软件,并连接手机。

在手机上,我们需要打开“开发者选项”,点击“USB调试”选项,将其打开。

这样,我们的手机就可以和电脑进行连接了。

接着,我们需要打开辅助器软件,并选择要制作辅助的游戏。

在选择游戏后,辅助器软件会自动识别游戏,并显示出一些可供选择的辅助模式。

我们可以根据自己的需求选择相应的模式。

例如,如果我们想要无限金币,我们可以选择相应的模式,并设置金币的数量为无限。

完成设置后,我们需要点击“生成辅助器”,软件会自动将辅助程序制作出来。

我们需要将该辅助程序保存到电脑上,并将手机与电脑断开连接。

接下来,我们需要将辅助程序传输到手机上。

可以通过USB连接,将辅助程序复制到手机的相应目录下。

然后,打开手机上的文件管理器,找到辅助程序并点击运行。

运行辅助程序后,它将自动加载游戏,并应用我们所设置的辅助模式。

我们就可以开始使用辅助器来玩游戏了。

比如,我们可以轻松地获得无限金币,通过关卡,解锁更多的游戏内容等等。

需要注意的是,制作和使用游戏辅助器可能违反游戏规则和法律法规。

因此,在制作和使用辅助器时,我们需要明确自己的目的,并自行承担可能产生的法律风险。

总结一下,制作手机游戏辅助需要准备一台电脑和一个手机,下载并安装游戏辅助器软件,连接手机与电脑,选择游戏并设置辅助模式,生成辅助程序并传输到手机上,最后运行辅助程序并使用。

希望这个简单的教程能够帮助到大家。

教你如何制作脚本与修改器[教学]

教你如何制作脚本与修改器[教学]

教你如何制作脚本与修改器——以CS1.6为例首先要做的事情是清除原有Config,可能很多人以为删除一个Config.cfg就可以了,其实不然,要删除的文件还是非常多的。

进入CS目录下的cstrike文件夹,删除如下文件:Config.cfg,autoexec.cfg,userConfig.cfg,valve.rc。

肯定有人会说,我这里除了Config.cfg 其他三个文件都没有,这才对了,因为默认情况下就不应该有这三个文件。

然后回到上一级目录,进入cstrike_schinese文件夹、valve文件夹、valve_schinese文件夹,按照刚才的方法做一遍。

这样,第一步工作——清除原有Config就完成了。

这样做的好处就是可以让CS 在运行的时候重新生成默认的Config文件。

然后要做的事情是清除CS自带的插件,因为目前各种版本的CS1.6满天飞,很多都是经过加工后加入了各种杂乱的插件,而这些插件很有可能影响游戏的稳定,所以很有必要清除这些插件。

虽然插件可能包含很多文件,但是清除起来还是很简单的,运行记事本,用它打开位于cstrike文件夹的liblist.gam文件,把里面gamedl l一行改成如下所示。

gamedll "dlls/mp.dll紧接着要做的就是制作Config最重要的环节——设置各个参数。

运行CS,点击“`”按钮进入控制台,然后开始输入如下参数:fps_max 100hud_fastswitch 1(一键切换武器,可以根据个人喜好调整为0)hud_centerid 1 crosshair 1 cl_updaterate 100 cl_cmdrate 100 rate 20000 gamma 3 brightness 1cl_dynamiccrosshair 1(动态准星,可以根据个人喜好调整为0)_cl_autowepswitch 1(拣枪自动切换,可以根据个人喜好调整0)输入完上面的参数后,退出控制台,进入设置界面,修改键位设置以及一些游戏界面的设置。

如何编写游戏辅助工具

如何编写游戏辅助工具编写游戏辅助工具是为了帮助玩家在游戏中获得额外的优势,提高游戏体验。

下面是一个简单的步骤来编写游戏辅助工具。

步骤一:确定辅助工具的类型和功能要编写游戏辅助工具,首先需要确定辅助工具的类型和功能。

辅助工具可以包括自动收集资源、自动打怪、自动升级等功能。

步骤二:选择合适的编程语言选择合适的编程语言来编写游戏辅助工具非常重要。

常见的编程语言可以选择Python、C++、Java等。

根据自己的需求和熟悉程度选择合适的编程语言。

步骤三:了解游戏的API和机制了解游戏的API和机制非常重要。

游戏的API可以提供给玩家更加方便的接口来编写辅助工具。

通过了解游戏的机制,可以更好地编写相应的辅助工具。

步骤四:编写代码在了解游戏的API和机制后,可以开始编写代码了。

首先需要写一个主函数来实现辅助工具的主要功能。

可以使用循环来实现持续的辅助功能。

如果需要自动收集资源,可以编写一个函数来自动找到资源、点击收集等操作。

步骤五:测试和调试在编写完代码后,需要进行测试和调试。

在编写代码时经常会出现一些错误和bug,需要通过测试和调试找到并修复这些问题。

可以在编写代码的同时编写一些测试用例来进行测试。

步骤六:发布和维护在通过测试和调试后,可以将游戏辅助工具发布出去供其他玩家使用。

可以选择将代码发布到开源项目中,供其他人参与修改和维护。

同时,也可以根据用户的反馈和需求来进行后续的更新和维护。

总结:编写游戏辅助工具需要确定类型和功能、选择合适的编程语言、了解游戏的API和机制、编写代码、测试和调试、发布和维护。

通过以上步骤可以编写出一个功能完善的游戏辅助工具。

同时,需要注意的是,在使用游戏辅助工具时要遵守游戏规则和道德准则,避免对游戏平衡性造成负面影响。

红警2单机游戏修改器VC6制作

百度文库 - 让每个人平等地提升自我这是一篇让大家熟悉 Windows 下分析内存数据的文章并且用 VC++实现修改内存VC++ 制作单机游戏修改器 这里介绍一个简单的单机游戏修改器制作过程,单机游戏修改器当然 比修改网络游戏要简单很多,一般只需修改内存即可,今天就拿红警2 共和国之辉为例子做一个单机游戏修改器。

首先打开游戏,然后用 内存查找器查找我们想要修改相应数据的内存地址,这里我们选 CE , CE 是个功能非常强大的内存修改器,好废话少说 我们开始新建一个 游戏,相信这个游戏大家都很熟悉了,新建游戏开始这里可以看到游戏刚刚开始,我们就从金钱入手吧,这个在红警里是最直接的啦,好然后最 小化游戏 打开我们的 CE (注意这个时候 我们新建一个电厂然后暂停 让金钱的数值处于一 个不容易重复出现很多次的数值) 注意:VC++实现修改内存相应地址的值很简单后面我会讲解到现在我们具体看看内存地址和基址是 如何查找和分 析的这是我们的CE 附加红警游戏进程进程名为,然后让游戏的金币处于一个容易查找的值状态请看下图可以看到查出来的数值非常少了,但是还需要过滤,所以现在我们再返回游戏再让金币的数值变化一下暂停,返回CE 继续查找,最终发现如下几个地址在CE 里绿色表示常量,而这两个常量对于修改内存的金币是行不通的,他们肯定有别的作用但是不能达到修改金币的作用所以我们修改黑色的那个地址0A029DDC,直接在CE 里面修改,返回游戏发现游戏金币的值已经被修改了,但是这里有一个问题,当我们关闭游戏之后再重新进入就已经不是0A029DDC 这个值了这个时候我们就要想办法找出一个固定的地址就是基址,怎么查找呢?CE 强大的功能可以做到这点双击这个地址把它添加到下面的列表然后右击查看所有操作这个地址的代码如下图所示:图Z-11然后我们进入游戏改变下金币的值,然后返回我们的CE 修改器会发现有一些代码,这个代码就是操作这个金币值的代码我们来分析下这段简短的代码,这是查找基址的关键步骤。

用VB制作游戏修改器(转自电脑报)_455535423


1. 打开VB新建一个标准EXE工程,Form1的Caption属性改为"XXX作弊器"(不包括引号,下同);
2. 在Form1上添加一个Label1,把Label1的Caption属性改为"请稍候……";
3. 在Form1上添加一个Timer控件Timer1,并把Timer1的Interval属性改为"2000",目地是让程序每两秒钟对游戏修改一次;
ReadProcessMemory 函数和WriteProcessMemory函数基本一样,就是第三个参数可以返回内存的数据,这里我就不再赘述了。
二 进程句柄的得到方法
对于VB初学者的来说,句柄这个词特别别扭,按我离解叫做数字编号更好一些,打个比方, 它就好像你的身份证编号.Windows为文件,进程,字体,窗口等都分配一个整数来标识,这个整数就是它们的句柄.
对内存指定地址的数据读取和写入的方法,困扰着许多VB爱好者,本文向大家介绍一种用VB来制作的游戏修改器,希望广大读者通过游戏修器制作,学会VB对内存读取和写入的技巧.文中尽量使用最易懂的词语来介绍,所以就算你是VB初学者,看过本文后,也能轻松制作出自己的游戏修改器。
一内存的写入和读取函数
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Dim pid As Long ' 储存进程标识符

游戏修改器制作

主题:【游戏修改器制作】对不起,我想这是不可能的,因为VB是一个如此简单的编程语音。

"如果有人这么告诉你,别去理他。

我可以肯定告诉你,对于制作修改器这种简单的程序,VB完全可以胜任。

然而,有个问题必须首先考虑:使用VB编写的修改器需要VB的运行库才能运行。

如果考虑到有些使用者(实际上可能是大部分使用者)没有运行库,那么在最后制作的ZIP压缩文件中就必须包含这些庞大的文件。

在下面的教程里我将制作一个修改器,如果为它再制作一个安装程序,那么整个修改器的体积将超过1MB。

其中包括一个很好的安装和反安装程序,但大部分还是VB40032.DLL这个文件。

除了以上这点,使用VB制作修改器是非常简单的。

一旦制作了多次后,你会发现能很快地制作出一个修改器。

而且使用VB制作的修改器能够毫无困难地解决游戏运行时的动态内存分配问题,因此即使是最新的游戏,也可以使用VB制作修改器。

在本教程中将不涉及动态内存分配,因为虽然简单,但仍然属于一个高级的选项。

一些背景知识不象C语音,VB不会自动包括普通的API函数的声明,因此我们必须把他们加入我们的项目文件。

在几乎所有的修改器中会使用到6个主要的函数,讨论如下:1. FindWindow(ClassName, WindowTitle) - FindWindow 返回符合指定的类名( ClassName )和窗口名( WindowTitle )的窗口句柄。

对我们来说,可以让ClassName 为空( Null ),只给出游戏的WindowTitle。

函数应该这样声明:Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long2. GetWindowThreadProcessId(WindowHandle, ProcessId) - 在这里我们把FindWindow 函数中得到的句柄作为参数,来获得进程标识符(ProcessId )。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

游戏修改器制作-黑客入门工具:SoftICE、金山游侠2002、VC++7.0、PE查看器、SPY++测试平台:Window2000 Professional SP2首先我介绍一下将会用到的工具:1、 SoftICE(不用多说了吧,我想你应该会用)2、金山游侠2002(这个你也应该会用)3、 VC++7.0(不要求你一定会用,但至少应该会一种编程工具)4、 PE查看器(你可以随意找一个,没有也没关系,我会教你用SoftICE查看)5、 SPY++(VC里的一个查看程序信息的工具,你可以和别的,比如Delphi和C++Builder的WinSight32)然后就是你应该会的知识:1、汇编基础2、一些编程基础,至少应该看懂我介绍的几个API函数3、 PE文件结构的基础,不会也没关系,我会解释给你以上几点你都具备了的话我们就可以开始了。

我来介绍一下我要教给你的东西。

想必大家都玩过PC游吧,那么也一定用过一些专用的游戏修改器吧,比如暗黑,红警,大富翁这些经典的游戏都有它们专用的修改器,注意,我说的不是FPE之类的通用修改工具。

你试没试过用金山游侠修改红警二的金钱?如果有的话你应该知道每玩一次就要改一次,因为这个游戏是动态分配内存的,每次重新开始都会改变。

所以你会选择到网上去下载一个专用的修改器,那么你有没有想过自己做一上呢?想过?那你为什么不做?什么不会?那就好办了,看了这篇教程你就会了:D费话少说,我来讲一下原理。

有一些经常修改游的朋友一定会知道,不论游戏中“物品”的内存地址是否是动态的,物品与物品之间相隔的距离都是不变的,我拿“楚留香新传”为例,我先用金山游侠查找内力值的内存地址,找到的结果是:79F695C,再查找物品“金创药”的地址是:328D1DC,现在我用79F695C减去328D1DC,得到:4769780,这个数就是内力值与金创药的偏移值,没看懂?接着看呀,我还没说完呢,现在重新再运行游戏,查找内力值的地址,得到:798695C再查找金创药得到的地址是:321D1DC,两个值的内存地址都改变了,但是用你内力值的地址减去金创药的地址得到的结果是什么?没错,还是4769780,也就是说,无论这两个值的内存地址变成多少,它们之间的距离是永远不变的,不光是这个游戏,一般的游戏都是,至少我没见过不是的上面讲的东西总结出一个结论,那就是我们只要得到这两个地址中的任何一个,就可以得到另外一个,只要你知道它们之间的偏移量是多少。

我们第一步要做的就是得到这个地址,但是内存中的地址是动态改变的,得到也没有用,这里我就教你把它变成静态的,叫它永远都不变!我继续拿“楚留香新传”为例,如果你有这个游的话就跟我一起做,没有的也没关系,只要看懂这几个步骤就行了。

开工!首先进入游戏,查找内值的地址,得到的是:798695C(不知道为什么这上游并不是每次重起都改变内存地址),按Ctrl+D打开SoftICE,下命令:BPM 798695C W(写这个地址时则中断),回到游戏中,打开人物属性面板,游戏中断了,在SofitICE中你会看到这条指令:0047EB17 MOV EAX [EDX+000003F4] 下命令:D EDX+3F4将看到内力值0047EB1D PUSH EAX………………………………………………………………从上面可看出0047EB17处的指令是将内力值的指针送到EAX寄存器中,这是一个典型的寻址方式,设想一下,我们是到了EDX中的基址,那么无论什么时候只要用EDX+3F4就可以轻松的得到内力值的地址,因为000003F4是一个常量,它是不会改变的,改变的只是EDX中的地址,所以只要有办法得到EDX中的值就什么都好办了,你明白了没有?如果还是不懂,那么请再看一遍。

现在要做的就是如何得到这个值,下面我教给你如何做:我的办法就是设计一段代码,把EDX中的值存放到一个地址中,然后运行这段代码,再返回游戏的原有指令继续执行,什么?补丁技术?SMC?随你怎么说啦,只要运行正常就一切OK啦:D实际操作:首先在程序中找一段空白处来存放我们设计的代码,很简单,只要懂得一些PE 文件结构的朋友都会知道,一般在EXE文件的数据段(.data段)的结尾都会有一段缓冲区,我们可以在这段区域中写任何东西,当然你也可以用“90大法”找一段空白区,但我还是推荐你用我教给你的方法。

上同我提到,如果你没有PE文件查看工具我可以教你用SoftICE查看,而且很简单,只要一个命令:MAP32 “模块名”,看一下我是怎么做的你就知道了。

Ctrl+D呼收出SoftICE,然后下命令:MAP32 CrhChs,这时你应该看到EXE各个段的信息,我们要注意的只是.data段,既然要找的是数据段的结尾,那么我们就从下一个段开始向上找,如下:.data 004FB000.rsrc 00507000.data的下一个段是.rsrc段,它是从00507000开始的,也就是说以00507000为基础向上一个字节就是数据段的结尾,我所择从00506950处开始写代码,说了这么半天那么我们的代码到底是什么样子呢?修改后的指令又是什么样的呢?别急,请看下面:修改0047EB17后代码:0047EB17 JMP 00506950 //跳到我们的代码中去执行0047EB1C NOP //由于这条指令原来的长度是6字节,而修改后的长度是5个字节,所以用一个空指令补上0047EB1D PUSH EAX//我们的代码:00506950 MOV DWORD PTR EAX,[EDX+00003F4] //恢复我们破坏的指令00506956 MOV DWORD PTR [00506961],EDX //把EDX保存以00506961中去0050695C JMP 0047EB1D //返回原来的指令去执行把上面的代码用SoftICE的A命令写入,OK!现在我们试一下运行的效果,你现在用金山游侠搜索一下内力址的地址,什么又变了?那就地啦,它要是不变我们还用费这么大劲儿吗?记下这个地址返回到游戏中去,Ctrl+D呼出SoftICE,下命令 D *[00506961]+000003F4,在数据窗口看到什么了?呵呵,没错,看到了你刚才记住的那个地址,里面的数值正是内力的值,试着改一下,回到游戏中,呵呵,内力值变了吧:D讲到这里,我们的工作已经完成了%90,但别高兴的太早,后面的%10要远比前的%90花的时间长,因为我们要用编程实现这一切,因为你不能每次都像刚才那样做一次吧!现在我来说一下编程的步骤:首先用FindWindow函数得到窗口句柄,然后用GetWindowThreadID函数从窗口句柄得到这个进程的ID,接着用OpenProcess得到进程的读写权限,最后用WriteProcessMemory和ReadProcessMemory读写内存,然后。

呵呵,你的修改器就做成啦:D下面是我抄写以前写的修改器源程序片断,第一部分是动态写入刚才的代码,第二部分是读取并修改内力值,由于我没有时间整理和测试,所以不能保证没有错误,如果大家发现有遗漏的话,可以在QQ上给我留言或写信给我,代码如下: 有几点请大家注意:1、写机器码时要一个字节一个字节的写2、注意要先写入自己的代码,然后再修改游戏中的指令(下面的代码没有这样做,因为不影响,但是你应该注意这个问题)#define MY_CODE5 0x00#define MY_CODE6 0x90//00506950#define MY2_CODE1 0x8B#define MY2_CODE2 0x82 //这部分是要写入的机器码的常量定义#define MY2_CODE3 0xF4#define MY2_CODE4 0x03#define MY2_CODE5 0x00#define MY2_CODE6 0x00#define MY3_CODE1 0x89#define MY3_CODE2 0x15#define MY3_CODE3 0x61#define MY3_CODE4 0x69#define MY3_CODE5 0x50#define MY3_CODE6 0x00#define MY4_CODE1 0xE9#define MY4_CODE2 0xBC#define MY4_CODE3 0x81#define MY4_CODE4 0xF7#define MY4_CODE5 0xFF//-----------------------------------------------------------------------------//DWORD A1 =MY_CODE1;DWORD A2 =MY_CODE2;DWORD A3 =MY_CODE3;DWORD A4 =MY_CODE4;DWORD A5 =MY_CODE5;DWORD A6 =MY_CODE6;DWORD B1 =MY2_CODE1;DWORD B2 =MY2_CODE2;DWORD B3 =MY2_CODE3; //这部分是变量的定义DWORD B4 =MY2_CODE4;DWORD B5 =MY2_CODE5;DWORD B6 =MY2_CODE6;DWORD C1 =MY3_CODE1;DWORD C2 =MY3_CODE2;DWORD C3 =MY3_CODE3;DWORD C4 =MY3_CODE4;DWORD C5 =MY3_CODE5;DWORD C6 =MY3_CODE6;DWORD D1 =MY4_CODE1;DWORD D2 =MY4_CODE2;DWORD D3 =MY4_CODE3;DWORD D4 =MY4_CODE4;DWORD D5 =MY4_CODE5;//--------------------------------------------------------------------------//HWND hWnd =::FindWindow("CRHClass",NULL); //得到窗口句柄if(hWnd ==FALSE)MessageBox("游戏没有运行!");else{GetWindowThreadProcessId(hWnd,&hProcId); // 从窗口句柄得到进程ID HANDLE nOK=OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATIO N|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId); //打开进程并得到读与权限if(nOK ==NULL)MessageBox("打开进程时出错");else{//0047EB17WriteProcessMemory(nOK,(LPVOID)0x0047EB17,&A1,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0047EB18,&A2,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0047EB19,&A3,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0047EB1A,&A4,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0047EB1B,&A5,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0047EB1C,&A6,1,NULL); //00506950WriteProcessMemory(nOK,(LPVOID)0x00506950,&B1,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506951,&B2,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506952,&B3,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506953,&B4,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506954,&B5,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506955,&B6,1,NULL); //第二句WriteProcessMemory(nOK,(LPVOID)0x00506956,&C1,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506957,&C2,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506958,&C3,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506959,&C4,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0050695A,&C5,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0050695B,&C6,1,NULL); //最后一句WriteProcessMemory(nOK,(LPVOID)0x0050695C,&D1,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0050695D,&D2,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0050695E,&D3,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x0050695F,&D4,1,NULL); WriteProcessMemory(nOK,(LPVOID)0x00506960,&D5,1,NULL);CloseHandle(nOK); //关闭进程句柄}}}///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////读取并修改内力值DWORD hProcId;HWND hWnd =::FindWindow("CRHClass",NULL);if(hWnd ==FALSE)MessageBox("No");else{GetWindowThreadProcessId(hWnd,&hProcId);HANDLE nOK=OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATIO N|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);if(nOK ==NULL)MessageBox("ProcNo!");else{DWORD buf1;DWORD write;BOOLOK=ReadProcessMemory(nOK,(LPCVOID)0x00506961,(LPVOID)&buf1,4,NULL); //读取我们保存EDX中的基础if(OK ==TRUE){write =buf1+0x000003F4; //得到内力值的地址DWORD Writeed =0x00; //要修改的数值BOOL B =WriteProcessMemory(nOK,(LPVOID)write,&Writeed,1,NULL);if(B==FALSE)MessageBox("WriteNo");}}CloseHandle(nOK);}啊,写的我手都麻啦,今天就到这里了,才疏学浅难免会有遗漏,请大家指教,如果你不会或不喜欢用VC的话,你可以在QQ上与我交流,我可以教你如何用Delphi、C++Builder、Win32Asm或VC实同上面的功能。

相关文档
最新文档