一种高效、安全的Dota全图新思路

本文作者分享了一种安全的Dota全图方法,避免了修改内存地址,而是通过读取内存地址获取英雄坐标,并在小地图上显示。作者通过不断实验,发现了游戏内存地址分配规则,实现了读取并显示敌方英雄位置。程序虽小,但涉及到内存读取、坐标变换等多个技术环节。
摘要由CSDN通过智能技术生成

一种简单、安全的Dota全图新思路

作者:LC

            我是一个非计算机相关专业的工科生.半年前,我构思了一种简单,安全的Dota全图新思路,经过一周的努力,把它写成了程序.应各位网友要求,在此开源,供学术交流. 

       游戏是一种封装体,开发者希望玩家看到的是游戏画面,音乐等等,希望得到的是玩家对游戏角色的操作命令.这就是这个封装体与玩家交互的Ouput和Intput.然而程序的运行必然会借助硬件,游戏程序的运行,包括了各种数据接收,处理,运算,发送.游戏数据并不是全部传送的服务器运算然后传回,而是在本地完成大多数运算,运算过程肯定要在内存上完成.玩家看到的游戏画面,其实是各种游戏数据在空间上的有序展示.无论是1602液晶LCD显示器,还是计算机显示屏,都存在一个映射关系: f(memroy)=Display.当然,我没有什么游戏开发经历,这只是我的一些比较感性的想法.

 

       所谓全图,就是知晓地图作战信息.以往常见的思路,是去除战争迷雾.我认为去除战争迷雾可能涉及到修改内存地址,容易被对战平台发现,所以没有采用这种思路.我的思路是读取内存地址.读出对方英雄的(x,y)坐标,经过坐标变换后,显示到小地图上.

 

       问题一:如何通过读取内存获得游戏数据?因为程序运行必然借助硬件,它们之间存在数据交互,所以封装不可能是绝对完美的,只需用程序远程读取游戏程序所在的内存地址便可达到目的.

 

       问题二:如何把读到的游戏数据显示在小地图上?这个很简单,测量算出数据(x,y)和屏显(X,Y)的变换关系,读到(x,y)坐标后,变换,用一个循环函数将屏显函数挂起,便可在屏幕上不断显示最新的坐标点.

 

       问题三:如何获得英雄坐标对应内存地址?我把这个放在最后说是因为这个问题是最难的,最核心的.我花了7天写这个小程序,其中有4-5天是在解决这个问题.我有挺多思路,做了很多实验:

          1.首先我采集了4组数据(用CE和War3trainer配合测地址数据),想看看在一把Dota中,10个英雄的X坐标之间有没有线性的关系.我把这10个十六进制数排序,相减,发现间隔值有很多是一样的,但不规律.所以,它们之间没关系.我们无法通过测出一个X坐标地址,推算出其他.

          2.基址+偏移量法.好像和我们C语言课老师讲的多级指针有关系,这种方法真是广为流传.其实我现在也不太会用CE测基址偏移量,不是不会用,是不太会用.所以我基本上也没算出坐标X地址的基址和偏移量,当然也不能怪我.         

          3.复查法.连搞了三天还没有一点进展,难免会用这种极端的手段,算是走了个弯路吧.所谓复查法,就是不断筛选,把War3游戏内存地址遍历一遍,存下符合条件的X#,完事再筛...故称复查法. 从10W筛到2W,就筛不下去了,放弃.

 

        痛苦的实验了无数遍,我决定还得从基址+偏移量入手,因为我认为我的测量手法不对,所以测不出基、偏.所以我不停的实验,各种选英雄什么的.真是无数次实验...终于有一次,我偶尔-repick了一次,结果还真测出基址来了.于是我赶忙把实验步骤记录下来,照做了几遍,果然测出了基址(在CE中体现为绿色数字).但是,第二天睡醒了起来做,就再也做不出来了,即使按照步骤来.完全想不出为什么,只是继续不停的实验,不停的实验,做的多了,观察的多了,突然就发现了问题:那个基址,记录的是移动的单位的X#.关键词:移动.

 

得到内存分配关系如下:

AddY=AddX+0x4;         AddY是储存Y坐标值的变量所对应的内存地址;AddX同理. 这个关系是一个前辈测算出来的.

AddX=X#+0x78;       X#就是上一段话最后说的X#,一定要牢记.就是X#这个地址,正偏0x78个单位,便是AddX;我测的.

ReadProcessMemory(hProc,LPVOID(gameBase+reinterpret_cast<char*>(0xACE5B0)),&fx1,4,NULL);

上面这行代码,是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值