2008-10-23 5 views
7

좋아, 제 응용 프로그램이 메모리에 방출 (x86) 명령어를 실행하고 페이지를 실행 가능하게한다고 말합니다. JITted 메소드의 메소드 스텁을 내 보낸 명령어 스트림을 가리 키도록 변경하는 방법이 있습니까?.net JIT 컴파일러를 속여 다른 방법을 실행하는 방법이 있습니까?

예컨대 :

내가 임의의 무언가를 메모리에 x86 명령어 스트림을 생성 한 것으로 가정 해 보겠습니다. 이제 'int Target()'메서드가 있다고 가정 해 보겠습니다. 나는 아직 그것을 부르지 않았으므로 편집되지 않았다.

  1. 가 대상의 그루터기에 포인터를 가져
  2. 가 내 방출 명령 스트림을 가리 확인 : 어떤 방식이있다.

나는 이 같은 하이재킹을 방지하기 위해 실질적으로 닷넷의 모든 단일 보안 기능이 설계되어 있음을 알고 있습니다. 그러나 호스팅 API를 통해 가능할 수 있습니까?

답변

6

예 할 수 있습니다.

mscorjit의 Hook getJit 메소드. 그리고 언제든지 모든 방법에 지팅이 필요하다는 메시지가 표시됩니다. 원하는대로 전달할 수 있습니다. 일부 .net protectors는 이와 같이 작동합니다.

10

이것은 프로파일 링 API를 통해 가능합니다. 나는 그것을 사용한 적이 없지만 TypeMock에서 비슷한 목적으로 사용됩니다.

편집 : MSDN 블로그에 좋은 게시가 있었고, 사냥을 할 것입니다.

편집 2 : Doh, first hit!

+0

어딘가에 'IL rewriting'이 있었다고 회상했습니다. – leppie

+0

예. 나는 막 말하려고했다. 일리노이처럼 보입니다. – TraumaPony

1

당신이 말하는 것처럼 쉽지 않을 수도 있습니다. 올바르게 기억한다면 코드에는 컴파일되지 않은 메서드에 대한 JIT 컴파일러의 주소가 포함됩니다. 따라서이 메소드를 호출하려고하면 JIT 컴파일러가 작업을 수행하고 새로 컴파일 된 메소드에 주소를 삽입합니다. 이 주소를 변경할 수 있으면 자신의 코드에 대한 호출을 삽입 할 수 있습니다. 어떻게 당신이 이것을 탐지하지 못하게 할 수 있을까요? CLR이 이러한 종류의 조작을 감지하기를 바랍니다.

MSIL을 수정하려고하지 않으므로 Profiling API가이 경우 Leppie가 제안한 것처럼 도움이되지 않는다고 생각합니다. 그렇지 않다면 this article은 TypeMock이 수행하는 것을 구현하기 위해 무엇을해야 하는지를 설명 할 때 유용 할 수 있습니다.

0

ICorProfiler를 사용하고 jits가 실행되기 전에 메서드를 다시 작성할 수있을뿐 아니라 ICorDebug (MDBG는 인터페이스가 관리 됨)을 사용할 수 있습니다. 중단 점이 있으면 인터셉트 코드에 다음 명령문을 설정합니다. 이 모든 프로세스는 코드에서 수행 할 수 있지만 실제로 방해가되며이를 조정하는 "감시자"프로세스가 필요합니다.

또 다른 가치있는 것은 속성을 적용 할 때 입력 및 종료 방법을 제공하는 PostSharp 프로젝트입니다.