
別のプロセスのすべてのCLRランタイムとAppDomainにC# EXEまたはDLLアセンブリを注入します。
任意のCLRランタイムおよび別プロセスのAppDomainにC# EXEまたはDLLアセンブリを注入します。注入されたアセンブリは、注入先プロセスのクラスの静的インスタンスにアクセスできるため、その内部状態に影響を与えることができます。
clrinject-cli.exe -p <processId/processName> -a <assemblyFile>
ID <processId> または名前 <processName> のプロセスを開き、<assemblyFile> EXEを注入してMainメソッドを実行します。
-e 読み込まれているすべてのCLRランタイムと作成されたAppDomainを列挙します。-d <#> 指定された<#>番目のAppDomainのみに注入します。番号が指定されないか0の場合は、すべてのAppDomainにアセンブリを注入します。-i <namespace>.<className> 名前空間<namespace>のクラス<className>のインスタンスを作成します。clrinject-cli.exe -p victim.exe -e (victim.exeからランタイムとAppDomainを列挙)clrinject-cli.exe -p 1234 -a "C:\Path\To\invader.exe" -d 2 (invader.exeをプロセスID 1234の2番目のAppDomainに注入)clrinject-cli.exe -p victim.exe -a "C:\Path\To\invader.dll" -i "Invader.Invader" (victim.exe内のすべてのAppDomainにInvaderのインスタンスを作成)clrinject-cli64.exe -p victim64.exe -a "C:\Path\To\invader64.exe" (x64アセンブリをx64プロセスに注入)以下のコードはC#実行可能ファイルとしてコンパイルし、PowerShellプロセスに注入できます。このコードは内部のPowerShellクラスの静的インスタンスにアクセスし、コンソールの文字色を緑に変更します。
using System;
using System.Reflection;
using Microsoft.PowerShell;
using System.Management.Automation.Host;
namespace Invader
{
class Invader
{
static void Main(string[] args)
{
try
{
var powerShellAssembly = typeof(ConsoleShell).Assembly;
var consoleHostType = powerShellAssembly.GetType("Microsoft.PowerShell.ConsoleHost");
var consoleHost = consoleHostType.GetProperty("SingletonInstance", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
var ui = (PSHostUserInterface)consoleHostType.GetProperty("UI").GetValue(consoleHost);
ui.RawUI.ForegroundColor = ConsoleColor.Green;
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
}
注入コマンド:
clrinject-cli64.exe -p powershell.exe -a "C:\Path\To\invader64.exe"
結果:
