《梦三国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 看是否可以实现全图等功能 但是看不到敌对英雄 那么这个地图数组 或许只是地图相关 而和人物对象无关 我们又到 是否有地图数据的判断附近去屏蔽掉有地图数据时候的处理 敌对英雄出现了 视野外一样可以看到地方英雄了
联系我时,请说是在 挂海论坛 上看到的,谢谢! |