
Zitat von
Omegavirus
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();
}
}
}