
C# EXE 또는 DLL 어셈블리를 다른 프로세스의 모든 CLR 런타임 및 AppDomain에 주입합니다.
C# EXE 또는 DLL 어셈블리를 다른 프로세스의 모든 CLR 런타임 및 AppDomain에 주입합니다. 주입된 어셈블리는 주입 대상 프로세스의 클래스의 정적 인스턴스에 접근하여 내부 상태에 영향을 줄 수 있습니다.
clrinject-cli.exe -p <processId/processName> -a <assemblyFile>
<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 (ID 1234 프로세스의 두 번째 AppDomain에 invader.exe 주입)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"
결과:
