网站公告列表     加入外挂作坊终生会员200元,获取最新外挂作坊模块与加入会员群  [admin  2007年8月3日]        
您现在的位置: 外挂作坊 >> 第九章 动态内存 >> 文章正文
  [组图]01-内存定位         ★★★ 【字体:

 

  01-内存定位
 

    本章教材开始教大家如何处理动态内存。

何谓动态内存?

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

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

 

如何处理动态内存?

第一种,内存定位,一般用得比较多的方式为内存搜索,也有些是用修改汇编指今来获取定位。

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

 

 

本章教材也分两部份,第一种与第二种方式都会教到。

 

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

 

 

本节先来了解一下简单的使用内存搜索定位内存地址

在本节例子包里有个 测试程序.exe

运行这个例子包里,我们可以看到,上面有一行文字 "外挂作坊是专业的游戏外挂,私服登陆器,第三方程序编程技巧教学网站"

 

然后我们设计一个使用外挂作坊模块中的内存搜索功能,去搜他,得到这段文本在内存中的位置.

把搜到的内存地址,保存下来,之后就可以调用读写内存的功能去操作该内存中的数据了.我们称这个过程为内存定位,即,搜到他的内存地址保存供之后其它功能操作使用.注.这里的定位并非固定他的意思,是确定他的意思,不要搞混了.


 

下面来解说一下模块中内存查找的功能

原外挂作坊1.8第三版模块及之前的模块有两个功能 内存搜索() 区域内存搜索() 在外挂作坊1.8第四版起被合并为 内存搜索() 新函数的调用格式如下:

返回值返回有搜出来符合的内存地址个数.

参数一,要进行搜索内存的那个进程ID,自身进程=0

参数二,要进行搜索的起始地址,若为0的话将会设置为 0x400000

参数三,要进行搜索的内存终止地址,若为0的话将会设置为 0x7F000000

参数四,要搜索的值

参数五,把搜索到的一组内存地址保存到该整数型数组变量中.

参数六,模糊搜索=-1,常规查找=0,计次查找>0

 

参数六是外挂作坊1.8版新增的功能,可支持模糊搜索,有关模糊搜索将在后面再介绍.常规查找是把该起始至终止的内存段中所有内存地址都保存下来,计次查找只返回该参数指定最先查找到的前几个内存地址.

 


使用默认的起始地址至终止地址查找内存的结果

内存搜索 (进程ID, 0, 0, 到字节集 ("外挂作坊是专业的游戏外挂,私服登陆器,第三方程序编程技巧教学网站"), 内存地址, 0)

从上面的结果图片上来看,搜索 0x400000 - 0x7f000000 内存区域得出了两个内存地址分别是 10172568 与 10172888


再用模块内存查找 测试程序.exe 模块在内存中的起始至终止区域间的内存

模块内存搜索 (进程ID, "测试程序.exe", 到字节集 ("外挂作坊是专业的游戏外挂,私服登陆器,第三方程序编程技巧教学网站"), 内存地址, 0)

 

上面的图片显示,使用模块内存查找这个功能,只搜出一个内存地址 4206795 .

很奇怪的是,这次搜出的内存地址,为什么在使用 内存搜索() 的时候没有搜出来呢? 而 4206795 也是处于 0x400000 - 0x7f000000 区域之内的.

原来,外挂作坊模块,为了能在内存搜索时,速度能够快些,内存搜索()模块内存搜索() 的搜索机制有些不同.

在使用 内存搜索() 时,将只搜索那些有 提交,可读,可写 属性的内存数据,这样可以可以避免去搜陷井地址而引起内存非法操作及那类不可读不可写的内存时造成的时间与速度上的浪费.因为我们要搜的程序中所创建的变量,在变量中保存的数据,这些数据在内存中都是拥有可读,可写属性的.

而使用 模块内存搜索() 时,搜有 提交 属性的内存页,避免了陷井地址,对于是否可读写不再去管了. 平时我们编程序时,在代码里包含了某些数据,例如上面的那个测试程序.exe 其代码里就有包含了 "外挂作坊是专业的游戏外挂,私服登陆器,第三方程序编程技巧教学网站" 这段文本数据,编程语言的IDE在编译源代码为EXE程序时,会把这些数据以常量的方式保存到资源段中.在资源中的数据往往都是只读不可写属性的.

所以,在使用 模块内存搜索() 搜出的 4206795 地址却没有在 内存搜索() 的功能里搜出来.因为这个内存地址是个只读的地址


使用内存搜索时,指定一个要进行搜的区域去搜数据

内存搜索 (进程ID, 10000000, 10200000, 到字节集 ("外挂作坊是专业的游戏外挂,私服登陆器,第三方程序编程技巧教学网站"), 内存地址, 0)

很多人认为(特别是高手)使用内存搜索的方式是愚笨的,因为在搜索内存时的过程有点慢,所以他们往往一开口就提议大家使用汇编指令去固定某个动态内存,并且还会给出一堆的汇编指令来给你参考.

比较有意思的是,出来学习,找资料,提问的人却往往都是新手,对于汇编指令大都是摸不出头绪来.为此,高手们对此动态内存的问题不肖一顾,而各大论坛上到处都是些新手们在提问找答案却最终一无所获.

本章的前部份使用内存搜索进行定位动态内存正是一种折衷的方式,方便简单,也容易上手,适合新手们学习与实际应用.但大家也得要注意一下,游戏开发公司们注重的是游戏的执行速度,对于内存的占用并不是很注重,所以我们做外挂的,借他点光,也得改变观念,不要怕你的外挂在运行期间会占用内存过多(除非你做得太烂了),能玩得起游戏的电脑都不会是那类烂机子小内存的,但一定要注意外挂对一些事务的处理执行速度.不能因为用户使用了你的外挂后在游戏中一卡一卡的,那样话你的外挂程序就是失败.

 

虽然通用过默认的内存搜索搜 0x400000 - 0x7f000000 区域能搜出那两个内存地址,但其所搜的内存段太大了,在搜的过程中所花费的时间也不少,在游戏分析测试阶段里还无所谓,若在真正发行外挂给用户时,不得不注意这个问题,所以这里我们限制要进行搜索的内存区域,在一个小范围的区域里进行搜索,速度会很快,浪费的时间也就很小了.上图就是把要搜索的内存地址限制在 10000000 - 10200000 区间内照样能搜到那两个内存地址.

 


 

 

回顾一下本节所讲的要点主要就是通过内存搜索,搜到一段数据在内存中的地址,保存下该地址供之后的其它的内存操作功能使用,我们称这个过程为内存定位,即确定该内存数据所在的内存地址.并且说明了 内存搜索 模块内存搜索 区域内存搜索 需要注意及要点

另外本节也提到了的一个问题就是,不管是游戏还是游戏外挂,不必太考虑你的程序所占用的内存多大,一般能进行玩游戏的用户电脑都不会太烂的,他们为了能玩上一个游戏往往都会配上高档的CPU与大容量的物理内存条.但对于程序中代码的执行速度必需得考虑.

 

 

本节源代码下载


文章录入:admin    责任编辑:admin 
  • 上一篇文章: 没有了

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
           
    客服QQ:147422159 技术QQ:42724920 浙ICP备06023406号 近期项目多,在线时间不定,有事请QQ留言 Copyright © 2006 www.zuowg.com Inc. All rights reserved.外挂作坊.版权所有 站长:外挂作坊