ramlife

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转] 王者荣耀有没有外挂?

转自: https://www.zhihu.com/question/269064087/answer/679504575

作者:任鸟飞
链接:https://www.zhihu.com/question/269064087/answer/679504575
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

不请自来
我可以肯定的告诉你有,但是王者荣耀比较敏感,这里用一个相同类型的游戏代替讲解下
如何实现MOBA类游戏全图视野的功能(仅限于技术交流)

《梦三国2》是5V5对战类游戏,和LOL游戏模式差不多。
这种游戏敌人的位置,地图信息是至关重要的,市场上有这个游戏的全图外挂,这对游戏的平衡性造成了极大的破坏,我们今 天来分析一下其全图效果是怎么实现的。
首先地图上的可视与不可视是被分成极小的点的,所以我们随便选择一个小的区域
用人物的走动来改变他的可视与不可视状态。

可视搜索字节1 不可视搜索字节0(当然是尝试出来的,避免未知初始值扫描过慢)
会得到一些相邻的内存地址
为什么这么多相邻的地址呢?原因我们刚才已经说了,地图是由很多个点组成的,我们来回走动,变动可视状态看上去只有一小块区域,实际上可能是几千个点

在任意相邻的内存地址上下访问断 得到下面代码

100C4291 - 80 3C 02 00 - cmp byte ptr [edx+eax],00============视野判断
0104A650 - 8A 02 - mov al,[edx]
0104A658 - 88 02 - mov [edx],al
0104A5C0 - 8A 02 - mov al,[edx]
0104A5C8 - 88 02 - mov [edx],al

第一条很明显是一个判断
100C426B 8945 CC mov dword ptr [ebp-34], eax
100C426E DC0D 40073210 fmul qword ptr [10320740]
100C4274 D96D CC fldcw word ptr [ebp-34]
100C4277 DB5D CC fistp dword ptr [ebp-34]
100C427A 8A45 CC mov al, byte ptr [ebp-34]
100C427D D96D CA fldcw word ptr [ebp-36]
100C4280 8845 CB mov byte ptr [ebp-35], al
100C4283 8B86 A8020000 mov eax, dword ptr [esi+2A8]
100C4289 85FF test edi, edi
100C428B 7E 38 jle short
100C42C5100C428D 8BD3 mov edx, ebx
100C428F 2BD0 sub edx, eax
100C4291 803C02 00 cmp byte ptr [edx+eax], 0 ; 视野判断
100C4295 75 06 jnz short
100C429D ; 如果内存地址里不等于0跳转 也就是可视跳转 那么我们改成JMP 默认全部可视
100C4297 0FB64D CB movzx ecx, byte ptr [ebp-35]
100C429B EB 02 jmp short 100C429F
100C429D 33C9 xor ecx, ecx
100C429F 8808 mov byte ptr [eax], cl
100C42A1 40 inc eax100C42A2 4F dec edi
100C42A3 ^ 75 EC jnz short
100C4291100C42A5 FF15 1CE43110 call dword ptr [<&WINMM.timeGetTime>] ; WINMM.timeGetTime
100C42AB 8946 70 mov dword ptr [esi+70], eax
100C42AE C646 74 01 mov byte ptr [esi+74], 1
100C42B2 EB 39 jmp short
100C42ED100C42B4 8B8E A8020000 mov ecx, dword ptr [esi+2A8]
100C42BA 57 push edi
100C42BB 53 push ebx
100C42BC 51 push ecx
100C42BD E8 02BD2100 call
100C42C2 83C4 0C add esp, 0C

分析可得为0的时候不跳转,我们知道为0是不可视那么我们修改掉他的判断为无条件跳转
这样去掉了 第一层迷雾

如上图:已经达到了全图的效果
但是这只是第一层迷雾,敌人如果在视野外 我们也是看不到的
那么我们通过 100C4291 803C02 0 cmp byte ptr [edx+eax], 0 这条代码去追踪点阵的来源
这个偏移表达可以追到 [ecx+704+10] CE搜索ECX 的值可以得到表达式
[[103E65E0]+704+10]
我们在 地图数组的地址上下断 得到代码:

10076A13 - 83 7E 10 00 - cmp dword ptr [esi+10],00
10076A67 - 8B 46 10 - mov eax,[esi+10]
100768ED - 83 7F 10 00 - cmp dword ptr [edi+10],00 大地图显示
1007696F - 8B 47 10 - mov eax,[edi+10]
100768E0 55 push ebp
100768E1 8BEC mov ebp, esp 100768E3 51 push ecx
100768E4 57 push edi
100768E5 8BF9 mov edi, ecx
100768E7 807F 4C 00 cmp byte ptr [edi+4C], 0
100768EB 75 13 jnz short 10076900
100768ED 837F 10 00 cmp dword ptr [edi+10], 0 判断是否有地图数据
100768F1 75 16 jnz short 10076909 ; NOP掉 大地图可以显示 应该是没有对地图上的某些数据进行隐藏了
100768F3 8B45 10 mov eax, dword ptr [ebp+10]
100768F6 85C0 test eax, eax
100768F8 74 06 je short 10076900
100768FA C700 00000000 mov dword ptr [eax], 0
10076900 33C0 xor eax, eax10076902 5F pop edi
10076903 8BE5 mov esp, ebp
10076905 5D pop ebp
10076906 C2 0C00 retn 0C
10076909 53 push ebx
1007690A 56 push esi
1007690B E8 70AEFFFF call 10071780

我们整理下思路
实际上 我们在找地图可视数组 找到以后对他的可试进行访问 得到代码 对其不可视代码进行屏蔽 实现了 地图全亮如果不行 我们可以返回上一层屏蔽CALL 看是否可以实现全图等功能
但是看不到敌对英雄 那么这个地图数组 或许只是地图相关 而和人物对象无关
我们又到 是否有地图数据的判断附近去屏蔽掉有地图数据时候的处理 敌对英雄出现了

视野外一样可以看到地方英雄了
--------------------------分割线-----------------------------
本人每天需要讲课 ,从今天起每天会不定时发一篇关于逆向汇编的文章。
本文章仅限于交流,如果本文章侵犯了贵公司权益,请联系我删除。
点赞是一种鼓励,转载是一种美德,分享能给我最大的动力,如有不足之处请予指正。
发布于 2019-05-11

posted on 2019-06-07 13:33  ramlife  阅读(205)  评论(0)    收藏  举报