2008-10-23 13 views
7

Ok, sagen Sie, dass meine Anwendung (x86) Befehle in den Speicher ausgibt, so dass die Seite ausführbar wird, usw. Gibt es eine Möglichkeit, den Methoden-Stub einer un-JITted-Methode auf meinen ausgegebenen Befehlsstrom zu zeigen?Gibt es eine Möglichkeit, den .net-JIT-Compiler dazu zu bringen, eine andere Methode auszuführen?

Z. B .:

Angenommen, ich habe einen x86-Befehlsstrom im Speicher erzeugt, die etwas willkürlich tut. Angenommen, ich habe eine Methode 'int Target()'. Ich habe es noch nicht aufgerufen, also wurde es nicht kompiliert. Gibt es eine Möglichkeit zu:

  1. Holen Sie sich den Zeiger auf Ziel-Stub
  2. Machen Sie es zu meinem emittierten Befehlsstrom zeigen.

Mir ist klar, dass praktisch jede einzelne Sicherheitsfunktion von .Net entwickelt, um Hijacking wie dies zu verhindern. Aber ist es möglich durch, sagen wir, die Hosting-API?

Antwort

6

ja können Sie tun!

Hook getJit-Methode von mscorjit. Und Sie werden gefragt, jedes Mal, wenn Methode Jitting erfordert. können Sie passieren, was Sie wollen. Einige .net-Protektoren funktionieren so.

10

Dies ist über die Profiling-API möglich. Ich habe es nie benutzt, aber es wird für einen ähnlichen Zweck in TypeMock verwendet.

Edit: Ich denke, es gab eine schöne Posting auf den MSDN-Blogs, wird Jagd auf sie gehen.

Edit 2: Doh, first hit!

+0

Ich erinnerte mich, dass es irgendwo 'IL rewriting' hatte. – leppie

+0

Ja. Ich wollte das gerade sagen. Es sieht so aus als wäre es nur IL. – TraumaPony

1

Wie Sie sagen, das ist nicht einfach und es ist möglicherweise nicht einmal möglich. Wenn ich mich richtig erinnere, wird der Code die Adresse des JIT-Compilers für eine Methode enthalten, die nicht kompiliert wurde. Wenn Sie also versuchen, diese Methode aufzurufen, wird der JIT-Compiler seine Aufgabe ausführen und die Adresse in die neu kompilierte Methode einfügen. Wenn Sie diese Adresse ändern können, können Sie möglicherweise einen Anruf in Ihren eigenen Code einfügen. Wie du das unbemerkt tun würdest, ist jenseits von mir. Ich hoffe natürlich, dass die CLR diese Art von Manipulation erkennt.

Ich glaube nicht, dass die Profiling-API Ihnen in diesem Fall helfen wird (wie von Leppie vorgeschlagen), da Sie nicht versuchen, MSIL zu modifizieren. Wenn Sie anders denken, kann this article von Nutzen sein, da es beschreibt, was Sie tun müssen, um zu implementieren, was TypeMock tut.

0

Zusätzlich zur Möglichkeit, ICorProfiler zu verwenden und Ihre Methode vor dem Jits neu zu schreiben, können Sie ICorDebug verwenden (MDBG hat eine Schnittstelle hergestellt). Setzen Sie einen Haltepunkt, wenn der Haltepunkttreffer die nächste Anweisung für Ihren Code zum Abfangen setzt. All dieser Prozess kann vom Code aus durchgeführt werden, ist aber sehr aufdringlich und Sie benötigen einen "Beobachter" -Prozess, um dies zu koordinieren.

Eine andere Sache, die sich lohnt, ist das Projekt PostSharp, das Ihnen Ein- und Ausstiegsmethoden zur Verfügung stellt, wenn Sie Attribute anwenden.

0

Ich würde nicht versuchen, direkt mit dem Speicher zu verwirren und ich bin mir nicht sicher, es ist sogar möglich, stattdessen können Sie die Profiler-API verwenden - es gibt ein paar Beispiele, aber keine echte Dokumentation. Werfen Sie einen Blick auf MSDN Magazin Artikel - Rewrite MSIL Code on the Fly with the .NET Framework Profiling API

Verwandte Themen