Devlooped.Injector 1.1.0

预置前缀
dotnet add package Devlooped.Injector --version 1.1.0                
NuGet\Install-Package Devlooped.Injector -Version 1.1.0                
命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用了 NuGet 模块版本的 Install-Package
<PackageReference Include="Devlooped.Injector" Version="1.1.0" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以便引用该软件包。
paket add Devlooped.Injector --version 1.1.0                
#r "nuget: Devlooped.Injector, 1.1.0"                
#r 指令可以在 F# Interactive 和 Polyglot Notebooks 中使用。将其复制到交互式工具或脚本的源代码中以便引用软件包。
// Install Devlooped.Injector as a Cake Addin
#addin nuget:?package=Devlooped.Injector&version=1.1.0

// Install Devlooped.Injector as a Cake Tool
#tool nuget:?package=Devlooped.Injector&version=1.1.0                

允许将 .NET 代码注入到任何 Windows 进程中。

在很大程度上基于 Cory Plott's Snoop

唯一的要求是注入的代码必须是一个公共静态类上的公共静态方法,例如

namespace Sample;

public static class Startup
{
    public static void Start(string arg1, int arg2, bool debug)
    {
        if (debug)
            Debugger.Launch();

        // do stuff with arg1, arg2, etc.
        // note args are typed :)
    }
}

注意:支持参数类型转换,并且通过与参数类型关联的 TypeConverter 来实现。

用法

此软件包有两种主要用法

  • 从 AnyCPU 代码:您的代码与位数无关,因此可以注入到目标进程,无论它是 x86 还是 x64。
  • 从 x86/x64 代码:您正在注入与调用代码相同位数的目标进程。

AnyCPU 代码

这可能是更常见的场景。您有 AnyCPU 的 .NET 代码,因此可以不管目标进程的位数都可以注入。当引用此软件包时,您将得到两个(内容)文件夹,每个文件夹包含一个与每种架构对应的辅助 Injector.exe

Screenshot

这些文件会自动复制到位于 Injector\[x86|x64]\Injector.exe 下的输出目录(在执行 dotnet publish 的时候也会包含在内)。这允许您运行与目标进程位匹配的相关可执行文件。

Injector.exe 使用方法

> Injector.exe -?
Usage: Injector.exe <mainWindowHandle> <assemblyFile> <typeName> <methodName>

Arguments:
  <processMainWindowHandle>   IntPtr of the main window handle of the process to inject, i.e. Process.MainWindowHandle.
  <assemblyFile>              The full path to the .NET assembly to load in the remote process.
  <typeName>                  Full type name of the public static class to invoke in the remote process.
  <methodName>                Name of the static method in that class to invoke in the remote process. Must be a
                              static method, which can also receive arguments, such as 'Start:true:42'.

要检测目标进程的位数,您可以使用以下 Interop

static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
}

以下代码将查找目标进程(在这个例子中,我们以 devenv.exe(Visual Studio 主进程)为例),并调用正确的可执行文件

var targetProcess = System.Diagnostics.Process.GetProcessesByName("devenv.exe")[0];

NativeMethods.IsWow64Process(targetProcess.Handle, out var isWow);
var platform = isWow ? "x86" : "x64";

Process.Start(Path.Combine("Injector", platform, "Injector.exe"),
    // IntPtr of the main window handle of the process to inject
    targetProcess.MainWindowHandle + " " +
    // The full path to the .NET assembly to load in the remote process
    Assembly.GetExecutingAssembly().Location + " " +
    // Full type name of the public static class to invoke in the remote process
    typeof(Startup).FullName + " " +
    // Name of the static method in that class to invoke in the remote process, 
    // and any parameters.
    $"{nameof(Startup.Start)}:hello:42:true");

注意:我们可以向 Startup.Start 方法(如图例所示)传递类型化参数,类型转换将自动应用。

平台特定代码

在构建平台特定代码时,项目通常会有(例如,对于控制台应用程序)

<Project Sdk="Microsoft.NET.Sdk">
	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net6.0</TargetFramework>
		<Platforms>x64;x86</Platforms>
	</PropertyGroup>
</Project>

然后您可以通过下面的命令为任一平台进行构建:dotnet build --arch x64dotnet build --arch x86

在这种情况下,调用代码(打算将自己注入远程进程)的位数必须与目标进程的位数匹配。由于两者位数相同,您可以直接使用代码中自动引用的程序集,而不需要像第一种情况那样调用辅助的 Injector.exe

否则代码看起来与前面情况类似

var targetProcess = System.Diagnostics.Process.GetProcessesByName("devenv.exe")[0];

// NOTE: target process bitness must match our own assembly architecture for 
// this to succeed.
Devlooped.Injector.Launch(
    // IntPtr of the main window handle of the process to inject
    targetProcess.MainWindowHandle,
    // The full path to the .NET assembly to load in the remote process
    Assembly.GetExecutingAssembly().Location,
    // Full type name of the public static class to invoke in the remote process
    typeof(Startup).FullName,
    // Name of the static method in that class to invoke in the remote process, 
    // and any parameters.
    $"{nameof(Startup.Start)}:hello:42:true");

注意:在 AnyCPU 项目中,Devlooped.Injector 类型将不可用

详见 Program.cs 以获取完整示例。

赞助商

Clarius Org Christian Findlay C. Augusto Proiete Kirill Osenkov MFB Technologies, Inc. SandRock Eric C Andy Gocke

Sponsor this project  

了解更多关于 GitHub Sponsors

此包中没有支持的框架资源。

了解更多关于 目标框架.NET Standard

此包没有依赖项。

NuGet 包 (1)

显示依赖于 Devlooped.Injector 的顶部 1 个 NuGet 包

下载
xunit.vsix

允许创建可靠、灵活、快速的 VS SDK 集成(VSIX)测试,该测试可以使用任何支持 xUnit 的运行器执行,例如 Visual Studio 内置测试资源管理器或 TestDriven.NET。

GitHub 代码库

该包没有被任何流行的 GitHub 代码库使用。

版本 下载 最后更新
1.1.0 1,139 9/23/2022
1.0.1 428 9/9/2022
1.0.0-rc 217 9/9/2022
1.0.0-beta 222 9/9/2022