【2017.8.22】(提问)关于CE脚本有用的函数定位的问题(原帖:瘸腿大象,漫漫长夜1.08 修改脚本)
看了瘸腿大象老哥的帖子,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")
myhook1:
jmp myhook2
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")
myhook1:
mov al,1
ret
myhook1:
push ebp
mov ebp,esp
这个例子,调用BaseAi:ShouldAlwaysFleeFromCurrentTarget函数,根据(环境之类?)的参数,判断是否会被当前生物选为攻击目标。思路是,直接把返回值ax=1,即不能选为目标;然后直接ret。
像这个例子,用CE数值搜索肯定是找不到的。那么问题来了,这个函数又是怎么定位的呢?
请瘸腿大象老哥、各位方家指点一二。非常感谢!
另外,论坛的V1.1.1版本,这个CT依然是可用的,起码是可注入的,原帖一群人“求更新”,不知道是否有自己尝试使用过? 顶顶。有人吗? 在一堆不懂编程的人讲这些,肯定没人理你。我觉得你还是私信那个人会好些。 naoh2004 发表于 2017-8-22 22:24
在一堆不懂编程的人讲这些,肯定没人理你。我觉得你还是私信那个人会好些。 ...
嗯,;P,我试试。
修改工具就这些,你都有了。
方法就这些,你也都知道。
所以还有啥可问的呢。。。 瘸腿大象 发表于 2017-8-29 12:45
修改工具就这些,你都有了。
方法就这些,你也都知道。
所以还有啥可问的呢。。。 ...
老哥,具体讲一下呗,比如那个狼的,具体是咋找到的。谢谢啦。 搜索常用的文本比如 speed critital damage heal remove chance 。一般总会发现点什么。
瘸腿大象 发表于 2017-8-31 22:00
搜索常用的文本比如 speed critital damage heal remove chance 。一般总会发现点什么。
...
这样工作量可真大。谢谢老哥啦。 tempa 发表于 2017-9-4 11:13
新手修改Unity游戏需要先了解dnSpy,.Net Reflactor已经过时可以丢垃圾堆了,把dnSpy分析的文件导出成工程 ...
说那么详细干什么,不知道这是个大坑么,让别人跳进去出不来多不好。一般人还是玩游戏就好了,有修改器就用用,没有就伸手好了。又不是谁都像你一样搞游戏开发。
本帖最后由 tempa 于 2017-9-4 12:16 编辑
给新手指条明路,毕竟1年前我也啥也不会状态走过来的。;P
另外最近那个滚球2你玩了没,挺好玩的,塔防竞速二合一的游戏。等你做牛逼的修改呢,无限防御,任意位置建造什么的
http://bbs.3dmgame.com/thread-5639208-1-1.html
现在改游戏这么先进啦,我以前都是DEBUG:lol:lol:lol 本帖最后由 yigjvn 于 2017-12-13 23:57 编辑
首先,你的猜想1和3都是对的,CE可以枚举附加进程的基本上所有DLL,你能在Unity3D制作的游戏里发现游戏加载了mono.dll
但是你是会发现没有存储Unity3d的C#脚本逻辑代码的Assembly-CSharp.dll或是存放JavaScript脚本代码的Assembly-UnityScript.dll
这是因为Unity3D使用mono_image_open_from_data_with_name这个函数进行dll动态解密.
这时你便需要用.NET Reflector这样的.NET程序反编译软件来反编译这个Assembly-CSharp.dll了
至于说如何找到这些代码,那么你是需要关键字的,按照你上面说的例子,不管是Calories还是Hunger都可以查找到相对应的类名
其实通过查找你所猜测的关键字基本上就能找到你所想要的函数了,因为一般游戏程序员都是写的比较规范清楚的.
当然,游戏也很可能会混淆函数名的....
但是你也可以找到可以反混淆回来的程序...
那么如果你还是想用CE来获取mono数据的话,其实也是可以的,CE6.4之后的版本自带了monoscript.lua这个自动运行的lua脚本,也就是可以用LaunchMonoDataCollector()这样的Lua函数来初始化mono数据的收集器
然后用CE附加了Unity3D制作的游戏后,在CE的主界面的菜单栏里会出现Mono的菜单项,接着Activate mono features,Dissect Mono,这样便会生成Mono的各种数据的分析表.
至于为什么大多数我们写AA都是在函数头直接将结果返回指定的值,是因为这样的话,代码紧凑,而且比较稳定(相对于在其他地方修改)..
yigjvn 发表于 2017-12-13 19:17
首先,你的猜想1和3都是对的,CE可以枚举附加进程的基本上所有DLL,你能在Unity3D制作的游戏里发现游戏加载了m ...
听了你的解释,我对大概的流程也比较了解了。先说说本人当前的水平,理解并掌握CE自动汇编中的完全注入和AOB注入两种模板的修改方法。
现在需求的情况是,缺氧这个游戏,我会的两种方式都不能用,因为代码的内存位置不固定,而且搜索不到唯一的特征码。后来了解到了是用了mono这个东西,网上也找不到相关的教程。
所以现在我想请教一下:
怎么找到需要改动的函数名,针对使用了mono的游戏,CE里具体需要怎么操作,或者需要些什么别的工具?
aa2791298 发表于 2017-9-3 19:08
这样工作量可真大。谢谢老哥啦。
lz你好,我也对函数怎么找这一步充满了疑惑。能向你学习下吗?具体在ce里要怎么弄呢? 还是说要借助别的工具才能找到?
页:
[1]