CE中的基址与父址

下面教材开始教大家如何处理动态内存。

何谓动态内存?

当一个游戏运行后,我们找出了他的血量所在的内存地址,在关掉游戏后再重开游戏,再次取出来的血量内存地址,与之前的那次不同。我们称这种血量在内存中的地址会变化的称为动态内存,即为非固定的意思。

注意,有些内存地址在本机上可能重运行进程时不变,到了别的机子上时却会变,这里我建议大家装双操作系统进行测试,或做个虚拟系统进行测试动态内存也可以.

如何处理动态内存?

第一种,找出基址与偏移量.通过该 基址+偏移量 得到要读写数据的内存地址

第二种,固定动态内存,完全的使用修改汇编指今,使该动态内存固定到某处内存地址去。这种属于高级技术,需要精通汇编调试的技术

目前市面上的网络游戏,或多或少是有动态内存的,制作出售外挂明令属于违法的,本站虽做为外挂技术交流的网站,但也不能随便的拿某个游戏进行讲解. 所以,本站的教材对应的例子与测试程序都是用易语言编的,我们假设这些用来测试用的例子程序有动态内存这个特性,然后让我们一起来学习应该如何去做,如何 去处理。

 

下面一起做个例子,学习一下如何用CE进行查找内存,并再查找到这个内存的基址.

用CE对本节例子里的测试程序进行文本查找.

运行例子,然后用CE打开这个例子的进程,查找文本类型数据 外挂作坊www.zuowg.com 这个内容,能找到三个内存地址, 这三个地址,有一个是绿色的,说明这个内存地址是在EXE或某个DLL模块文件中的.

把这三个地址加入到下方,双击这个绿色的 1013c304 地址,可以看到该内存地址是存在于 krnln.fne+13C304 处,这里的 krnln.fne 是DLL模块文件, 13C304 是偏移量 .因为DLL在进程运行时被装载的地址不一定都是固定的,所以对于这类的内存,我们需要先取得该DLL的内存地址,再加上这个偏移量,就能对它进行内存读 写操作了,例 取模块句柄("krnln.fne")+0x13c04 即是.

 

在找到的这三个内存地址后,我们需要进行测试,哪个地址是可用的.这里提示一下,一般绿色的内存地址往往都是固定的静态地址.为了验证 krnln.fne+13C304 内存地址是否可以使用,我修改了他的值,结果发现测试程序里显示的文本内容并没有发生变化,说明该内存地址无用.

双击数据值,进行修改,OD后发现测试程序中的显示内容没有被改变,说明该内存地址无用

现在还有两个内存地址 009970C8 与 00997208 .这两个地址都不是绿色的,说明这两个内存地址都是动态的,即程序运行时,通过向系统申请来的内存保存的数据,因为申请内存时的地址一般都是由系统随机分配的,所以就是动态的了.

 

用上面的方法,把这两个地址中的数据都进行修改看看,改哪个地址时,测试程序中的内容也会跟着变化?此时就能说明这个内存地址是可用的.结果发现,这两个地址都无法修改,一改了之后马上又变回来了.

难道可用的内存地址没有搜出来?看来得重新搜了,把内存扫描选项里选为 全部 ,避免出现漏网之鱼,结果搜出来了四个内存地址的结果.

0014D1C0 是可用的内存地址,修改他的值,测试程序里就会马上反应出来

 

修改该处内存中的数据,程序中立即被更新.

显然这个内存地址是可用的,但前面也提到过,搜出来的地址若不是绿色的,就不是静态内存.显示我们不能直接使用这个内存地址了,因为这个软件到了别的机子上运行时,可能就会变成别的地址了.

现在我们要找到这个内存地址的上级地址,也称父级地址.父级地址中保存着这个内存地址值.

搜出了三个父级地址,要命的是这三个全是黑色的,也都是动态的.

把这三个新找出来的父级地址,保存到下面,然后再次搜这三个父级地址的更上面的父级地址.

新的三个父级地址,只有 009A0D50 这一个可用,因为只有这个地址能搜到更上层的父级地址

搜 009A0D50 得到了好多个新的父级地址,并且这些新的地址还全是绿色的,根据绿色是静态地址的概念.这次所搜出来的那么多的地址,也可以称为基址.基址就是不变了的地址,可以通过这个基址从而得到其它某些数据的可用内存地址,然后再读写那些内存数据.

那么多个基址,一般我们只要选用最上面的那个绿色的地址即可. 把这个地址双击添加到下面..

然后我们要进行手动添加地址了.了解一下如何使用基址来得到我们需要的内存数据 .

添加用基址来读取内存数据的方式.

找到的基址,也知道了偏移量,下面就可以编读写该内存数据的代码了.

根据分析出来的基址与两个0的偏移量读文本内存的代码.

写内存文本值的代码.

点击下载本节源代码

这里的基址与偏移,基本上照抄CE上分析的结果就是.需要注意的是对于像文本型这种长度会变化的数据时,读取与写入都要注意长度,不能超长,会导致读写失败.

对于像这种通过基址再得到真实的内存地址情况时,我们可以直接修改基址里所保存的那个可用的内存地址为另外一个内存地址,这样游戏程序就会傻傻的去读别处我们指定的数据了.通过这种方式可以达到扩大一些原本数据内存长度有限制的突破.

你可能感兴趣的:(c)