Fügen Sie einen Versuch-Fang mit Mono Cecil hinzu

8

Ich verwende Mono Cecil, um Code in eine andere Methode zu injizieren. Ich möchte einen Try-Catch-Block um meinen Code einfügen.

Also habe ich eine HelloWorld.exe mit einem try catch-Block geschrieben und dekompiliert.

Im Reflector für den Try-Catch sieht das so aus:

%Vor%

Wie kann ich einen solchen Versuch mit Mono Cecil injizieren?

    
cyptus 17.06.2012, 20:23
quelle

1 Antwort

19

Exception-Handler mit Mono.Cecil hinzufügen ist nicht schwierig, es erfordert nur, dass Sie wissen, wie Exception-Handler in den Metadaten angeordnet sind.

Nehmen wir an, Sie haben die C # -Methode:

%Vor%

Wenn Sie es dekompilieren, sollte es ungefähr so ​​aussehen:

%Vor%

Nehmen wir nun an, Sie möchten Code in diese Methode einfügen, der dem C # -Code ähnlich ist:

%Vor%

Das heißt, Sie möchten den vorhandenen Code einfach in einen try-catch-Handler einfügen. Sie können es leicht mit Cecil auf diese Weise tun:

%Vor%

Dieser Code manipuliert die vorherige Methode so, dass sie so aussieht:

%Vor%

Wir fügen drei neue Anweisungen hinzu: einen Aufruf von Console.WriteLine, einen Befehl, um den Catch-Handler ordnungsgemäß zu beenden, und schließlich (ein Wortspiel), ein ret. Dann erstellen wir einfach eine ExceptionHandler-Instanz, die einen try catch-Handler darstellt, dessen try den vorhandenen body umfasst und dessen catch die WriteLine-Anweisung ist.

Es ist wichtig zu beachten, dass die Endeanweisung eines Bereichs nicht innerhalb des Bereichs enthalten ist. Es ist im Grunde ein [TryStart: TryEnd [Bereich.

    
Jb Evain 17.06.2012, 21:27
quelle

Tags und Links