看流星社区

 找回密码
 注册账号
查看: 2251|回复: 0

定位游戏动态地址的3种方法

[复制链接]

该用户从未签到

发表于 2019-9-10 14:55:18 | 显示全部楼层 |阅读模式

      现在的游戏全是双地址效验内存,内存地址不断变化,现在E里面有很多模块,读写内存,取颜色,模拟键盘,模拟鼠标,如果内存是静态的,我相信各位全用不上API,就光用模块就能写出简单的内挂了,当然内挂的准确度还要看各位用什么样的方式来解决各种问题了,可是内存是动态的,每次启动游戏内存就全会变,我们不能每次让玩家来用金山游侠查找血地址输入到你辅助里然后再启动辅助啊,呵呵,所以下面我说说我是如何解决动态内存的,我说3个方法,第3个也就是我的疑问了!好了,不废话了,我进入正题!


  第一种方法:在辅助里设置个编辑框,让玩家把自己的姓名或者游戏里的ID输入,然后点辅助初始化,好了,利用API去查找内存玩家的姓名ID等信息,找到后就能得到一个地址了,而后血地址,法地址等全是与这个地址有一个固定的偏移量的,在辅助启动的时候只要能把初试的地址固定,偏移量也就固定了,这个试用于征服这样的游戏,还要看游戏机制而言,不是万能的!首先要看在整个进程的内存中或者某模块进程中玩家的姓名或者ID是否是唯一的!


  第二种方法就是比较笨的方法了,自己去用WINHEX截取模块内存和整个内存,全分析一下,分析模块中的PE头代码,然后在整个进程中去搜索这组字节集,出现了多少个就是在进程里有多少个子程序入口,因为模块头的代码与别的部分的代码绝对不可能吻合,并且有的程序入口的字节集是在整个进程ID里也是唯一的,因为某些子程序有着特定的返回值,好了,这个先不去管他了,找到多少个子程序入口后,你去用金山搜索血地址,然后用WINHEX来到这个地址,分析血格式,比如问道游戏的血格式;11 2D 00 00 15 3A 00 00 11 2D 00 00 15 3A 00 00 00 00 00 00 00 00 00 00 54


  这里第一个和第3个112D代表血上限,并且是2D11的10进制,这里是倒着写的,而第2个和第4个153A是目前血的数值,也是倒着写的,你要把数据的格式分析透彻,好了,这里分析完格式就可以往上找了,往上找到一个刚刚查到的入口的代码,比如是54 01 2E 00 FF 1A,这里的地址是00400000,那就确定了004000000到这个程序的结尾之间是血的地址所在,那好,从血地址开始到00400000之间我们分析吧,在这之间你要去找到多次启动游戏固定不变且在整个进程内存中唯一的字节集数。


  (取这个信息是最艰难的一步,需要你的耐性和多次实践去观察分析,一定能找到的)好了,找到了唯一并且永远不变的字节集的地址了,算出血与他的偏移量,那么就可以干活了,后面的步骤就和第一种方法一样了!!!这类也不是绝对通用的,在问道里可行,也要看游戏的机制,所以大家要几种方法全试试吧!


  好了,第三种方法是通用的,适合任何游戏,不过难度比较高,要对汇编有初步了解,会用反汇编工具,动态的我们叫动态调试,不管动态或者静态,全是反汇编,好了,下面开始,还是利用金山游侠,找到血地址,比如是:01B629CC,我去把这个数值修改成FF,回到游戏,游戏人物的血变了,那就说明我们的地址是正确的(当然不能用来修改游戏了,我们修改的是本地的数据,本地的血变了,而服务端你的血是没变的,当你血收到外部攻击或者你吃药,只要一变化,血就会回到原来的数值的,我们的目的是确定地址是正确的就可以了),既然地址是正确的,我就用SOFTICE下断点,bpm 01b629cc w,这句话意思就是在内存这个位置写入数据的时候就会中断,好了,我们回到游戏,继续游戏,怪物打了我一下,游戏中断了,中断的地方是0212A1AA,我们看中断的这里有个eax,那我们就用d [eax]命令来查看eax里的数值,当然了,如果你用的是Ollydbg那么就不用下命令来看eax里面存放的是什么了,直接就能看到的!我们看到里面出现了刚我们查到的血数值地址01b629cc ,那就说明在这个地址会给血数值申请一个存放空间或者改变一个存放空间,那怎么办啊.....

EAX里的数据在这里无法直接调用出来啊,那我就要在辅助启动的时候写个补丁程序了,我要对内存进行操作,来把它固定,在内存里有个区域是空白数据的,好了,我们就利用这片空间吧,我要把EAX里的数值存放在055ea1a2这个位置,我们在写辅助的时候就可以直接访问这个位置来取数值,取到的数值就是血数值的内存地址了,那怎么写呢?

在汇编里:0212A1AA   mov 055ea1a2,[eax]  
这句话的意思就是吧在0212a1aa位置把EAX里的数值存放到055ea1a2这个领域来,然后我们在写辅助就象我上面说的,直接从055ea1a2这个地址里就能取到血的内存地址了,呵呵,我相信这么说大家应该能明白了吧?


  一般的游戏是这样的 你要获取的诸如像血,蓝 这些都是全局变量, 在内存中本来是不会变的。!这个是对于C语言的编译器而言 而其他的高级语言比如 Delphi什么的 也不会这样处理了 他会动态申请内存! 而且游戏一般也用指针来指向一个结构 包括了血的 多少,血的剩余,和其他属性的 一些结构。 而真正这些结构的实质就是像易语言中的字节集 我们操作的时候实际上是根据指针在操作, 而且这个字节集决不会固定,那么在这种情况下,就只能找到读取 或者写入这个 结构的语句的地址 从而JMP一句 大概就是读取或者写入操作的同时 把要写入或者读取的值保存到一个内存固定的位置, 比如程序的代码段中从有空隙的通过这样方式来拦截。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 05:59

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表