Folgendes Problem:
Ich habe ein vorhandenes Programm welches mittels folgender Zeile eine managed DLL aus einem Filestream läd, an dieser Stelle möchte ich eine eigene DLL untermogeln.
Code:
// FullData ist n Bytearray welcher die Daten der DLL enthält. (Welche ich durch meine eigene ausgetauscht habe)
private Type Instance;
Instance = Assembly.Load(FullData).GetType("Share");
Es wird hier direkt eine vorhandene Instanz geladen, sie wird nicht erstellt. Direkt danach werden Methoden der Instanz aufgerufen. Beispielsweise so:
Code:
Instance.GetMethod("SetID").Invoke(null, new object[] { ID });
Bisher habe ich eine DLL erstellt in der ich eine Klasse deklariert habe welche entsprechende Methoden enthält und meine gewünschten Werte zurückgibt
:
Code:
using trallala...
namespace xy
{
public class TShare
{
public TShare()
{
// Constructor krämpel
}
// Methode x, y und z...
}
}
Wie erstelle ich jetzt in der DLL die Instanz "Share" von meiner Klasse damit sie von der vorhandenen App benutzt werden kann?
Edit: Erstes Problem gelöst, nun kommt das Nächste. Ich habe entsprechende Stelle aus der App nachgebaut um das Ganze vernünftig debuggen zu können. Hier funktioniert jetzt alles, ich kann z.B. in der SetID Methode oder im Constructor von Share die Funktion MessageBox.Show verwenden um mir etwas anzeigen zu lassen.
Wenn ich den Kram jetzt aber von der vorhandenen App aufrufen lasse bekomme ich Exceptions folgender Art: Ein Aufrufziel hat einen Ausnahmefehler verursacht.
Das passiert sobald in den Methoden etwas "getan" wird, also z.B. der Versuch eine Messagebox anzuzeigen (was in meiner Testapp geht). Wenn nur ein einfaches return in der Methode steht läuft alles. Ich kann nichtmal sehen was passiert da ich zu dämlich bin mir den Kram ohne Messagebox anzeigen zu lassen, ich kann die vorhandene App ja nicht debuggen. (oder?)
Was kann sowas auslösen? Verschiedene .net Versionen der Assemblies? Der Obfuscator welcher über die vorhandene App gebügelt wurde?
Wenn man den Müll gegen .net 2.0 Kompilliert klappts auch mit der Injektion
3. Problem:
Eine Schutzmaßnahme von Netseal ist es eine zu definierende Methode erst nach erfolgreichem Login aufzurufen. Diese wird als Delegate an eine Methode in der DLL übergeben. Die Lösung ist natürlich die Methode einfach so aufzurufen sofern sie definiert wird. Scheitert allerdings an meinen nicht vorhandenen c# Kenntnissen.
Code:
public static void SetRunHook(Delegate d)
{
try
{
d.Method.Invoke(null, null);
}
catch (Exception ex)
{
File.AppendAllText("pwnseal.log", "Exception: " + ex.Message);
}
return;
}
Das war mein Ansatz. So wie ich das Verstanden habe darf der erste Parameter von Invoke() nicht null sein wenn die aufzurufende Methode nicht static ist. Naja, da dies der Fall ist bekomme ich folgende Exception: Die nicht-statische Methode erfordert ein Ziel.
Was kann ich nun statt null verwenden? *kratzkratz*