示例#1
0
        internal static bool InjectManagedInternal(void *processHandle, string assemblyPath, string typeName, string methodName, string argument, InjectionClrVersion clrVersion, out int returnValue, bool wait)
        {
            bool isAssembly;
            InjectionClrVersion clrVersionTemp;
            void *pEnvironment;
            void *threadHandle;
            uint  exitCode;

            returnValue  = 0;
            assemblyPath = Path.GetFullPath(assemblyPath);
            // 获取绝对路径
            IsAssembly(assemblyPath, out isAssembly, out clrVersionTemp);
            if (clrVersion == InjectionClrVersion.Auto)
            {
                clrVersion = clrVersionTemp;
            }
            if (!isAssembly)
            {
                throw new NotSupportedException("Not a valid .NET assembly.");
            }
            if (!InjectUnmanagedInternal(processHandle, Path.Combine(Environment.GetEnvironmentVariable("SystemRoot"), @"System32\mscoree.dll")))
            {
                return(false);
            }
            // 加载对应进程位数的mscoree.dll
            pEnvironment = WriteMachineCode(processHandle, clrVersion, assemblyPath, typeName, methodName, argument);
            // 获取远程进程中启动CLR的函数指针
            if (pEnvironment == null)
            {
                return(false);
            }
            threadHandle = CreateRemoteThread(processHandle, null, 0, pEnvironment, ((byte *)pEnvironment + ReturnValueOffset), 0, null);
            if (threadHandle == null)
            {
                return(false);
            }
            if (wait)
            {
                WaitForSingleObject(threadHandle, INFINITE);
                // 等待线程结束
                if (!GetExitCodeThread(threadHandle, out exitCode))
                {
                    return(false);
                }
                if (!NativeProcess.ReadInt32Internal(processHandle, ((byte *)pEnvironment + ReturnValueOffset), out returnValue))
                {
                    return(false);
                }
                // 获取程序集中被调用方法的返回值
                if (!NativeProcess.FreeMemoryInternal(processHandle, pEnvironment))
                {
                    return(false);
                }
                return(exitCode == 0);
            }
            return(true);
        }