示例#1
0
        /// <summary>
        /// Creates an <see cref="IAssemblyImage"/> that provides access into a Unity application's managed memory.
        /// </summary>
        /// <param name="processId">
        /// The id of the Unity process to be inspected.
        /// </param>
        /// <param name="assemblyName">
        /// The name of the assembly to be inspected. The default setting of 'Assembly-CSharp' is probably what you want.
        /// </param>
        /// <returns>
        /// An <see cref="IAssemblyImage"/> that provides access into a Unity application's managed memory.
        /// </returns>
        public static IAssemblyImage Create(int processId, string assemblyName = "Assembly-CSharp")
        {
            if (Environment.OSVersion.Platform != PlatformID.Win32NT)
            {
                throw new InvalidOperationException(
                          "This library reads data directly from a process's memory, so is platform specific "
                          + "and only runs under Windows. It might be possible to get it running under macOS, but...");
            }

            var process    = new ProcessFacade(processId);
            var monoModule = AssemblyImageFactory.GetMonoModule(process);
            var moduleDump = process.ReadModule(monoModule);
            var rootDomainFunctionAddress = AssemblyImageFactory.GetRootDomainFunctionAddress(moduleDump, monoModule);

            return(AssemblyImageFactory.GetAssemblyImage(process, assemblyName, rootDomainFunctionAddress));
        }
示例#2
0
        public static IAssemblyImage Create([NotNull] UnityProcessFacade process, string assemblyName = "Assembly-CSharp")
        {
            if (process == null)
            {
                throw new ArgumentNullException("process parameter cannot be null");
            }

            var    monoModule = process.GetMonoModule();
            IntPtr rootDomainFunctionAddress;

            if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
            {
                rootDomainFunctionAddress = GetRootDomainFunctionAddressMachOFormat(monoModule);
            }
            else
            {
                var moduleDump = process.ReadModule(monoModule);
                rootDomainFunctionAddress = AssemblyImageFactory.GetRootDomainFunctionAddressPEFormat(moduleDump, monoModule, process.Is64Bits);
            }

            return(AssemblyImageFactory.GetAssemblyImage(process, assemblyName, rootDomainFunctionAddress));
        }