Pergunta

Ok, dizer que a minha candidatura está emitindo instruções (x 86) na memória, tornando o executável página, etc. Existe alguma maneira de alterar o stub método de um método não-JITted para apontar para o meu fluxo de instrução emitida?

por exemplo:.

Suponha que eu tenha criado um fluxo de instruções x86 na memória, o que faz algo arbitrário. Agora, suponha ainda que eu tenho um método 'int Target ()'. Eu não tê-lo chamado ainda, por isso não foi compilado. Existe alguma maneira de:

  1. Obter o ponteiro para rascunho da Target
  2. Faça-lo apontar para o meu fluxo de instrução emitida.

Eu percebo que praticamente todos os recurso de segurança único da Net é projetado para evitar sequestrando assim. Mas é possível através de, por exemplo, a API de hospedagem?

Foi útil?

Solução

Sim, você pode fazer!

Gancho método getJit de mscorjit. E você será solicitado cada vez que anymethod exigem Jitting. você pode passar o que quiser. Alguns protetores .net funciona assim.

Outras dicas

Isso é possível por meio da API Profiling. Eu nunca usei isso, mas ele é usado para um propósito similar em TypeMock.

Edit: Eu acho que foi uma ótima postagem nos blogs MSDN, vai caçar para ele

.

Edit 2: Doh, primeiro hit !

Como você diz isso não é fácil e até pode não ser possível. Se bem me lembro o código irá incluir o endereço do compilador JIT para um método, que não tenha sido compilado. Então, quando você tenta chamar esse método, o compilador JIT irá fazer o seu trabalho e insira o endereço para o método recém-compilada. Se você pode alterar este endereço, você pode ser capaz de inserir uma chamada para o seu próprio código. Como você fazer isso sem ser detectado está além de mim. Eu certamente espero que o CLR irá detectar este tipo de adulteração.

Eu não acho que a API de perfil irá ajudá-lo neste caso (como sugerido por leppie), como você não está tentando modificar MSIL. Se você pensar de outra maneira este artigo pode ser útil, pois descreve o que você deve fazer para implementar o que TypeMock está fazendo.

Além de ser capaz de usar ICorProfiler e reescrever seu método antes que ele jits, você poderia usar ICorDebug (MDBG conseguiu interface). Definir um ponto de interrupção, quando os hits de ponto de interrupção definir a próxima instrução ao seu código interceptar. Todo este processo pode ser feito a partir do código, mas é realmente intrusiva e você vai precisar de um processo de "observador" para coordenar isso.

Outra coisa vale a pena olhar é o PostSharp projeto que lhe dá métodos de entrada e saída, se você aplicar atributos .

Eu não iria tentar e mexer diretamente com a memória e eu não tenho certeza que é mesmo possível em vez disso você pode usar a API profiler - há alguns exemplos lá fora, mas nenhuma documentação real. Dê uma olhada no MSDN artigo da revista - reescrever o código MSIL na mosca com o .NET quadro Profiling API

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top