在内存中修改数据的网游外挂
日期:2007年6月10日 作者: 查看:[大字体 中字体 小字体]-
现在很多游戏都是把一些信息存入内存单元的,那么我们只需要修改具体内存值就能修改游戏中的属性,很多网络游戏也不外于此。
曾几何时,一些网络游戏也是可以用内存外挂进行修改的,后来被发现后,这些游戏就把单一内存地址改成多内存地址校验,加大了修改难度,不过仍然可以通过内存分析器可以破解的。诸如“FPE”这样的软件便提供了一定的内存分析功能。
“FPE”是基于内存外挂的佼佼者,是家喻户晓的游戏修改软件。很多同类的软件都是模仿“FPE”而得到玩家的认可。而“FPE”实现的技术到现在都没有公开,很多人只能够通过猜测“FPE”的实现方法,实现同类外挂。笔者也曾经模仿过“FPE”实现相应的功能,如“内存修改”、“内存查询”等技术。稍后会对此技术进行剖析。
既然要做内存外挂,那么就必须对Windows的内存机制有所了解。计算机的内存(RAM)总是不够用的,在操作系统中内存就有物理内存和虚拟内存之分,因为程序创建放入物理内存的地址都是在变化的,所以在得到游戏属性时并不能够直接访问物理内存地址。在v86模式下,段寄存器使用方法与实模式相同,那么可以通过段寄存器的值左移4位加上地址偏移量就可以得到线性地址,而程序创建时在线性地址的中保留4MB-2GB的一段地址,游戏中属性便放于此。在windows中把虚拟内存块称之为页,而每页为4KB,在访问内存时读取游戏属性时,为了不破坏数据完整性的快速浏览内存地址值,最好一次访问一页。
在操作进程内存时,不需要再使用汇编语言,Windows中提供了一些访问进程内存空间的API,便可以直接对进程内存进行操作。但初学者一般掌握不了这一项技术,为了使初学者也能够对内存进行操作,做出基于内存控制的外挂,笔者把一些内存操作及一些内存操作逻辑进行了封装,以控件形式提供给初学者。控件名为:MpMemCtl。
初学者在使用此控件时,要先安装外挂引擎控件包(在此后的每篇文章中外挂引擎控件包仅提供与该文章相应的控制控件),具体控件安装方式,请参阅《Delphi指南》,由于篇幅所限,恕不能详细提供。
在引擎安装完成后,便可以在Delphi中的组件栏内,找到[MP GameControls]控件组,其中可以找到[MpMemCtl]控件。初学者可以使用此控件可以对内存进行控制。
一、 得到进程句柄
需要操作游戏内存,那么首先必须确认要操作的游戏,而游戏程序在运行时所产生的每一个进程都有一个唯一的句柄。
使用控件得到句柄有三种方法:
1、 通过控件打开程序得到句柄。
在控件中,提供了startProgram方法,通过该方法,可以打开程序得到进程句柄,并且可以返回进程信息。
PProcInfo: PROCESS_INFORMATION;
MpMemCtl.startProgram(
FilePath:String; //程序路径
var aProc_Info:PROCESS_INFORMATION //进程信息
):BOOLEAN
该方法提供了两个参数,第一个参数为要打开的程序路径,第二个参数为打开程序后所创建进程的进程信息。使用这个方法在得到进程信息的同时,并给控件的ProcHandle(进程句柄)属性进行了附值,这时可以使用控件直接对内存进程读写操作。其应用实例如下:
Var
PProcInfo: PROCESS_INFORMATION;
begin
MpMemCtl1.startProgram(edit1.Text, PProcInfo)
2、通过控件根据程序名称得到句柄。
在控件中,对系统运行进程也有了相应的描述,控件提供了两个方法,用于根据程序名称得到相应的进程句柄。getProcIDs()可以得到系统现在所运行的所有程序的名称列表。getProcID()可以通过所运行程序名称,得到相应进程的句柄。
getProcIDs():TStrings //所返回为多行字符串型
getProcID(
aProcName:String //应用程序名称
):Thandle; //应用程序进程句柄
其应用实例如下:
首先可以通过getProcIDs()并把参数列表返回ComboBox1.Items里:
ComboBox1.Items:=MpMemCtl1.getProcIDs();
接着可以通过getProcID()得到相应的进程句柄,并给控件的ProcHandle(进程句柄)属性进行了附值,这时可以使用控件直接对内存进程读写操作。
MpMemCtl1.getProcID(ComboBox1.Text)
3、通过控件根据窗口名称得到句柄。
在控件中,控件提供了两个方法,用于根据窗口名称得到相应的进程句柄。可以通过getALLWindow()得到所有在进程中运行的窗口。getWinProcHandle()可以通过相应的窗口名称,得到相应的进程的句柄。
getALLWindow(
aHandle:THandle //传入当前窗口的句柄
):TStrings; //返回当前所有运行窗口的名称
getWinProcHandle(
aWindowName:String //传入当前窗口名称
):Thandle; //返回窗口的句柄
其应用实例如下:
首先可以通过getALLWindow ()并把参数列表返回ComboBox1.Items里:
ComboBox1.Items:=MpMemCtl1. getALLWindow(Handle);
接着可以通过getWinProcHandle ()得到相应的进程句柄,并给控件的ProcHandle(进程句柄)属性进行了附值,这时可以使用控件直接对内存进程读写操作。
MpMemCtl1. getWinProcHandle (ComboBox1.Text);
二、使游戏暂停
在程序中,为了便于更好的得到游戏的当前属性。在控件中提供了游戏暂停方法。只需要调用该方法,游戏便可以自由的暂停或启动。该方法为:pauseProc()
pauseProc(
aType:integer //控制类型
)
控制类型只能够传入参数0或1,0代表使游戏暂停,1代表取消暂停。其应用实例如下:
MpMemCtl1.pauseProc(0); //暂停游戏
MpMemCtl1.pauseProc(1); //恢复暂停
三、读写内存值
游戏属性其实寄存在内存地址值里,游戏中要了解或修改游戏属性,可以通过对内存地值的读出或写入完成。
通过控件,要读写内存地址值很容易。可以通过调用控件提供的getAddressValue()及setAddressValue()两个方法即可,在使用方法之前,要确认的是要给ProcHandle属性进行附值,因为对内存的操作必须基于进程。给ProcHandle属性附值的方法,在上文中已经介绍。无论是对内存值进行读还是进行写,都要明确所要操作的内存地址。
getAddressValue( //读取内存方法
aAddress:pointer; //操作的内存地址
var aValue:integer //读出的值
):Boolean;
setAddressValue( //写入内存方法
aAddress:pointer; //操作的内存地址
aValue:integer //写入的值
):Boolean;
要注意的是,传入内存地址时,内存地址必须为Pointer型。其应用实例如下:
读取地址值(如果“主角”等级所存放的地址为4549632):
- [1] [2] [3] 下一页
-
- 在内存中修改数据的网游外挂 相关文章:
- ·在内存中修改数据的网游外挂
- 在内存中修改数据的网游外挂 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
下一篇:OO设计中对象的创建和使用
精品推荐
热点TOP10
- ·UML业务建模实例分析
- ·GIF文件格式
- ·代码静态分析工具PC-LINT安装配置
- ·游戏外挂设计技术探讨
- ·开发WDM型的USB设备驱动程序
- ·设计模式探索系列之Bridge模式
- ·逆向思维 《魔兽世界》封包分析
- ·LZW压缩算法简介
- ·Solaris 10 安装及SVC管理及X及Vmware及其它可能遇到的一些问题
- ·1.2 什么是数据挖掘
- ·Spring让LOB数据操作变得简单易行
- ·编写QQ外挂插件的原理和方法
- ·使用BHO定制你的IE浏览器
- ·利用API在Windows下创建进程和线程
- ·在内存中修改数据的网游外挂
- ·程序语言效率比较
- ·正则表达式从入门到精通
- ·网络监听技术概览
- ·游戏开发新手入门之跟踪窗口和使用GDI
- ·原始套接字透析之实现Ping
