我想知道如何将C#DLL注入Unity进程。由于Unity拥有一个CLR(因为它运行单声道MSIL),我想我可以玩反射。
那么我如何将.NET DLL注入到.Net过程中,一旦我在那里,我可以做些什么呢?
例如。假设我有一个使用unity3d作为引擎的游戏,大部分代码都是用C#编写的(这无关紧要,因为统一似乎将unityscript编译为.net无论如何)。我想用我自己的代码扩展这个已编写的代码库。
通常在正常的本机进程中,您将开始反转代码,查找内存中出现的指针和数据结构,随时了解代码。然后在代码中编写相同的结构,获得对该进程内存的rwx访问(通常通过将dll注入到该进程中),然后进入城镇。
因为团结使用.net然而,我想知道是否有更好的方法。我想利用.net框架的反射功能。为此,我想我需要将我的代码注入统一过程。从那里我不知道工作流程可能是什么。
长话短说:我想注入一个DLL,用C#编写的有效负载(希望使用反射而不是指针)进入外部进程(我在编译时无法控制它),并且搞乱进程内部类和函数。
答案 0 :(得分:0)
将DLL放入资产文件夹
Assets/Libs/MyLib.dll
打开任何CS文件,在MonoDevelop解决方案中添加引用。
当您退出MonoDevelop时,Unity将重新获取解决方案文件并导入dll的引用。
您现在可以正常使用您在MonoDevelop中编写的Unity代码中的库。
您的代码与System.IO
等任何其他API之间没有区别。
注意.NET框架版本,不要混合代码。 为安全起见,请使用.NET 2.0。 ......等等......我不记得但 应该是2.0 ...不要引用我的话。
一旦你在那里,你可以正常地做一切。
答案 1 :(得分:0)
一个选项是.cctor函数(模块初始化程序),它不在程序集加载时运行,而是第一次调用到你的dll。
以前,我认为这是你最早可以使用的.net,但显然我错了:
有一个可怕的,讨厌的黑客让你在.net中运行DllMain - C# equivalent of DllMain in C (WinAPI)
这肯定不是.net的创建者想要的东西。使用时要小心。
这会让你的代码运行,一旦进入,你可以像平常一样调用System.Reflection并做你想做的任何事情。