Este projeto implementa uma biblioteca de injeção .NET Assembly (é inspirada no projeto snoopwpf). O processo remoto pode ser gerenciado ou não gerenciado.
Quando você deseja injetar um assembly em um processo remoto você deve considerar os seguintes aspectos:
Se as pré-condições acima forem satisfeitas, você poderá injetar um assembly e invocar um método de ativação. Existem três possibilidades para invocar o método de ativação:
Esta biblioteca também é usada pelo Shed para injetar uma DLL em um processo remoto. Você pode ver um vídeo aqui.
Para exemplos práticos veja o projeto TestRunner.
Se o assembly injetado tiver alguma dependência de assemblies .NET não padrão, você poderá adicionar essas dependências com o método AddDependency
.
Se o assembly injetado precisar carregar algum arquivo externo para funcionar corretamente (como um arquivo de configuração), você pode especificá-los com o método AddFile
. Este método copiará o arquivo especificado no diretório de trabalho do processo injetado.
Em alguns casos é necessário passar um argumento para o método chamado no assembly injetado. Isso é conseguido passando um objeto context
para o método Inject
. Em seguida, o método Injected
precisa converter o objeto context
para o tipo real (consulte AssemblyWithMethodAcceptingAnArgument
para obter um exemplo). A estrutura usa a classe BinaryFormatter
para serializar o objeto context
, portanto, certifique-se de que o objeto especificado possa ser serializado.
Vamos considerar o seguinte código:
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!");
}
}
}
para injetar o Assembly gerado a partir do código acima basta utilizar o seguinte código:
var pid = 1234;
var injector = new Injector(pid, Assembly.LoadFile("AssemblyToInject.dll"));
var injectionResult = injector.Inject();
Para mais exemplos, dê uma olhada na pasta de exemplos.
O ManagedInjector é atualmente desenvolvido usando o VisualStudio 2017 Community Edition (certifique-se de ter a versão mais recente instalada). Para construir o código-fonte, certifique-se de:
build.bat
Usamos SemVer para versionamento. Para as versões disponíveis, consulte as tags neste repositório.
O Managed Injector é licenciado sob Creative Commons.