找回密码
 点一下
查看: 6645|回复: 5

检测玩家使用MapHack选中不可见单位的方法(4月7日更新)

[复制链接]
发表于 2010-4-4 10:11:43 | 显示全部楼层 |阅读模式
偶然看到《检测其它玩家使用Maphack捡取不可见物品-神符的工具》

,就想做一个类似的工具。

在那篇文章里有提到
这就几乎全使用Japi 了,思路是【循环:{获得每个玩家当前选中的单位=》若被选中单位数量>1则不是作弊;=1则=》判断此单位对此玩家是否可见=》不可

见就是此玩家使用Maphck}】

可以使用“GroupEnumUnitsSelected”这些Japi编写,把这些代码写入War3,最后可以给这些代码远程创建一个线程,也可以钩到War3中常被执行的代码中去



首先考虑获得当前玩家的选中单位。使用GroupEnumUnitsSelected等函数是不可行的,因为单方面涉及到单位组的操作会导致掉线。用逆向思维想了一下,其实可以枚举每个单位判断是否被选中(IsUnitSelected)。

如何枚举单位呢,起初我想通过扫描内存的方式,觉得太麻烦而且耗时。我想了一个委曲求全的办法,只适用与rpg地图,现在常规对战应该玩的人不多。通过HOOK Game.dll中对变量赋值的代码,得到变量的值,再判断是不是单位,因为rpg地图要运作就要存储单位的一些信息。

那么判断一个HANDLE是否为单位,感谢Renee的启发,调用得到单位类型的函数,能得到的就是单位。在我实际实现的时候我偷懒了改成判断英雄等级,有等级的是英雄,只得到玩家的英雄信息,因为毕竟是rpg地图嘛,开图的要获得一些情报肯定要选定英雄。这段代码可以用CheatEngine找到。

再说下判断是否在游戏中和得到玩家HANDLE的问题。判断在游戏中,地址0x6facd44c不为0就在游戏中。得到玩家HANDLE调用Player函数就行了,但是等人进的那段时间地址0x6facd44c不为0,而且得到的玩家HANDLE和实际游戏中不一样,我就在得到英雄HANDLE之后在获得玩家信息。

到此为止似乎已经没什么问题了,开个线程每隔0.1秒(War3发包的间隔就是0.1秒)检测是否在游戏中,在的话就枚举每个玩家每个英雄是否被选中和拥有视野,如果选中却没有视野就说明开图。

但是问题又来了。第一个是调用JAPI时会崩溃,跟踪了一下发现J函数有调用TlsGetValue,使用了线程局部存储里面存的地址,所以主线程调用没事,别的线程调用就取不出地址。所以还要在HOOK TlsSetValue,判断下是否是主线程调用的,是的话把值存起来,在调用JAPI的时候用TlsSetValue赋下值。第二个是在实现后测试中发现的问题,选中一个敌方单位后这个单位走入迷雾中,虽然状态栏黑掉了,但是用IsUnitSelected判断还是选中状态,这个就误伤了没开图的同学。为了解决这个问题,我就在程序里使用GetTickCount记下每个单位对于每个玩家的最后一次选中时间和最后一次出现在视野内的时间,只有当前时间与这两者的时间都超过1秒,才做出响应。

放出源代码,供大家研究参考。War3版本:1.24b
把dll和exe拷到war3目录下,运行exe,启动魔兽后点初始化。如果不是上平台,直接启动War3的话,要把War3以管理员模式启动,要不然主程序收不到信息。

MHCD.png
MHCD2.png
MapHackClickDetector v0.1
MapHackClickDetector v0.1 src

4月6日更新
优化了一些代码
加入了显示开图者名字的功能

MapHackClickDetector_v0.2.rar

v0.3 (2010-4-7)
解决一个有可能导致崩溃的数组越界问题(我汗),为主程序增加了最小化到系统托盘的功能
v0.3

转载请注明原作者

评分

参与人数 1威望 +12 收起 理由
alexries + 12 强力

查看全部评分

发表于 2010-4-4 14:50:09 | 显示全部楼层
好!!!

----------- 帖子于 14:50 更新 --------- 之前内容发布于 13:51 ------------

其实建议加个功能...玩家索引号不好看...很绕,有办法显示出玩家名字吗
回复

使用道具 举报

 楼主| 发表于 2010-4-6 07:58:30 | 显示全部楼层
回楼上:我去试试

已经改好了,这下方便了吧
回复

使用道具 举报

发表于 2010-6-26 07:54:14 | 显示全部楼层
哎如果是内存 模拟的挂你就选了也不会触发变量。

  而且内存挂是局部模拟 不是调用本地数据。
回复

使用道具 举报

发表于 2010-6-26 09:22:18 | 显示全部楼层
现在反MH不实际 WE反MH最有效的办法是利用模型BUG`并且强制移动镜头瞬间查看BUG模型。
而且还要做好非常多的限制条件。
   但是也只能反明图  不能反暗图
回复

使用道具 举报

发表于 2017-11-8 18:33:34 | 显示全部楼层
檔案死了                 幫忙補上吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-24 01:04 , Processed in 0.151224 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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