首页
社区
课程
招聘
[求助]如何调用游戏的lua函数
发表于: 2016-5-28 22:09 24893

[求助]如何调用游戏的lua函数

2016-5-28 22:09
24893
我已经从内存中dump出lua的源文件,我想测试里面的功能函数,请问如何调用呢,我个人理解至少要先获取到游戏的*L指针才能进行调用,目前没有任何思路,请大牛们指点下

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (33)
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶下
2016-5-29 11:20
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大神来解答
2016-5-29 13:49
0
雪    币: 6542
活跃值: (4341)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
4
第一步:找到游戏的L指针,python也一样找到指针;
第二步:确定L指针结构是否有变化;
第三步:使用此L指针就能调用了;
2016-5-29 14:19
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我获取了游戏L指针,然后调用luaL_dostring来执行脚本,游戏直接卡死了
2016-5-29 16:19
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
继续求大神
2016-5-29 17:29
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
在网上看到这个

现在越来越多的游戏都使用了LUA做逻辑,熟悉下LUA对分析游戏相当有用。
例如:
.kylin0:004AE4A3                push    0
.kylin0:004AE4A5                push    offset sub_4EBF00
.kylin0:004AE4AA                push    offset aAutoselecttarg ; "AutoSelectTarget"
.kylin0:004AE4AF                lea    ecx, [ebp+var_30]              **** ECX == lua_State* == LUA的解释器
.kylin0:004AE4B2                call    ?Register@LuaObject@LuaPlus@@QAEXPBDP6AHPAVLuaState@2@@ZH@Z ; LuaPlus::LuaObject::Register(char const *,int (*)(LuaPlus::LuaState *),int)

知道LUA编程的,很容易就看出这是LUA接口注册部分,
接口名称:AutoSelectTarget
接口函数的执行地址是0x004EBF00
从而很容易找到有用信息(如这里是自动选择目标,那么肯定涉及了对怪物链表的遍历,自己角色的坐标等等)。

要使用它也很简单,首先要找到游戏中的LUA的解释器指针,即lua_State* ,以及游戏中的lua_dostring(注意,不可是自己的程序里的lua_dostring),代码如下:
#define GET_DWVALUE(x) (*(PDWORD)(x))
//lua_dostring的原型:
//LUALIB_API int lua_dostring (lua_State *L, const char *str)
//改为下边的定义
typedef int(CALLBACK *l_dostring)(lua_State *L, const char *str);
l_dostring pGameLuaDostring = (l_dostring)0x00B8B200;    //游戏中lua_dostring的地址
lua_State* luaGame = (lua_State*)GET_DWVALUE(GET_DWVALUE(0x00F15220));//得到LUA解释器指针
pGameLuaDostring(luaGame, "AutoSelectTarget()");//用lua_dostring执行AutoSelectTarget,注意,AutoSelectTarget要写成"AutoSelectTarget()",加上左右括号

我这个游戏没有lua_dostring,请问是否有其他函数可以代替?
2016-5-29 17:32
0
雪    币: 6542
活跃值: (4341)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
8
你确定LUA源码里的L指针和游戏里面的L指针结体是一样的?
2016-5-29 18:07
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个怎么确定呢
2016-5-29 18:26
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
123我顶
2016-5-29 18:44
0
雪    币: 135
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
<<<<<-------逆向的最终结果,就是要知道程序执行流程,所以,楼主还是加大耐心,暴力逆出该游戏,是正么毫无错误的调用lua函数的!!!

很多实际的问题,解决的方法,并不是听某位大神怎么决解。而是自己不断的对目标程序逆向。不断的根据反汇编执行流程假设推断,才最后知道原因。(这过程耐心和冷静的分析才是你的最好师傅)。

现在很多游戏或程序,他们使用的设计技巧,有很多并不是公开的,只能靠自己逆出来。这过程你就会变成传说中的"大神"了。

