이 프로젝트는 .NET 어셈블리 주입 라이브러리를 구현합니다(snoopwpf 프로젝트에서 영감을 얻었습니다). 원격 프로세스는 관리되거나 관리되지 않는 프로세스일 수 있습니다.
원격 프로세스에 어셈블리를 주입하려면 다음 측면을 고려해야 합니다.
위의 사전 조건이 충족되면 어셈블리를 삽입하고 활성화 메서드를 호출할 수 있습니다. 활성화 메서드를 호출하는 방법에는 세 가지가 있습니다.
이 라이브러리는 Shed가 원격 프로세스에 DLL을 주입하는 데에도 사용됩니다. 여기에서 비디오를 볼 수 있습니다.
실제 예제는 TestRunner 프로젝트를 참조하세요.
삽입된 어셈블리에 표준 .NET 어셈블리가 아닌 어셈블리에 대한 종속성이 있는 경우 AddDependency
메서드를 사용하여 해당 종속성을 추가할 수 있습니다.
주입된 어셈블리가 올바르게 작동하기 위해 일부 외부 파일(예: 구성 파일)을 로드해야 하는 경우 AddFile
메서드를 사용하여 해당 파일을 지정할 수 있습니다. 이 메서드는 삽입된 프로세스의 작업 디렉터리에 지정된 파일을 복사합니다.
어떤 경우에는 주입된 어셈블리에서 호출되는 메서드에 인수를 전달해야 합니다. 이는 context
개체를 Inject
메서드에 전달하여 수행됩니다. 그런 다음 Injected
메서드는 context
개체를 실제 형식으로 캐스팅해야 합니다(예제는 AssemblyWithMethodAcceptingAnArgument
참조). 프레임워크는 BinaryFormatter
클래스를 사용하여 context
개체를 직렬화하므로 지정된 개체를 직렬화할 수 있는지 확인하십시오.
다음 코드를 고려해 보겠습니다.
using System;
namespace InjectedAssembly
{
public class Main
{
// we use a default injection method name in order to execute our code in the remote process
private static void Inject()
{
Console.WriteLine("Hello world from the injected process!");
}
}
}
위 코드에서 생성된 어셈블리를 삽입하려면 다음 코드를 사용하면 충분합니다.
var pid = 1234;
var injector = new Injector(pid, Assembly.LoadFile("AssemblyToInject.dll"));
var injectionResult = injector.Inject();
더 많은 예제를 보려면 예제 폴더를 살펴보세요.
ManagedInjector 는 현재 VisualStudio 2017 Community Edition을 사용하여 개발되었습니다(최신 버전이 설치되어 있는지 확인하세요). 소스 코드를 빌드하려면 다음을 수행해야 합니다.
build.bat
실행 버전 관리를 위해 SemVer를 사용합니다. 사용 가능한 버전은 이 저장소의 태그를 참조하세요.
Managed Injector는 Creative Commons에 따라 라이센스가 부여됩니다.