热更新

我计划通过Hack代码的方法,修改libmono.so[注1],拦截unity3d加载asset的Assembly-CSharp.DLL[注2],注入保存在sd卡上的更新的DLL。从而实现代码热更新,无需第三方库,无需更改项目,把C#进行到底。
注1:mono运行时 注2:脚本程序集

先上主角! unity3d mono的源代码,这是取自unity3d官方的github库,亲自苦寻google的结果,有源代码就不用分析汇编了(弱项)。
地址:

https://github.com/Unity-Technologies/mono

下载(注意tag版本与开发用的unity3d版本要相同)直接下Zip包就行了,解包,运行脚本编译,需要perl运行库。

编译出了完全能跑的libmono.so,另外还编译出了mono.dll这个 Windows 平台的同等品。
那么开始着手修改源代码了。我猜测能够找到读取Assembly-CSharp.dll这个文件的函数。一旦找到,改变这个函数的流程,去读sd卡上新更新的Assembly-CSharp.dll,就能达到目的。
我运气不错,mono.dll居然能在windows中用vs.net单步调试。
经过跟踪和分析,找到关键函数:
=======================================================
Image* mono_image_open_from_data_full(char* data, ...)
char* data就是Assembly-CSharp.dll在内存中的影像,改变指针吧。(此刻你就是hacker)
=======================================================
unity3d 加载脚本的流程已经显而易见了:
读取assets\bin\Data\Managed\Assembly-CSharp.dll到缓冲,调用libmono.so中的这个函数。
各位看懂了吗,在这个时候,改变char*的指向,搞定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值