50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id

发布于:2024-12-23 ⋅ 阅读:(17) ⋅ 点赞:(0)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接: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代码,如下图

然后分析它的代码,它的代码很简单,也没有跨地图寻路


img