能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己顶下
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
大神来解答
|
能力值:
( LV10,RANK:163 )
|
-
-
4 楼
第一步:找到游戏的L指针,python也一样找到指针;
第二步:确定L指针结构是否有变化;
第三步:使用此L指针就能调用了;
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我获取了游戏L指针,然后调用luaL_dostring来执行脚本,游戏直接卡死了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
继续求大神
|
能力值:
( 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,请问是否有其他函数可以代替?
|
能力值:
( LV10,RANK:163 )
|
-
-
8 楼
你确定LUA源码里的L指针和游戏里面的L指针结体是一样的?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
这个怎么确定呢
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
123我顶
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
<<<<<-------逆向的最终结果,就是要知道程序执行流程,所以,楼主还是加大耐心,暴力逆出该游戏,是正么毫无错误的调用lua函数的!!!
很多实际的问题,解决的方法,并不是听某位大神怎么决解。而是自己不断的对目标程序逆向。不断的根据反汇编执行流程假设推断,才最后知道原因。(这过程耐心和冷静的分析才是你的最好师傅)。
现在很多游戏或程序,他们使用的设计技巧,有很多并不是公开的,只能靠自己逆出来。这过程你就会变成传说中的"大神"了。
祝你好运!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
您说的很有道理,正因为目前还很年轻,有些知识还有所欠缺,所以才希望大神能指点一二
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
正因为年轻所以方法一定要用对,遇到问题我的建议还是自己研究,当自己研究解决的问题慢慢变多,会发现自己的自学能力有了很大的提高,以后再有问题也感觉只是时间问题自己总可以一个人解决,要把每一个问题当成对自己自学能力的一次历练。
如果你在经常通过问来解决问题,会发现以后没有别人的指点就无法继续,这样就把自己毁了。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
给个假设的方法,在游戏里,都是主线程调用lua,应为这几年凡是用lua脚本的游戏,只能在主线程里运行。那开发lua巴西佬,不支持多线程。
<<<<<-----这只是个假设,你可以去试试!!
题外话 , 能充分发挥lua语言的代表作暴雪的WOW,这游戏运行lua给力,一切角色控制逻辑,都是lua脚本解决!!!有空去逆向爆他的菊花,呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
lua_dostring=luaL_loadstring +lua_pcall ,找到这2个函数地址 就能调用了(只能跟LUA同一线程), 所有LUA游戏通用.
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
感谢!研究下去
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
测试成功,特来感谢,非常感谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
楼主能详细说一下吗?
奇怪的事.我手头上的游戏不过 luaL_loadstring
倒是通过 lua_pcall 拦截到了.
看了帖子.还没明白应该怎么 去主动调用lua功能.希望楼主能指点一下
主要是想请问一下.
如何做到 跟LUA同一线程 呢?
hook lua 能进行吗?
|
能力值:
( LV9,RANK:280 )
|
-
-
19 楼
想办法在主线程的调用路径上找到可以下钩子的地方(api、lua、或者游戏自己的调用都可以),在钩子函数里面执行你的东西
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
谢谢.大致上理解了.
就是说会在经过lua函数的地方下钩子.然后使用.
但是我想 主动 去调用.怎么解决呢?
如果在经过的地方下钩子去调用. 那就是 被动 经过的这个地方才调用的吧.?
呃...
|
能力值:
( LV9,RANK:280 )
|
-
-
21 楼
蟹妖。
调LUA必须按照基本法,不然到时候出了问题你等于...你也有责任对吧?
你可以在游戏主循环里面每帧都会调用的地方(比如渲染、recv、send、GetTickCount甚至游戏自己的函数)下钩子。你可以弄个bool g_ShouldCall = false全局变量,在钩子函数里面判断g_ShouldCall==true就调用LUA并将g_ShouldCall置为false,否则就什么都不做。主动调用时设置g_ShouldCall=true,这样不就是主动调用了吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
跟线程其实没啥关系,
1、找到游戏的lua状态机
2、找到游戏的原始函数地址,要调用那个就要找哪个
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
能理解,只是觉得这样是并不是"主动"而已.利用游戏自身的循环.在里面加个标识.去调用LUA.
非常感谢.
至少现在已经知道应该怎么去摸索了.感谢x10086
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
如果想调用游戏call那样.
还原LUA 经过 lua_pcall 的"环境"堆栈. 不知道能不能呢..?
其实也不用疑问了.自己试一下就知道了.同感谢.
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
我说的方法就是这样的,我现在就可以直接调用游戏原始的lua函数
|
|
|