Devlooped.Injector 1.1.0
预置前缀
dotnet add package Devlooped.Injector --version 1.1.0
NuGet\Install-Package Devlooped.Injector -Version 1.1.0
<PackageReference Include="Devlooped.Injector" Version="1.1.0" />
paket add Devlooped.Injector --version 1.1.0
#r "nuget: Devlooped.Injector, 1.1.0"
// 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
。
这些文件会自动复制到位于 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 x64
或 dotnet 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 以获取完整示例。
赞助商
此包没有依赖项。
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 |