50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:49.第二阶段x86游戏实战2-鼠标点击call深追二叉树
上一个内容中把鼠标点击怪物需要的东西都找齐了,比如鼠标点击怪物时调用的call、call需要的参数来源都找齐了,然后再找寻路,之前是通过内存的方式去找的寻路(通过数据包找的寻路,这里19.第二阶段x86游戏实战2-寻找寻路call_游戏寻路call)它有一个问题,它只能本地寻路,本地寻路什么意思?就是说只能在当前地图进行寻路,没法跨地图寻路,使用lua的寻路它是可以跨地图寻路的(这里的lua寻路不是之前我们写的lua寻路,是游戏中的lua寻路,之前自己写的lua寻路本质还是用的19节里的东西),然后跨地图的寻路如果想通过内存实现就很复杂
然后开始分析跨地图寻路
首先把hooklua的工具注入到游戏中,就是下图的工具
然后不操作游戏,然后点击HOOK_LUA按钮,然后点击添加过滤文本按钮,这样过滤一下,防止不相关的lua脚本阻碍分析
然后在游戏中打开世界地图(准备进行跨地图寻路)
然后点击HOOK_LUA按钮,点击完了之后,来到游戏中进行跨地图寻路(这里最好操作的快点)
然后跨地图寻路完成之后,就会有lua脚本了,如下图,有了lua代码之后点击UNHOOK_LUA按钮,点击了之后它就不会再拦截lua代码了,然后跨地图寻路,入参应该是x坐标,y坐标,地图id这样的,但是通过观察hook到lua脚本并没有发现这种东西,所以现在就用到了之前下载的游戏中的lua源码了(在44.第二阶段x86游戏实战2-C++HOOK提取游戏lua这里搞的)
然后就需要一个有文件内容搜索的工具,这里使用 LuaStudio,它的官网 http://www.luastudio.net/,直接点击Download下载就可以了
安装完LuaStudio之后,点击下图红框
然后如下图说明
然后复制下图红框里的东西,这个英文是GoToDirectly,中文意思是直接前往,这个名字就很符合寻路,所以先搜索它,然后这里有个是SceneMap是文件名
然后点击查找
它找到了两个文件,先看SceneMap,Scene是场景的意思,合起来就是场景地图,因为名字符合所以先看它
然后如下图红框是lua的源码,然后开始分析
然后看下图中的内容
function SceneMap_GotoDirectly()
local coordinatex,coordinatey,curSceneID -- 声明了三个本地变量
-- 这个意思是 SceneMap_Board:GetMouseScenePos() 有两个返回值
-- 分别给到了 coordinatex, coordinatey 变量里
-- 通过 coordinatex, coordinatey 它俩的名字可以看出它们是x坐标和y坐标
-- 所以 SceneMap_Board:GetMouseScenePos() 是用来获取坐标的
coordinatex, coordinatey = SceneMap_Board:GetMouseScenePos()
-- 通过 GetSceneID 名字可以看出它是用来得到地图id(场景id)的
curSceneID = GetSceneID()
-- 然后通过 g_CurSelectSceneID 这个单词可以看出它应该是
-- 当前选中的地图id,然后if的判断就是当前选中id不等于-1
-- 并且不等于当前地图 GetSceneID() 现在可以看出它是用来获取当前所在的地图id
if g_CurSelectSceneID ~= -1 and g_CurSelectSceneID ~= curSceneID then
-- 然后这个if判断是 首先 g_SameSceneId 应该是地图数据相关
-- g_SameSceneId[ g_CurSelectSceneID ] 是不是空的,如果不是空的就满足条件
-- 然后判断 g_SameSceneId[ g_CurSelectSceneID ] == curSceneID 也就是
-- 选中的地图id和当前所在地图id是不是一样的,如果是一样的就执行
-- AutoRunToTarget(coordinatex, coordinatey) 函数,通过上方分析的
-- AutoRunToTarget(coordinatex, coordinatey)意思应该是当前地图移动的函数了
-- 然后 AutoRunToTargetEx(coordinatex,coordinatey,tonumber(g_CurSelectSceneID)) 是跨地图移动
-- AutoRunToTargetEx的参数是x坐标y坐标和地图id
if g_SameSceneId[ g_CurSelectSceneID ] and g_SameSceneId[ g_CurSelectSceneID ] == curSceneID then
AutoRunToTarget(coordinatex, coordinatey)
else
AutoRunToTargetEx(coordinatex,coordinatey,tonumber(g_CurSelectSceneID))
end
else
AutoRunToTarget(coordinatex, coordinatey)
end
end
然后就找到了跨地图移动的lua函数,然后之前搜索出了两个文件,然后再看看另一个文件的lua代码,如下图
然后分析它的代码,它的代码很简单,也没有跨地图寻路