利用场景
- 当前项目编辑器中不方便存放大概提交扩展代码
- 雷同的扩展功能须要在多个项目(编辑器)中利用
- 项目开辟中,偶尔暂时须要利用一个功能,想随时利用随时卸载
设计思绪
- 利用进程注入,将一个c/c++ dll注入到当前运行的unity编辑器中
- 利用c/c++ dll调用mono的函数接口,比如mono_get_root_domain去获取unity的domain动态去加载想要加载的外部的扩展c# dll
- 在扩展c# dll中调用 EditorUtility.RequestScriptReload();来触发unity编辑器的重新编译,重载编辑器中的domain实现卸载外部c# dll的功能
- 在扩展c# dll中绑定EditorApplication.update事件,用来处置处罚主线程的操纵,比如AssetDatabase.Refresh();
- 利用jsonrpc协议,用来调用c# dll中的部分封装功能函数,可以实如今unity编辑器直接展示扩展窗口,大概将数据传至其他编辑器进行展示
开端实现
- //远程进程插入dll bypid
- bool DllInject::nsertDllToProcessByPid(DWORD Pid, const char* pDllName)
- {
- // 提升权限
- //ImproveProcessPri();
- // 获取要插入的进程ID
- DWORD dwIDExplorer = Pid;
- if (dwIDExplorer == 0)
- {
- MEMBOX("Get Pro ID Error!\n");
- return false;
- }
- // 打开进程
- HANDLE hProcess = OpenProcess(/*PROCESS_ALL_ACCESS*/0x1F0FFF, FALSE, dwIDExplorer);
- if (hProcess == NULL)
- {
- MEMBOX("Open Process Error!\n");
- return false;
- }
- // 分配空间
- void* pDllPath = VirtualAllocEx(hProcess, 0, strlen(pDllName) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- if (!pDllPath)
- {
- MEMBOX("pRemoteThread = NULL!\n");
- return false;
- }
- if (!WriteProcessMemory(hProcess, pDllPath, pDllName, strlen(pDllName) + 1, 0))
- {
- MEMBOX("WriteProcessMemory Fail!\n");
- return false;
- }
- //看有Game.exe 是否打开 . 打开了 GetProcAddress 是不准的
- /*
- 1. 检测静态 变量是否存储
- 2.
- */
-
- //卸载保护
- HMODULE h = GetModuleHandle("MessageHis.dat");
- if (h != NULL)
- FreeLibrary(h);
- PROC AdrMyDllDir = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");//(PROC)::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryA");
- // 创建远程线程
- HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)AdrMyDllDir, pDllPath, 0, 0);
- if (!hThread)
- {
- MEMBOX("Remote thread faile.");
- //AfxMessageBox("远程线程创建失败");
- return false;
- }
- WaitForSingleObject(hThread, INFINITE); //等待运行完成
- CloseHandle(hThread);//这个CloseHandle是不会关掉远程线程的,TerminateThread能关掉
- VirtualFreeEx(hProcess, pDllPath, strlen(pDllName) + 1, MEM_RELEASE);
- CloseHandle(hProcess);
- MEMBOX("Remote Inject Dll Success");
- //AfxMessageBox("注入成功");
- return true;
- }
复制代码- bool MonoInjecter::InjectMonoAssembly()
- {
- //GetProcAddress
- /* grab the root domain */
- // domain = fnGetRootDomain();
- // fnThreadAttach(domain);
- log_trace("Hello %s %s", "fnGeDomainFriendlyName", fnGeDomainFriendlyName(domain));
- log_trace("Hello %s %s", "fnGetRootDir", fnGetRootDir());
- //----------------------------
- domain = fnGetDomainById(1);
- log_trace("Hello %s %ld", "fnGetRootDomain", domain);
- fnThreadAttach(domain);
- log_trace("Hello %s %s", "fnGeDomainFriendlyName", fnGeDomainFriendlyName(domain));
- log_trace("Hello %s %s", "fnGetRootDir", fnGetRootDir());
- //----------------------------
- /* open payload assembly */
- std::string assemblyDir;
- /* Grab our root directory*/
- assemblyDir.append(fnGetRootDir());
- assemblyDir.append(ASSEMBLY_PATH);
- assembly = fnAssemblyOpen(assemblyDir.c_str(), NULL);
- if (assembly == NULL) return false;
- log_trace("Hello %s %ld", "fnAssemblyOpen", assembly);
- image = fnAssemblyGetImage(assembly);
- if (image == NULL) return false;
- log_trace("Hello %s %ld", "fnAssemblyGetImage", image);
- klass = fnClassFromName(image, PAYLOAD_NAMESPACE, PAYLOAD_CLASS);
- if (klass == NULL) return false;
- log_trace("Hello %s %ld", "fnClassFromName", klass);
- /* grab the hack entrypoint */
- method = fnMethodFromName(klass, PAYLOAD_MAIN, 0);
- if (method == NULL) return false;
- log_trace("Hello %s %ld", "fnMethodFromName", method);
- /* call our entrypoint */
- fnRuntimeInvoke(method, NULL, NULL, NULL);
- log_trace("\nHello %s", "run mono dll!\n\n");
- return true;
- }
复制代码
- 简朴实现一个编辑器工具用来查找当前已经打开的unity编辑器进程,然后进行注入

- 由注入的c# dll调用的测试输出, 当前编辑器中是没有任何代码的

测试情况
- 操纵体系体系: windows 11 64位`, (不兼容32位)
- unity版本: 2021.3.15f1
- .NET6.0(第三方编辑器的实现)
来源:https://blog.csdn.net/qq992817263/article/details/131645576
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |