• 117阅读
  • 0回复

任鸟飞谈逆向----《梦三国2》全图 [复制链接]

上一主题 下一主题
离线任鸟飞
 

微信公众号:任鸟飞逆向


《梦三国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 100C42C5
100C428D    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     eax
100C42A2    4F              dec     edi
100C42A3  ^ 75 EC           jnz     short 100C4291
100C42A5    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 100C42ED
100C42B4    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 00       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, eax
10076902    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 看是否可以实现全图等功能
但是看不到敌对英雄   那么这个地图数组  或许只是地图相关   而和人物对象无关
我们又到 是否有地图数据的判断附近去屏蔽掉有地图数据时候的处理    敌对英雄出现了  
视野外一样可以看到地方英雄了


更多精彩  关注 微信公众号:任鸟飞逆向

快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个