热更新

来源:互联网 发布:创意礼物知乎 编辑:程序博客网 时间:2024/04/29 07:46
我计划通过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*的指向,搞定。
0 0
原创粉丝点击