einmal in der SSLSocket Klasse
Code:
static SslSocket()
{
SslSocket.BattleNetCertificateThumbprint = "673D9D1072B625CAD95CB47BF0F0F512233E39FD";
SslSocket.s_log = new LogThreadHelper("SslSocket");
SslSocket.s_rootCertificate = new X509Certificate2(Encoding.get_ASCII().GetBytes("-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----"));
}
außerdem in der selben Klasse
Code:
private static bool OnValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
Und hier nochmal wie man mit Mono.Cecil die Assembly-Csharp.dll so patcht das sie eine eigene DLL läd
Code:
public class hook
{
static string assemblypath = @"D:\hstest\hstest\ass\Assembly-CSharp.dll";
static string injectpath = @"D:\hstest\hstest\ass\loaderdll.dll";
static string assemblypathfinal = @"D:\hstest\hstest\ass\finalAssembly-CSharp.dll";
static string saveas = @"D:\hstest\ass\mod-csharp.dll";
public static void injection()
{
var typeName = "Hub";
var methodName = "Start";
var assembly = AssemblyDefinition.ReadAssembly(assemblypath);
var injassembly = AssemblyDefinition.ReadAssembly(injectpath);
var typedefinj = injassembly.MainModule.Types.Single(t=> t.Name == "loader");
var injmethDefinition = typedefinj.Methods.Single(t => t.Name == "init");
var typeDefinition = assembly.MainModule.Types.Single(t => t.Name == typeName);
var methDefinition = typeDefinition.Methods.Single(t => t.Name == methodName);
var setMethodWriter = methDefinition.Body.GetILProcessor();
var firstExistingInstruction = setMethodWriter.Body.Instructions[0];
setMethodWriter.InsertBefore(firstExistingInstruction, setMethodWriter.Create(OpCodes.Call, assembly.MainModule.Import(injmethDefinition.Resolve())));
assembly.Write(@"D:\test.dll");
}
In diesem Fall wird die Funktion Hub.Start Verändert und ruft aus der Loader.dll die Function loader.init auf.
Kleine Anmerkung noch, Console.Writeline kann man hier schön zum Debuggen benutzen da sie in das von Unity angelegte outputlog schreibt.
Edit:
Kleines Update, hab etwas rumgedoktort und hab hier mal einen Loadercode angehängt, hoffe mir reißt keiner den Kopf runter, ich weiß es ist kein Schöner Code, aber er tut immerhin was er soll
Der Plan ist folgender, durch die Möglichkeit eine Fremde dll laden zu lassen, kann man das ganze natürlich auch etwas einfacher machen für jeden der gerne etwas mit rumspielen mag
Die Loaderdll die wir aufrufen könnte z.b. Folgenden Code haben.
Dieser Code sollte folgendes machen, nachdem der Loader bereits von Heartstone aufgerufen wurde, läd er alle dlls im Verzeichniss c:\myhsplugins\ , deren Dateien dem Format hs*.dll entsprechen und ruft danach die Funktion Init im Namespace hsplugintest und der Klasse HsPlugin auf. Dadurch kann man dafür Sorgen das wir selbst wenn dieser Weg des Ladens nichtmehr funktioniert, nicht der gesammte Code neu geschrieben werden muss
Edit 2:
Hier nochmal kleines Beispiel was man im Plugin dann so anstellen kann






