现在很多ucbug游戏网都是把一些信息存入内存单元的,那么我们只需要修改具体内存值就能修改ucbug游戏网中的属性,很多网络ucbug游戏网也不外于此。
曾几何时,一些网络ucbug游戏网也是可以用内存游戏辅助进行修改的,后来被发现后,这些ucbug游戏网就把单一内存地址改成多内存地址校验,加大了修改难度,不过仍然可以通过内存分析器可以破解的。诸如“FPE”这样的软件便提供了一定的内存分析功能。
“FPE”是基于内存游戏辅助的佼佼者,是家喻户晓的ucbug游戏网修改软件。很多同类的软件都是模仿“FPE”而得到玩家的认可。而“FPE”实现的技术到现在都没有公开,很多人只能够通过猜测“FPE”的实现方法,实现同类游戏辅助。笔者也曾经模仿过“FPE”实现相应的功能,如“内存修改”、“内存查询”等技术。稍后会对此技术进行剖析。
既然要做内存游戏辅助,那么就必须对Windows的内存机制有所了解。计算机的内存(RAM)总是不够用的,在操作系统中内存就有物理内存和虚拟内存之分,因为程序创建放入物理内存的地址都是在变化的,所以在得到ucbug游戏网属性时并不能够直接访问物理内存地址。在v86模式下,段寄存器使用方法与实模式相同,那么可以通过段寄存器的值左移4位加上地址偏移量就可以得到线性地址,而程序创建时在线性地址的中保留4MB-2GB的一段地址,ucbug游戏网中属性便放于此。在windows中把虚拟内存块称之为页,而每页为4KB,在访问内存时读取ucbug游戏网属性时,为了不破坏数据完整性的快速浏览内存地址值,最好一次访问一页。
在操作进程内存时,不需要再使用汇编语言,Windows中提供了一些访问进程内存空间的API,便可以直接对进程内存进行操作。但初学者一般掌握不了这一项技术,为了使初学者也能够对内存进行操作,做出基于内存控制的游戏辅助,笔者把一些内存操作及一些内存操作逻辑进行了封装,以控件形式提供给初学者。控件名为:MpMemCtl。
初学者在使用此控件时,要先安装游戏辅助引擎控件包(在此后的每篇文章中游戏辅助引擎控件包仅提供与该文章相应的控制控件),具体控件安装方式,请参阅《Delphi指南》,由于篇幅所限,恕不能详细提供。
在引擎安装完成后,便可以在Delphi中的组件栏内,找到[MP GameControls]控件组,其中可以找到[MpMemCtl]控件。初学者可以使用此控件可以对内存进行控制。
一、 得到进程句柄
需要操作ucbug游戏网内存,那么首先必须确认要操作的ucbug游戏网,而ucbug游戏网程序在运行时所产生的每一个进程都有一个唯一的句柄。
使用控件得到句柄有三种方法:
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)