初级玩家

- 贡献度
- 0
- 金元
- 850
- 积分
- 85
- 精华
- 0
- 注册时间
- 2016-12-4
|
看了瘸腿大象老哥的帖子,http://bbs.3dmgame.com/thread-5631642-1-1.html,漫漫长夜1.08 修改脚本,感觉很有收获,但也有一些疑问。论坛里的回复,不知道老哥看不看,于是另发一贴向各位大佬求助。
查了一下资料,CE大概是在6.4版本时候,就加入了对unity3d的支持。使用形如:
{$lua}
LaunchMonoDataCollector()
mono_symbolLookupCallback("某函数名")
{$asm}
这种格式,可以在内存的随机区域定位到特定函数,实现多版本共用的修改。游戏更新后,只要数值计算的原理和函数名未发生改变,就可以通用,比原先定位到"xx.exe+123ab"这样的注入方法好了很多。
但是这个函数怎么找呢?我下面举出两个例子。
第一个,光合作用自动增加卡路里。
{$lua}
LaunchMonoDataCollector()
mono_symbolLookupCallback("Hunger:RemoveReserveCalories")
mono_symbolLookupCallback("Hunger:AddReserveCalories")
{$asm}
define(myhook1,"Hunger:RemoveReserveCalories")
define(myhook2,"Hunger:AddReserveCalories")
[ENABLE]
myhook1:
jmp myhook2
[DISABLE]
myhook1:
push ebp
mov ebp,esp
push edi
sub esp,14
这个例子很有意思,思路是找到减少浮点数卡路里值的函数Hunger:RemoveReserveCalories,并将其修改为(跳转到)增加卡路里值的函数Hunger:AddReserveCalories。
具体操作上,最一般的思路,先找到这个浮点型的卡路里值,然后因为卡路里值是自动掉的,可以“找出是什么改写了这个地址”,定位到相关函数。接下来,
1.传统方法,注入代码,比如把相关的fld nop掉,略;
2.unity3d游戏的方法,首先开启LaunchMonoDataCollector(),使得函数名出现。
按方法2,那么问题来了。作者用的另一个函数,Hunger:AddReserveCalories是怎么找到的?
猜想1:CE可以穷举所有“有名字的函数”?但在CE界面没找到相关功能。
猜想2:白天晒太阳时候,卡路里值增加,按照“找出是什么改写了这个地址”定位?我还没试过白天。但是,这个方法对例二肯定是不成立的。
猜想3:用reflector之类的软件,读取Assembly-Csharp.dll,来分析里面的所有函数,或者带某关键词的函数?但是,一来不能确定关键词,二来工作量大。
那么,有什么简单方法呢?
第二个,不会被狼攻击
{$lua}
LaunchMonoDataCollector()
mono_symbolLookupCallback("BaseAi:ShouldAlwaysFleeFromCurrentTarget")
{$asm}
define(myhook1,"BaseAi:ShouldAlwaysFleeFromCurrentTarget")
[ENABLE]
myhook1:
mov al,1
ret
[DISABLE]
myhook1:
push ebp
mov ebp,esp
这个例子,调用BaseAi:ShouldAlwaysFleeFromCurrentTarget函数,根据(环境之类?)的参数,判断是否会被当前生物选为攻击目标。思路是,直接把返回值ax=1,即不能选为目标;然后直接ret。
像这个例子,用CE数值搜索肯定是找不到的。那么问题来了,这个函数又是怎么定位的呢?
请瘸腿大象老哥、各位方家指点一二。非常感谢!
|
|