祝你好运!!!!
2016-5-29 19:46
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
您说的很有道理,正因为目前还很年轻,有些知识还有所欠缺,所以才希望大神能指点一二
2016-5-29 20:10
0
雪    币: 245
活跃值: (294)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
正因为年轻所以方法一定要用对,遇到问题我的建议还是自己研究,当自己研究解决的问题慢慢变多,会发现自己的自学能力有了很大的提高,以后再有问题也感觉只是时间问题自己总可以一个人解决,要把每一个问题当成对自己自学能力的一次历练。
如果你在经常通过问来解决问题,会发现以后没有别人的指点就无法继续,这样就把自己毁了。
2016-5-29 20:23
0
雪    币: 135
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
给个假设的方法,在游戏里,都是主线程调用lua,应为这几年凡是用lua脚本的游戏,只能在主线程里运行。那开发lua巴西佬,不支持多线程。

<<<<<-----这只是个假设,你可以去试试!!

题外话 , 能充分发挥lua语言的代表作暴雪的WOW,这游戏运行lua给力,一切角色控制逻辑,都是lua脚本解决!!!有空去逆向爆他的菊花,呵呵
2016-5-29 20:33
0
雪    币: 23
活跃值: (1401)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
lua_dostring=luaL_loadstring +lua_pcall   ,找到这2个函数地址 就能调用了(只能跟LUA同一线程), 所有LUA游戏通用.
2016-5-30 12:01
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
感谢!研究下去
2016-5-30 16:19
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
测试成功,特来感谢,非常感谢!
2016-6-4 21:10
0
雪    币: 159
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
楼主能详细说一下吗?
奇怪的事.我手头上的游戏不过 luaL_loadstring
倒是通过 lua_pcall 拦截到了.

看了帖子.还没明白应该怎么 去主动调用lua功能.希望楼主能指点一下

主要是想请问一下.
如何做到 跟LUA同一线程 呢?
hook lua 能进行吗?
2016-6-13 16:40
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
19
想办法在主线程的调用路径上找到可以下钩子的地方(api、lua、或者游戏自己的调用都可以),在钩子函数里面执行你的东西
2016-6-14 09:55
0
雪    币: 159
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢.大致上理解了.
就是说会在经过lua函数的地方下钩子.然后使用.
但是我想 主动 去调用.怎么解决呢?
如果在经过的地方下钩子去调用. 那就是 被动 经过的这个地方才调用的吧.?

呃...
2016-6-16 05:46
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
21
蟹妖。

调LUA必须按照基本法,不然到时候出了问题你等于...你也有责任对吧?
你可以在游戏主循环里面每帧都会调用的地方(比如渲染、recv、send、GetTickCount甚至游戏自己的函数)下钩子。你可以弄个bool g_ShouldCall = false全局变量,在钩子函数里面判断g_ShouldCall==true就调用LUA并将g_ShouldCall置为false,否则就什么都不做。主动调用时设置g_ShouldCall=true,这样不就是主动调用了吗?
2016-6-16 10:39
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
跟线程其实没啥关系,
1、找到游戏的lua状态机
2、找到游戏的原始函数地址,要调用那个就要找哪个
2016-6-16 18:27
0
雪    币: 159
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
能理解,只是觉得这样是并不是"主动"而已.利用游戏自身的循环.在里面加个标识.去调用LUA.

非常感谢.
至少现在已经知道应该怎么去摸索了.感谢x10086
2016-6-16 18:32
0
雪    币: 159
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
如果想调用游戏call那样.
还原LUA 经过 lua_pcall 的"环境"堆栈. 不知道能不能呢..?
其实也不用疑问了.自己试一下就知道了.同感谢.
2016-6-16 18:34
0
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我说的方法就是这样的,我现在就可以直接调用游戏原始的lua函数
2016-6-16 19:34
0
游客
登录 | 注册 方可回帖
返回
//