Zitat Zitat von Omegavirus Beitrag anzeigen
Kann doch aber eigentlich nicht sein..?
Kann durchaus sein. Die neue Version von Mono.Cecil hat das jetzt anders drinnen. Hier ein Update:

Code:
using System;
using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Collection.Generic;

namespace codeinjection
{
    class Program
    {
        static void Main(string[] args)
        {
            //Assembly laden
            AssemblyDefinition asm = AssemblyDefinition.ReadAssembly("explorer.exe");

        //Definiere Methode "Test()" mit Rückgabewert void

            //Rückgabewert festlegen
            TypeReference returntype = asm.MainModule.Import(typeof(void));

            //Gerüst machen(static void Test())
            MethodDefinition testmethod = new MethodDefinition("Test", MethodAttributes.Private|MethodAttributes.Static, returntype);

            //Code in der Methode Test
            ILProcessor proc = testmethod.Body.GetILProcessor();
            //Definiert eine CIL-Instruktion die einen String mit unserer Meldung auf den Stack legt...
            Instruction msg = proc.Create(OpCodes.Ldstr, "Hello from Test()");

            //und importiert eine Methoden-Referenz auf Console.WriteLine(string), dazu wird
            //der im .NET Framework eingebaute System.Type verwendet
            MethodReference writeline = asm.MainModule.Import(typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)}));

            //Generiert CIL-Code in der Methode Test()

            //Message-String auf den Stack legen
            proc.Append(msg);
            //Console.WriteLine aufruf generieren
            proc.InsertAfter (msg, proc.Create(OpCodes.Call,writeline));

            //Return generieren
            proc.Append (proc.Create(OpCodes.Ret));

            //Injiziert die Methode "Test()" in die Klasse Victim.Program, welche sich im Hauptmodul befindet.
            asm.MainModule.Types["Victim.Program"].Methods.Add(testmethod);


            //Main-Methode modifizieren ,dass die injizierte Code auch ausgeführt wird

            MethodReference testmethod_ref = null;
            foreach (MethodDefinition mdef in asm.MainModule.Types["Victim.Program"].Methods)
            {
                if (mdef.Name == "Test")
                {
                    testmethod_ref = asm.MainModule.Import(mdef);
                }

            }

            Instruction call_test = proc.Create(OpCodes.Call, testmethod_ref);

            asm.EntryPoint.Body.GetILProcessor.InsertBefore (asm.EntryPoint.Body.Instructions[0], call_test);

            //Schreibt Datei auf die Festplatte
            asm.Write("patched.exe");
            Console.ReadLine();

        }
    }
}